Commit b517d0c9 by qinjianhui

Merge branch 'dev' into 'master'

Dev

See merge request !10
parents 03336ad7 76a2385e
......@@ -5,6 +5,8 @@ import {
SearchForm,
Tab,
LogListData,
ProductionClient,
WarehouseListData,
} from '@/types/api/podUsOrder'
import axios from './axios'
import { PodMakeOrderData } from '@/types/api/podMakeOrder'
......@@ -42,10 +44,18 @@ export function getCardOrderList(
},
)
}
export function confirmOrderApi(data: number[]) {
export function confirmOrderApi(data: number[], productionClient: string) {
return axios.post<never, BaseRespData<never>>(
'factory/podJomallOrderUs/confirmOrders',
data,
{
ids: data.join(','),
productionClient,
},
)
}
export function getProductionClientApi() {
return axios.get<never, BaseRespData<ProductionClient[]>>(
'factory/podJomallOrderUs/getProductionClientList',
)
}
export function updateExceptionOrderApi(data: number[]) {
......@@ -110,6 +120,42 @@ export function printProductionOrderApi(orderIds: number[]) {
orderIds,
)
}
export function printPrintOrderApi(
orderIds: number[],
productionClient: string,
) {
return axios.post<never, BaseRespData<string>>(
'factory/podJomallOrderUs/printPickPdf',
{
ids: orderIds.join(','),
productionClient,
},
)
}
export function printPickingOrderApi(
orderIds: number[],
productionClient: string,
) {
return axios.post<never, BaseRespData<string>>(
'factory/podJomallOrderUs/pickingComplete',
{
ids: orderIds.join(','),
productionClient,
},
)
}
export function stockOutCheckApi(orderIds: number[]) {
return axios.get<never, BaseRespData<number[]>>(
`factory/podJomallOrderUs/replenishVerify?ids=${orderIds.join(',')}`,
)
}
export function toBeConfirmedApi(orderIds: number[]) {
return axios.get<never, BaseRespData<never>>(
`factory/podJomallOrderUs/updateStockOutOrderToWaitConfirmed?ids=${orderIds.join(
',',
)}`,
)
}
export function getOrderDetailById(id: number) {
return axios.get<never, BaseRespData<ProductList>>(
`factory/podJomallOrderProductUs/getProductUsById?id=${id}`,
......@@ -119,6 +165,7 @@ export function getPackingDataApi(
code: string,
factoryNo: number,
box: number | null,
warehouseId: number | string,
) {
return axios.get<never, BaseRespData<PodMakeOrderData>>(
'/factory/podJomallOrderUs/getPodBoxDetailsBySkuOrNo',
......@@ -127,15 +174,19 @@ export function getPackingDataApi(
podJomallUsNo: code,
box,
factoryNo,
warehouseId,
},
},
)
}
export function getPodBoxListApi(factoryNo: number | string) {
export function getPodBoxListApi(
factoryNo: number | string,
warehouseId: number | string,
) {
return axios.get<never, BaseRespData<PodMakeOrderData[]>>(
'factory/podJomallOrderUs/getPodBoxOrderDetails',
{
params: { factoryNo },
params: { factoryNo, warehouseId },
},
)
}
......@@ -143,9 +194,10 @@ export function getPodBoxListApi(factoryNo: number | string) {
export function submitInspectionApi(
data: { id: number; version?: number }[],
boxIndex: number | null,
warehouseId: number | string,
) {
return axios.post<never, BaseRespData<never>>(
`factory/podJomallOrderUs/podPrintOrderComplete?box=${boxIndex}`,
`factory/podJomallOrderUs/podPrintOrderComplete?box=${boxIndex}&warehouseId=${warehouseId}`,
{
orderParamList: data,
},
......@@ -170,3 +222,8 @@ export function updateRemarkApi(id: number, content: string) {
{ id, content },
)
}
export function loadWarehouseListApi() {
return axios.get<never, BaseRespData<WarehouseListData[]>>(
'factoryWarehouseInfo/getAll',
)
}
......@@ -90,9 +90,21 @@ defineProps({
})
const attrs = useAttrs()
const slots = useSlots() as Record<string, Slot>
const setCurrentRow = (row: T) => {
tableRef.value?.setCurrentRow(row)
}
const toggleRowSelection = (row: T, selected: boolean = true) => {
tableRef.value?.toggleRowSelection(row, selected)
}
const clearSelection = () => {
tableRef.value?.clearSelection()
}
defineExpose({
tableRef,
setCurrentRow,
toggleRowSelection,
clearSelection,
})
</script>
......
......@@ -43,4 +43,5 @@ export interface ProductList {
count?: number
power?: boolean
variantImage?: string
podJomallUsNo?: string
}
......@@ -110,6 +110,10 @@ export interface LogListData {
deleteContent: string
createTime: string
}
export interface ProductionClient {
code?: string
remark?: string
}
export interface PodOrderRes extends ProductList {
expectDeliveryTime?: string | null
thirdOrderNumber?: string | null
......@@ -124,3 +128,13 @@ export interface PodOrderRes extends ProductList {
note?: Array<{ prop: string | number; value: string | number }>
imgList: cardImages[]
}
export interface WarehouseListData {
code?: string
defaulted?: number
factoryCode?: string
factoryId?: number
id: number
name?: string
remarks?: string
sort?: number
}
......@@ -472,7 +472,7 @@
>
<span>工艺:</span>
<span
:title="String(cardItem?.process)"
:title="String(cardItem?.processName)"
style="
display: inline-block;
width: 100%;
......@@ -480,8 +480,8 @@
text-overflow: ellipsis;
"
>
{{ cardItem?.process }}
</span>
{{ cardItem?.processName }}
</span>
</el-col>
<el-col
:span="12"
......
......@@ -36,6 +36,21 @@
/>
</ElSelect>
</div>
<div class="form-item">
<ElSelect
v-model="warehouseId"
placeholder="请选择仓库"
style="width: 200px"
@change="handleWarehouseChange"
>
<ElOption
v-for="item in warehouseList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</ElSelect>
</div>
<div class="form-item" style="flex: 1">
<ElInput
ref="productionOrderRef"
......@@ -207,12 +222,14 @@ import {
import useUserStore from '@/store/user'
import { Check } from '@element-plus/icons-vue'
import socket from '@/utils/websocket'
import { WarehouseListData } from '@/types/api/podUsOrder'
const { getCLodop } = useLodop()
const props = defineProps<{
modelValue: boolean
printOrder: (data: OrderData, callback: (status: boolean) => void) => void
warehouseList: WarehouseListData[]
}>()
const emit = defineEmits(['update:modelValue', 'set-printer', 'refresh'])
const visible = computed({
......@@ -294,6 +311,8 @@ watch(visible, async (value: boolean) => {
if (value) {
podOrderDetailsData.value = {}
currentCode = ''
warehouseId.value = props.warehouseList[0].id
_warehouseId.value = props.warehouseList[0].id
if (userStore.user?.factory.id) {
try {
await socket.init(
......@@ -306,11 +325,13 @@ watch(visible, async (value: boolean) => {
socket.send({
code: 'STARTORDER',
factoryNo: userStore.user?.factory.id,
warehouseId: warehouseId.value,
})
} catch (error) {
console.error(error)
}
}
initOrderDetailBox()
initPrintDevice()
} else {
......@@ -318,6 +339,7 @@ watch(visible, async (value: boolean) => {
socket.send({
code: 'ENDORDER',
factoryNo: userStore.user?.factory.id,
warehouseId: warehouseId.value,
})
socket.close()
}
......@@ -382,7 +404,7 @@ const renderItemBox = (bool: boolean) => {
}
if (currentCode) {
for (const product of productList) {
if (product.podJomallNo === currentCode) {
if (product.podJomallUsNo === currentCode) {
coverImage.value = product.variantImage || ''
nextTick(() => {
tableRef.value?.setCurrentRow(product)
......@@ -500,7 +522,12 @@ const getPackingData = async (code: string) => {
productionOrder.value = ''
return
}
const res = await getPackingDataApi(code, factoryNo, boxIndex.value)
const res = await getPackingDataApi(
code,
factoryNo,
boxIndex.value,
warehouseId.value,
)
if (res.code !== 200) {
ElMessage.warning(res.message)
isLock.value = false
......@@ -535,7 +562,11 @@ const submitInspection = async (callback: () => void) => {
]
: []
try {
const res = await submitInspectionApi(data, boxIndex.value)
const res = await submitInspectionApi(
data,
boxIndex.value,
warehouseId.value,
)
if (res.code !== 200) return
ElMessage.warning(res.message)
isLock.value = false
......@@ -560,7 +591,7 @@ const initOrderDetailBox = async () => {
fullscreen: true,
})
try {
const res = await getPodBoxListApi(factoryNo)
const res = await getPodBoxListApi(factoryNo, warehouseId.value)
if (res.code !== 200) {
ElMessage.warning(res.message)
return
......@@ -814,6 +845,26 @@ const handleCurrentChange = (row: ProductList) => {
coverImage.value = row.variantImage || ''
}
}
const warehouseId = ref<string | number>('')
const _warehouseId = ref<string | number>('')
const handleWarehouseChange = (value: string | number) => {
if (!value) return
if (_warehouseId.value !== warehouseId.value) {
socket.send({
code: 'ENDORDER',
factoryNo: userStore.user?.factory.id,
warehouseId: _warehouseId.value,
})
}
warehouseId.value = value
socket.send({
code: 'STARTORDER',
factoryNo: userStore.user?.factory.id,
warehouseId: warehouseId.value,
})
_warehouseId.value = value
initOrderDetailBox()
}
</script>
<style scoped lang="scss">
......
......@@ -137,6 +137,16 @@
打印生产单
</ElButton>
</span>
<span v-if="status === 'PICKING'" class="item">
<ElButton type="success" @click="printPickingOrder">
打印拣货单
</ElButton>
</span>
<span v-if="status === 'PICKING'" class="item">
<ElButton type="warning" @click="pickingComplete">
拣胚完成
</ElButton>
</span>
<span v-if="status === 'TO_BE_CONFIRMED'" class="item">
<ElButton type="warning" @click="changeExceptionOrder">
转为异常单
......@@ -161,6 +171,14 @@
<span v-if="status === 'WAIT_SHIPMENT'" class="item">
<ElButton type="warning" @click="printPodOrder"> POD打单 </ElButton>
</span>
<span v-if="status === 'STOCK_OUT'" class="item">
<ElButton type="warning" @click="stockOutCheck"> 补货校验 </ElButton>
</span>
<span v-if="status === 'STOCK_OUT'" class="item">
<ElButton type="success" @click="toBeConfirmed">
转至待确认
</ElButton>
</span>
<span class="item">
<ElButton type="primary" @click="downloadMaterial">下载素材</ElButton>
</span>
......@@ -172,12 +190,14 @@
class="table-wrapper flex-1 flex-column overflow-hidden"
>
<TableView
ref="tableRef"
:columns="tableColumns"
:stripe="true"
:serial-numberable="true"
:selectionable="true"
:paginated-data="tableData"
:cell-style="onCellStyle"
:row-style="getRowStyle"
@selection-change="handleSelectionChange"
>
<template #goods="{ row }">
......@@ -216,6 +236,12 @@
><DocumentCopy
/></el-icon>
</div>
<div class="goods-item-info-item">
<span class="goods-item-info-item-label">工艺:</span>
<span class="goods-item-info-item-value">
{{ item.craftName }}
</span>
</div>
<div class="goods-item-info-item">
<span class="goods-item-info-item-label">备注:</span>
......@@ -270,6 +296,12 @@
{{ item.factoryCode }}
</span>
</div>
<div class="goods-item-info-item">
<span class="goods-item-info-item-label">货号:</span>
<span class="goods-item-info-item-value">
{{ item.thirdSkuCode }}
</span>
</div>
</div>
<div class="goods-item-info">
<div class="goods-item-info-item">
......@@ -285,11 +317,18 @@
</span>
</div>
<div class="goods-item-info-item">
<span class="goods-item-info-item-label">工艺金额:</span>
<span class="goods-item-info-item-value">
{{ item.craftPrice }}()
</span>
</div>
<div class="goods-item-info-item">
<span class="goods-item-info-item-label">付款金额:</span>
<span class="goods-item-info-item-value">
{{ item.payAmount }}()
</span>
</div>
<div class="goods-item-info-item">
<span class="goods-item-info-item-label">{{
status === 'TO_BE_CONFIRMED'
......@@ -611,9 +650,37 @@
<PodMakeOrder
v-model="podOrderVisible"
:print-order="printOrder"
:warehouse-list="warehouseList"
@set-printer="handlePrinterChange"
@refresh="onFastRefresh"
/>
<ElDialog
v-model="productionClientVisible"
title="生产端"
width="600px"
:close-on-click-modal="false"
>
<div class="production-client">
<ElSelect
v-model="productionClientValue"
clearable
placeholder="请选择生产端"
>
<ElOption
v-for="(item, index) in productionClient"
:key="index"
:value="item.code"
:label="`${item.remark}(${item.code})`"
></ElOption>
</ElSelect>
</div>
<template #footer>
<div class="dialog-footer">
<ElButton @click="productionClientVisible = false">取消</ElButton>
<ElButton type="primary" @click="submit">确认</ElButton>
</div>
</template>
</ElDialog>
</template>
<script setup lang="ts">
import { getUserMarkList } from '@/api/common'
......@@ -630,14 +697,22 @@ import {
printProductionOrderApi,
getOrderDetailById,
updateRemarkApi,
getProductionClientApi,
printPickingOrderApi,
printPrintOrderApi,
stockOutCheckApi,
toBeConfirmedApi,
loadWarehouseListApi,
} from '@/api/podUsOrder'
import TableView from '@/components/TableView.vue'
import {
LogListData,
PodUsOrderListData,
ProductList,
ProductionClient,
SearchForm,
Tab,
WarehouseListData,
cardImages,
} from '@/types/api/podUsOrder'
import usePageList from '@/utils/hooks/usePageList'
......@@ -645,7 +720,7 @@ import { useValue } from '@/utils/hooks/useValue'
import { showConfirm } from '@/utils/ui'
import { DocumentCopy, EditPen } from '@element-plus/icons-vue'
import { Column } from 'element-plus'
import { computed, onMounted, ref } from 'vue'
import { computed, onMounted, ref, nextTick } from 'vue'
import FastProduction from './FastProduction.vue'
import { filePath } from '@/api/axios'
import PodMakeOrder from './PodMakeOrder.vue'
......@@ -807,6 +882,10 @@ const rightClick = (e: MouseEvent) => {
const handleSelectionChange = (val: PodUsOrderListData[]) => {
selection.value = val
// 只在手动清空选择时,且当前没有补货成功的行时,才清除补货成功状态
if (val.length === 0 && stockOutSuccessIds.value.length === 0) {
stockOutSuccessIds.value = []
}
}
const changeTab = (item: Tab) => {
status.value = item.status || ''
......@@ -912,24 +991,48 @@ const handleUpdateRemark = async (item: ProductList) => {
}
})
}
const productionClientValue = ref('')
const productionClient = ref<ProductionClient[]>()
const productionClientVisible = ref(false)
let confirmBtn = false
let pickingBtn = false
let printBtn = false
const confirmOrder = async () => {
if (selection.value.length === 0) {
return ElMessage.warning('请选择数据')
}
confirmBtn = true
pickingBtn = false
printBtn = false
productionClientValue.value = ''
productionClientVisible.value = true
}
const loadProductionClient = async () => {
try {
await showConfirm('确定确认吗?', {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
})
} catch {
return
const res = await getProductionClientApi()
if (res.code !== 200) return
productionClient.value = res.data
} catch (e) {
console.error(e)
}
}
const submit = async () => {
if (confirmBtn) {
await submitConfirm()
} else if (printBtn) {
await submitPrintPickingOrder()
} else if (pickingBtn) {
await submitPickingOrder()
}
}
const submitConfirm = async () => {
const ids = selection.value.map((item) => item.id)
try {
const res = await confirmOrderApi(ids)
const res = await confirmOrderApi(ids, productionClientValue.value)
if (res.code !== 200) return
ElMessage.success('操作成功')
productionClientVisible.value = false
confirmBtn = false
search()
loadTabData()
} catch (e) {
......@@ -970,12 +1073,59 @@ const printProductionOrder = async () => {
if (res.code !== 200) return
ElMessage.success('操作成功')
window.open(filePath + res.message)
} catch (e) {
console.error(e)
}
}
const printPickingOrder = async () => {
if (selection.value.length === 0) {
return ElMessage.warning('请选择数据')
}
pickingBtn = false
printBtn = true
confirmBtn = false
productionClientVisible.value = true
productionClientValue.value = ''
}
const pickingComplete = async () => {
if (selection.value.length === 0) {
return ElMessage.warning('请选择数据')
}
pickingBtn = true
printBtn = false
confirmBtn = false
productionClientVisible.value = true
productionClientValue.value = ''
}
const submitPrintPickingOrder = async () => {
const orderIds = selection.value.map((item) => item.id)
try {
const res = await printPrintOrderApi(orderIds, productionClientValue.value)
if (res.code !== 200) return
ElMessage.success('操作成功')
window.open(filePath + res.message)
printBtn = false
} catch (e) {
console.error(e)
}
}
const submitPickingOrder = async () => {
const orderIds = selection.value.map((item) => item.id)
try {
const res = await printPickingOrderApi(
orderIds,
productionClientValue.value,
)
if (res.code !== 200) return
ElMessage.success('操作成功')
search()
loadTabData()
printBtn = false
} catch (e) {
console.error(e)
}
}
const changeExceptionOrder = async () => {
if (selection.value.length === 0) {
return ElMessage.warning('请选择数据')
......@@ -1123,6 +1273,81 @@ const printPodOrder = async () => {
sheetPrinter.value = lodop.GET_PRINTER_NAME(0)
podOrderVisible.value = true
}
// 添加补货成功行的状态
const stockOutSuccessIds = ref<number[]>([])
const stockOutCheck = async () => {
if (selection.value.length === 0) {
return ElMessage.warning('请选择数据')
}
try {
const selectedIds = selection.value.map((item) => item.id)
const res = await stockOutCheckApi(selectedIds)
if (res.code !== 200) return
const successIds = res.data || []
if (successIds.length === 0) {
ElMessage.warning('未补到货')
return
}
ElMessage.success('操作成功')
const { success, others } = (
tableData.value as PodUsOrderListData[]
).reduce(
(acc, item) => {
successIds.includes(item.id)
? acc.success.push(item)
: acc.others.push(item)
return acc
},
{
success: [] as PodUsOrderListData[],
others: [] as PodUsOrderListData[],
},
)
tableData.value = [...success, ...others]
// 更新补货成功的行ID
stockOutSuccessIds.value = successIds
// 等待DOM更新后再设置选中状态
await nextTick()
// 清除所有选中状态
tableRef.value?.clearSelection()
// 选中补货成功的行
success.forEach((row) => {
tableRef.value?.toggleRowSelection(row, true)
})
} catch (error) {
console.error('补货校验失败:', error)
}
}
const toBeConfirmed = async () => {
if (selection.value.length === 0) {
return ElMessage.warning('请选择数据')
}
try {
await ElMessageBox.confirm('确定转至待确认吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
} catch (e) {
return
}
try {
const res = await toBeConfirmedApi(selection.value.map((item) => item.id))
if (res.code !== 200) return
ElMessage.success('操作成功')
search()
loadTabData()
} catch (e) {
console.error(e)
}
}
const sheetPrinter = ref('')
const handlePrinterChange = (value: string) => {
sheetPrinter.value = value
......@@ -1307,9 +1532,33 @@ const onFastRefresh = () => {
loadTabData()
search()
}
// 修改行样式方法
const getRowStyle = ({ row }: { row: PodUsOrderListData }) => {
if (stockOutSuccessIds.value.includes(row.id)) {
return {
backgroundColor: '#f0f9eb',
color: '#67c23a',
}
}
return {}
}
// 添加表格ref
const tableRef = ref()
const warehouseList = ref<WarehouseListData[]>([])
const loadWarehouseList = async () => {
try {
const res = await loadWarehouseListApi()
if (res.code !== 200) return
warehouseList.value = res.data
} catch (e) {
console.error(e)
}
}
onMounted(() => {
loadTabData()
getUserMark()
loadProductionClient()
loadWarehouseList()
})
</script>
<style lang="scss" scoped>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment