Commit 58e98b24 by wuqian

Merge branch 'master' of http://47.99.244.21:9999/qinjianhui/factory_front into wq

parents cf737d7e 2f95fa32
...@@ -21,7 +21,8 @@ ...@@ -21,7 +21,8 @@
"splitpanes": "^3.1.5", "splitpanes": "^3.1.5",
"vue": "^3.4.19", "vue": "^3.4.19",
"vue-dompurify-html": "^5.1.0", "vue-dompurify-html": "^5.1.0",
"vue-router": "^4.3.0" "vue-router": "^4.3.0",
"vue-tsc": "^2.1.10"
}, },
"devDependencies": { "devDependencies": {
"@types/splitpanes": "^2.2.6", "@types/splitpanes": "^2.2.6",
...@@ -37,7 +38,6 @@ ...@@ -37,7 +38,6 @@
"unplugin-auto-import": "^0.17.5", "unplugin-auto-import": "^0.17.5",
"unplugin-icons": "^0.18.5", "unplugin-icons": "^0.18.5",
"unplugin-vue-components": "^0.26.0", "unplugin-vue-components": "^0.26.0",
"vite": "^5.1.4", "vite": "^5.1.4"
"vue-tsc": "^1.8.27"
} }
} }
...@@ -101,12 +101,13 @@ export function getOrderBySubOrderNumber(orderNumber: string) { ...@@ -101,12 +101,13 @@ export function getOrderBySubOrderNumber(orderNumber: string) {
) )
} }
export function getQaOrderBySubOrderNumber(orderNumber: string) { export function getQaOrderBySubOrderNumber(orderNumber: string,shipmentUid?:string) {
return axios.get<never, BaseRespData<QaData[]>>( return axios.get<never, BaseRespData<QaData[]>>(
'factory/customJomallOrder/inspectionQuery', 'factory/customJomallOrder/inspectionQuery',
{ {
params: { params: {
subOrderNumber: orderNumber, subOrderNumber: orderNumber,
shipmentUid:shipmentUid,
}, },
}, },
) )
......
...@@ -196,6 +196,8 @@ export interface LogListData { ...@@ -196,6 +196,8 @@ export interface LogListData {
export interface QaData { export interface QaData {
orderNumber?: string orderNumber?: string
namespace?: string namespace?: string
scansNum?: number
shipmentUid?: string
billNumber?: string billNumber?: string
subOrderNumber?: string subOrderNumber?: string
baseSku?: string baseSku?: string
......
...@@ -81,22 +81,29 @@ ...@@ -81,22 +81,29 @@
header-align="center" header-align="center"
></el-table-column> ></el-table-column>
<el-table-column <el-table-column
label="扫描数量"
prop="scansNum"
width="80"
align="center"
header-align="center"
></el-table-column>
<el-table-column
label="质检通过" label="质检通过"
prop="passNum" prop="passNum"
width="90" width="80"
align="center" align="center"
header-align="center" header-align="center"
></el-table-column> ></el-table-column>
<el-table-column <el-table-column
label="未通过" label="未通过"
prop="notPassNum" prop="notPassNum"
width="90" width="80"
align="center" align="center"
header-align="center" header-align="center"
></el-table-column> ></el-table-column>
<el-table-column <el-table-column
label="是否质检" label="是否质检"
width="90" width="80"
align="center" align="center"
header-align="center" header-align="center"
> >
...@@ -184,7 +191,7 @@ ...@@ -184,7 +191,7 @@
<div class="left-qa-order-basic-info_item"> <div class="left-qa-order-basic-info_item">
<span class="label">发货方式:</span> <span class="label">发货方式:</span>
<span class="value"> <span class="value">
{{ currentRow.shippingWay == 1 ? '送货上门' : '快递' || '--' }} {{ currentRow.shippingWay ? currentRow.shippingWay == 1 ? '送货上门' : '快递' : '--'}}
</span> </span>
</div> </div>
<div class="left-qa-order-basic-info_item"> <div class="left-qa-order-basic-info_item">
...@@ -378,6 +385,7 @@ const { ...@@ -378,6 +385,7 @@ const {
onRowClick, onRowClick,
} = props.quarantine } = props.quarantine
const tableRowClassName = ({ row }: { row: QaData }) => { const tableRowClassName = ({ row }: { row: QaData }) => {
if (row.subOrderNumber === currentRow.value.subOrderNumber) { if (row.subOrderNumber === currentRow.value.subOrderNumber) {
return 'current-row-active' return 'current-row-active'
} else { } else {
......
...@@ -10,6 +10,7 @@ export default function useQuarantine() { ...@@ -10,6 +10,7 @@ export default function useQuarantine() {
const quarantineVisible = ref(false) const quarantineVisible = ref(false)
const qaCode = ref('') const qaCode = ref('')
const shipmentUid = ref('')
const qaInputRef = ref() const qaInputRef = ref()
const isLock = ref(false) const isLock = ref(false)
const cloneRow = ref<QaData>({} as QaData) const cloneRow = ref<QaData>({} as QaData)
...@@ -24,6 +25,8 @@ export default function useQuarantine() { ...@@ -24,6 +25,8 @@ export default function useQuarantine() {
resetOrderList() resetOrderList()
resetCurrentRow() resetCurrentRow()
dzjTotal.value = 0 dzjTotal.value = 0
shipmentUid.value = ''
qaCode.value = ''
yzjTotal.value = 0 yzjTotal.value = 0
allTotal.value = 0 allTotal.value = 0
} }
...@@ -31,7 +34,19 @@ export default function useQuarantine() { ...@@ -31,7 +34,19 @@ export default function useQuarantine() {
if (sourceData.value.length == 0) return false if (sourceData.value.length == 0) return false
return sourceData.value.some((item) => item.isCheck) return sourceData.value.some((item) => item.isCheck)
}) })
const findAllIndex = (code: string) => {
const indexList: number[] = []
sourceData.value.forEach((el, index) => {
if (el.factorySubOrderNumber === code && el.shipmentNum !== el.scansNum) {
indexList.push(index)
}
})
return indexList
}
const searchQaByOrderNumber = () => { const searchQaByOrderNumber = () => {
const uid = shipmentUid.value
const code = qaCode.value const code = qaCode.value
if (!code) { if (!code) {
isLock.value = false isLock.value = false
...@@ -45,10 +60,15 @@ export default function useQuarantine() { ...@@ -45,10 +60,15 @@ export default function useQuarantine() {
if (isLock.value) { if (isLock.value) {
qaInputRef.value.focus() qaInputRef.value.focus()
qaCode.value = '' qaCode.value = ''
shipmentUid.value = ''
return return
} }
isLock.value = true isLock.value = true
const code1 = code?.split('_')[0] const code1 = code?.split('_')[0]
const index = sourceData.value.findIndex(
(item) =>
item.factorySubOrderNumber == code1 || item.subOrderNumber == code1,
)
// 如果扫单号没有包含当前的生产单号 // 如果扫单号没有包含当前的生产单号
const isIncluned = sourceData.value.some( const isIncluned = sourceData.value.some(
(item) => (item) =>
...@@ -56,14 +76,14 @@ export default function useQuarantine() { ...@@ -56,14 +76,14 @@ export default function useQuarantine() {
) )
if (isQaed.value && !isIncluned) { if (isQaed.value && !isIncluned) {
saveQuarantine(() => { saveQuarantine(() => {
loadShipmentOrderByCode(code) loadShipmentOrderByCode(code, uid)
}) })
} else { } else {
// 如果质检未完成 // 如果质检未完成
// 查找是否已经存在 // 查找是否已经存在
const row = sourceData.value.find( const row = sourceData.value.find(
(item) => (item) =>
item.factorySubOrderNumber == code1 || item.subOrderNumber == code1, (uid === item.shipmentUid && (code1 === item.subOrderNumber || item.factorySubOrderNumber == code1)) || (!uid && (item.factorySubOrderNumber == code1 || item.subOrderNumber == code1)),
) )
if (row) { if (row) {
// 质检数量不能大于发货数量 // 质检数量不能大于发货数量
...@@ -72,6 +92,7 @@ export default function useQuarantine() { ...@@ -72,6 +92,7 @@ export default function useQuarantine() {
qaInputRef.value.focus() qaInputRef.value.focus()
isLock.value = false isLock.value = false
qaCode.value = '' qaCode.value = ''
shipmentUid.value = ''
playAudio('picking_beyond') playAudio('picking_beyond')
return ElMessage({ return ElMessage({
message: '质检数量不能大于发货数量', message: '质检数量不能大于发货数量',
...@@ -79,6 +100,23 @@ export default function useQuarantine() { ...@@ -79,6 +100,23 @@ export default function useQuarantine() {
offset: window.innerHeight / 2, offset: window.innerHeight / 2,
}) })
} }
const len = sourceData.value.filter(el => el.factorySubOrderNumber == code1 || code1 === el.subOrderNumber)
const scansNum = sourceData.value[index].scansNum || 0
const indexList = findAllIndex(code1)
if (len.length > 1) {
sourceData.value.forEach((el, i) => {
console.log(el)
if (indexList.length > 0 && i === indexList[0]) {
sourceData.value[i]['scansNum'] = scansNum + 1
}
})
} else {
if (row.shipmentNum !== scansNum) {
sourceData.value[index]['scansNum'] = scansNum + 1
}
}
playAudio('picking_check_success') playAudio('picking_check_success')
// row.passNum = row.shipmentNum // row.passNum = row.shipmentNum
qaInputRef.value.focus() qaInputRef.value.focus()
...@@ -86,29 +124,34 @@ export default function useQuarantine() { ...@@ -86,29 +124,34 @@ export default function useQuarantine() {
cloneRow.value = JSON.parse(JSON.stringify(currentRow.value)) cloneRow.value = JSON.parse(JSON.stringify(currentRow.value))
isLock.value = false isLock.value = false
qaCode.value = '' qaCode.value = ''
shipmentUid.value = ''
} else { } else {
loadShipmentOrderByCode(code) loadShipmentOrderByCode(code, uid)
} }
} }
} }
const loadShipmentOrderByCode = async (code: string) => { const loadShipmentOrderByCode = async (code: string, uid: string) => {
try { try {
const res = await getQaOrderBySubOrderNumber(code) const res = await getQaOrderBySubOrderNumber(code, uid)
const code1 = code?.split('_')[0] const code1 = code?.split('_')[0]
res.data = res.data.map((item) => { res.data = res.data.map((item: QaData) => {
return { return {
...item, ...item,
scansNum: item.inspectionStatus ? item.passNum : 0,
isCheck: item.inspectionStatus, isCheck: item.inspectionStatus,
} }
}) })
// 删除旧的inspectionStatus // 删除旧的inspectionStatus
res.data = res.data.map(({ inspectionStatus, ...rest }) => rest) res.data = res.data.map(({ inspectionStatus, ...rest }) => {
console.log(inspectionStatus)
return rest
})
res.data.sort((a, b) => res.data.sort((a, b) =>
a.isCheck === b.isCheck ? 0 : a.isCheck ? 1 : -1, a.isCheck === b.isCheck ? 0 : a.isCheck ? 1 : -1,
) //false在前,true在后 ) //false在前,true在后
activeTab.value = 'all' activeTab.value = 'all'
sourceData.value = res.data sourceData.value = sourceData.value.concat(res.data)
_sourceData.value = res.data _sourceData.value = _sourceData.value.concat(res.data)
allTotal.value = _sourceData.value.length allTotal.value = _sourceData.value.length
dzjTotal.value = res.data.filter( dzjTotal.value = res.data.filter(
(e) => (e) =>
...@@ -120,27 +163,38 @@ export default function useQuarantine() { ...@@ -120,27 +163,38 @@ export default function useQuarantine() {
Number(e.shipmentNum || 0) === Number(e.shipmentNum || 0) ===
Number(e.passNum || 0) + Number(e.notPassNum || 0), Number(e.passNum || 0) + Number(e.notPassNum || 0),
).length ).length
const row = sourceData.value.find( const row = sourceData.value.find(item => {
(item) => return (uid === item.shipmentUid && (code1 === item.subOrderNumber || item.factorySubOrderNumber == code1)) || (!uid && (item.factorySubOrderNumber == code1 || item.subOrderNumber == code1))
item.factorySubOrderNumber == code1 || item.subOrderNumber == code1, })
) const index = sourceData.value.findIndex(item => {
return (uid === item.shipmentUid && (code1 === item.subOrderNumber || item.factorySubOrderNumber == code1)) || (!uid && (item.factorySubOrderNumber == code1 || item.subOrderNumber == code1))
})
if (row) { if (row) {
// row.passNum += 1 // row.passNum += 1
currentRow.value = row currentRow.value = row
cloneRow.value = JSON.parse(JSON.stringify(currentRow.value)) cloneRow.value = JSON.parse(JSON.stringify(currentRow.value))
if (!row.inspectionStatus && !sourceData.value[index].scansNum) sourceData.value[index].scansNum = 1
} }
qaInputRef.value.focus() qaInputRef.value.focus()
isLock.value = false isLock.value = false
qaCode.value = '' qaCode.value = ''
shipmentUid.value = ''
playAudio('picking_search_success') playAudio('picking_search_success')
} catch (e) { } catch (e) {
qaInputRef.value.focus() qaInputRef.value.focus()
isLock.value = false isLock.value = false
qaCode.value = '' qaCode.value = ''
shipmentUid.value = ''
// showError(e) // showError(e)
playAudio('picking_search_error') playAudio('picking_search_error')
} }
} }
const toSaveQuarantine = async () => {
await saveQuarantine(() => {
sourceData.value = []
_sourceData.value = []
})
}
// 质检完成 // 质检完成
const saveQuarantine = async (callback?: () => void) => { const saveQuarantine = async (callback?: () => void) => {
try { try {
...@@ -157,10 +211,11 @@ export default function useQuarantine() { ...@@ -157,10 +211,11 @@ export default function useQuarantine() {
remark: item.remark || '', remark: item.remark || '',
})) }))
await qaFinishedApi(data) await qaFinishedApi(data)
sourceData.value = [] // sourceData.value = []
isLock.value = false isLock.value = false
qaInputRef.value.focus() qaInputRef.value.focus()
qaCode.value = '' qaCode.value = ''
shipmentUid.value = ''
currentRow.value = {} currentRow.value = {}
cloneRow.value = JSON.parse(JSON.stringify(currentRow.value)) cloneRow.value = JSON.parse(JSON.stringify(currentRow.value))
allTotal.value = 0 allTotal.value = 0
...@@ -316,6 +371,7 @@ export default function useQuarantine() { ...@@ -316,6 +371,7 @@ export default function useQuarantine() {
return { return {
quarantineVisible, quarantineVisible,
qaCode, qaCode,
shipmentUid,
qaInputRef, qaInputRef,
allTotal, allTotal,
dzjTotal, dzjTotal,
...@@ -326,6 +382,7 @@ export default function useQuarantine() { ...@@ -326,6 +382,7 @@ export default function useQuarantine() {
confirmCheck, confirmCheck,
searchQaByOrderNumber, searchQaByOrderNumber,
saveQuarantine, saveQuarantine,
toSaveQuarantine,
onQaDialogOpened, onQaDialogOpened,
onChangeTab, onChangeTab,
onSuccessQc, onSuccessQc,
......
import { getOrderBySubOrderNumber, saveOrder } from '@/api/order' import { getOrderBySubOrderNumber, saveOrder } from '@/api/order'
import { import { ICompareObjects, OrderData, ProductList, ShipmentForm, ShipmentOrderRes } from '@/types/api/order'
OrderData,
ProductList,
ShipmentForm,
ShipmentOrderRes,
ICompareObjects,
} from '@/types/api/order'
import { useValue } from '@/utils/hooks/useValue' import { useValue } from '@/utils/hooks/useValue'
import { nextTick, ref } from 'vue' import { nextTick, ref } from 'vue'
import { ShipmentType } from '../Shipment.vue' import { ShipmentType } from '../Shipment.vue'
export default function useShipment(callback?: () => void) { export default function useShipment(callback?: () => void) {
const [orderList, resetOrderList] = useValue<OrderData[]>([]) const [orderList, resetOrderList] = useValue<OrderData[]>([])
const [shipmentForm, resetShipmentForm] = useValue<ShipmentForm>({ const [shipmentForm, resetShipmentForm] = useValue<ShipmentForm>({
...@@ -57,14 +52,15 @@ export default function useShipment(callback?: () => void) { ...@@ -57,14 +52,15 @@ export default function useShipment(callback?: () => void) {
(rowData.shipmentNum || 0) + (rowData.shipmentNum || 0) +
(rowData.notPassNum || 0) (rowData.notPassNum || 0)
if (unShipmentNum > (rowData.count || 0)) { if (unShipmentNum > (rowData.count || 0)) {
rowData.count = unShipmentNum rowData.count = (rowData.count || 0) + 1
playAudio('picking_check_success') playAudio('picking_check_success')
if (+rowData.count > 1) { // if (+rowData.count > 1) {
ElMessageBox.confirm(`该产品未发数为${rowData.count}件`, '重要提示', { // ElMessageBox.confirm(`该产品未发数为${rowData.count}件`, '重要提示', {
confirmButtonText: '确定', // confirmButtonText: '确定',
type: 'warning', // type: 'warning',
}).catch(() => {}) // }).catch(() => {
} // })
// }
} else { } else {
playAudio('picking_beyond') playAudio('picking_beyond')
ElMessage({ ElMessage({
...@@ -102,7 +98,8 @@ export default function useShipment(callback?: () => void) { ...@@ -102,7 +98,8 @@ export default function useShipment(callback?: () => void) {
ElMessageBox.confirm('不能加入,地址信息不一致!', '重要提示', { ElMessageBox.confirm('不能加入,地址信息不一致!', '重要提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
type: 'warning', type: 'warning',
}).catch(() => {}) }).catch(() => {
})
} else { } else {
canJoin(res.data, code) canJoin(res.data, code)
} }
...@@ -121,20 +118,20 @@ export default function useShipment(callback?: () => void) { ...@@ -121,20 +118,20 @@ export default function useShipment(callback?: () => void) {
shipmentLoading.value = false shipmentLoading.value = false
} }
} }
const canJoin = async (data: any, code: string) => { const canJoin = async (data: OrderData, code: string) => {
const code1 = code?.split('_')[0] const code1 = code?.split('_')[0]
for (const item of data.productList || []) { for (const item of data.productList || []) {
item.count = 0 item.count = 0
if (item.subOrderNumber === code1) { if (item.subOrderNumber === code1) {
item.count = item.count = 1
(item.num || 0) - ((item.shipmentNum || 0) - (item.notPassNum || 0))
if (+item.count > 1) { // if (+item.count > 1) {
ElMessageBox.confirm(`该产品未发数为${item.count}件`, '重要提示', { // ElMessageBox.confirm(`该产品未发数为${item.count}件`, '重要提示', {
confirmButtonText: '确定', // confirmButtonText: '确定',
type: 'warning', // type: 'warning',
}).catch(() => {}) // }).catch(() => {
} // })
// }
currentRow.value = item currentRow.value = item
if (currentRow.value) { if (currentRow.value) {
...@@ -215,7 +212,26 @@ export default function useShipment(callback?: () => void) { ...@@ -215,7 +212,26 @@ export default function useShipment(callback?: () => void) {
}) })
try { try {
const res = await saveOrder(data, shipmentForm.value) const res = await saveOrder(data, shipmentForm.value)
ElMessage.success(res.message) fetch(res.message || '')
.then(response => {
// 确保响应是 OK
if (!response.ok) {
throw new Error('网络响应错误')
}
// 返回图片的二进制数据(Blob)
return response.blob()
})
.then(blob => {
const a = document.createElement('a')
a.href = window.URL.createObjectURL(blob)
a.target = '_blank'
a.download = (res.message as string).split('/')[ (res.message as string).split('/').length - 1]
a.click()
})
.catch(error => {
console.error('下载图片时出错:', error)
})
ElMessage.success('发货成功')
shipmentVisible.value = false shipmentVisible.value = false
callback && callback() callback && callback()
} catch (e) { } catch (e) {
......
...@@ -503,6 +503,16 @@ ...@@ -503,6 +503,16 @@
}}</span> }}</span>
</div> </div>
<div <div
v-if="scope.row.shipmentUid"
:title="scope.row.shipmentUid"
class="order-detail_item"
>
<span class="label">提货码:</span>
<span class="value" :title="scope.row.shipmentUid">{{
scope.row.shipmentUid
}}</span>
</div>
<div
:title="scope.row.lanshouPost" :title="scope.row.lanshouPost"
class="order-detail_item" class="order-detail_item"
> >
...@@ -696,6 +706,14 @@ ...@@ -696,6 +706,14 @@
row.lanshouRegion + row.lanshouAddress row.lanshouRegion + row.lanshouAddress
}}</span> }}</span>
</div> </div>
<div class="order-list-expand_item_info_title">
<span class="order-list-expand_item_label"
>提货码:</span
>
<span class="order-list-expand_item_value">{{
row.shipmentUid
}}</span>
</div>
</div> </div>
</div> </div>
<div class="order-operate"> <div class="order-operate">
...@@ -864,6 +882,12 @@ ...@@ -864,6 +882,12 @@
> >
<div class="header-search"> <div class="header-search">
<el-input <el-input
v-model="shipmentUid"
style="width: 300px;"
placeholder="请输入提货码"
size="large"
clearable />
<el-input
ref="qaInputRef" ref="qaInputRef"
v-model="qaCode" v-model="qaCode"
clearable clearable
...@@ -881,7 +905,7 @@ ...@@ -881,7 +905,7 @@
<el-button size="large" @click="quarantineVisible = false" <el-button size="large" @click="quarantineVisible = false"
>取消 >取消
</el-button> </el-button>
<el-button size="large" type="primary" @click="() => saveQuarantine()" <el-button size="large" type="primary" @click="() => toSaveQuarantine()"
>质检完成 >质检完成
</el-button> </el-button>
</div> </div>
...@@ -1187,8 +1211,10 @@ const { ...@@ -1187,8 +1211,10 @@ const {
quarantineVisible, quarantineVisible,
qaInputRef, qaInputRef,
qaCode, qaCode,
shipmentUid,
searchQaByOrderNumber, searchQaByOrderNumber,
saveQuarantine, saveQuarantine,
toSaveQuarantine,
confirmCheck, confirmCheck,
onQaDialogOpened, onQaDialogOpened,
} = quarantine } = quarantine
......
...@@ -257,6 +257,7 @@ const getStatusList = async () => { ...@@ -257,6 +257,7 @@ const getStatusList = async () => {
treeData.value[0].children = res.data.slice(1) treeData.value[0].children = res.data.slice(1)
nextTick(() => { nextTick(() => {
treeRef.value.setCurrentKey(treeId.value, true) treeRef.value.setCurrentKey(treeId.value, true)
}) })
} catch (e) { } catch (e) {
console.error(e) console.error(e)
......
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