@@ -6,7 +6,7 @@
< view class = "fulfillment-heading" > < text class = "fulfillment-title" > 出库任务 < / text > < text class = "fulfillment-subtitle" > 整托扫描托盘码 , 散箱扫描箱唛 ; 扫描排车业务号会转入 “ 排车拣货 ” < / text > < / view >
< view v-if = "current" class="detail-toolbar"><view><text class="detail-kicker">当前任务</text><text class="detail-title">出库作业详情</text></view><button :disabled="busy" @tap="closeTask" > ‹ 返回列表 < / button > < / view >
< view class = "fulfillment-card" >
< ScanTargetInput name = "outbound" :model-value = "scanCode" : label = "di scardCurrent ? '废弃订单托盘码' : '任务号、出库单号、排车单号、托盘码或箱码'" : placeholder = "di scardCurrent ? '扫描废弃订单对应托盘码' : '扫描任务号 / 出库单号 / 排车单号 / 托盘码 / 箱码' " :active = "true" @ update :modelValue = "updateScanCode" @submit ="handleScan" / >
< ScanTargetInput name = "outbound" :model-value = "scanCode" :label = "scanLabel" :placeholder = "scanPlaceholder " :active = "true" @ update :modelValue = "updateScanCode" @submit ="handleScan" / >
< button class = "secondary-button" : disabled = "!scanCode || loading || busy || discardLoading || discardBusy" @tap ="handleScan(scanCode)" > {{ discardCurrent ? ' 打开废弃托盘 ' : current ? ' 匹配出库货物 ' : ' 打开出库任务 ' }} < / button >
< text class = "scan-help" > 任务号直接恢复 ; 退货整托出库扫托盘码 , 散箱出库扫箱唛 。 < / text >
< / view >
@@ -27,12 +27,12 @@
< view class = "fulfillment-card summary-card" > < view class = "task-head" > < text class = "business-code" > { { current . taskNo || '—' } } < / text > < text class = "status-badge" > { { statusLabel ( current . status ) } } < / text > < / view > < text class = "task-meta" > 出库单 { { current . outboundNo || '—' } } · { { taskType ( current ) } } < / text > < view class = "metrics" > < view > < text class = "metric-value" > { { plannedPackages } } < / text > < text > 计划箱数 < / text > < / view > < view > < text class = "metric-value success" > { { pickedPackages } } < / text > < text > 已拣箱数 < / text > < / view > < view > < text class = "metric-value warning" > { { remainingPackages } } < / text > < text > 待拣箱数 < / text > < / view > < / view > < / view >
< view v-if = "current.items.length" class="item-list" >
< view v-for = "item in current.i tems" :key="item.outboundPalletItemId" class="fulfillment-card item-card" >
< view v-for = "item in displayI tems" :key="item.displayKey || item.outboundPalletItemId" class="fulfillment-card item-card" >
< view class = "task-head" > < text class = "business-code" > { { item . palletNo || '散件出库' } } < / text > < text > { { item . pickedPackages } } / { { item . plannedPackages } } 箱 < / text > < / view >
< view v-for = "position in current.outboundType === 'RETURN_OUTBOUND' && item.palletNo ? [] : item.positions" :key="businessLineKey(position)" class="outbound-line" :class="{ selected: selectedPosition === position }" @tap="selectPosition(item, position)" >
< text class = "line-code" > { { lineBusinessCode ( position ) } } < / text > < text class = "line-meta" > { { position . inboundCode || '无入仓码' } } · 已拣 { { position . pickedPackages } } 箱 · 可拣 { { position . availablePackages } } 箱 < / text >
< / view >
< text v-if = "current.outboundType === 'RETURN_OUTBOUND' && item.palletNo && item.pickedPackages < item.plannedPackages" class="scan-help" > 整托出库请扫描托盘码 {{ item.palletNo }} < / text >
< text v-if = "current.outboundType === 'RETURN_OUTBOUND' && item.palletNo && item.pickedPackages < item.plannedPackages" class="scan-help" > 整托出库请扫描托盘号 {{ item.palletNo }} < / text >
< text v-if = "!item.positions.length && item.pickedPackages < item.plannedPackages" class="missing-scan-contract" > 当前明细缺少可扫码库存业务码 , 已禁止拣货 ; 请刷新或联系平台确认任务下发 。 < / text >
< / view >
< / view >
@@ -68,6 +68,28 @@
components : { PortalHeader , ScanTargetInput } ,
data ( ) { return { user : session . currentUser , tasks : [ ] , discardTasks : [ ] , current : null , discardCurrent : null , discardTask : null , discardActuals : { } , discardPalletCode : '' , discardLoading : false , discardBusy : false , selectedItem : null , selectedPosition : null , selectedScanCode : '' , scanCode : '' , loading : false , busy : false , busyAction : '' , error : null , successMessage : '' , bootstrapped : false } } ,
computed : {
displayItems ( ) {
const items = this . current ? . items || [ ]
if ( this . current ? . outboundType !== 'RETURN_OUTBOUND' ) return items
const pallets = new Map ( )
const rows = [ ]
for ( const item of items ) {
if ( ! item . palletNo ) { rows . push ( item ) ; continue }
let pallet = pallets . get ( item . palletNo )
if ( ! pallet ) {
pallet = { ... item , displayKey : ` pallet: ${ item . palletNo } ` , plannedPackages : 0 , pickedPackages : 0 , positions : [ ] }
pallets . set ( item . palletNo , pallet )
rows . push ( pallet )
}
pallet . plannedPackages += Number ( item . plannedPackages || 0 )
pallet . pickedPackages += Number ( item . pickedPackages || 0 )
pallet . positions . push ( ... ( item . positions || [ ] ) )
}
return rows
} ,
hasReturnPallet ( ) { return this . current ? . outboundType === 'RETURN_OUTBOUND' && ( this . current . items || [ ] ) . some ( item => item . palletNo ) } ,
scanLabel ( ) { return this . discardCurrent ? '废弃订单托盘码' : this . hasReturnPallet ? '扫描托盘号(退货整托出库)' : '任务号、出库单号、排车单号、托盘号或箱码' } ,
scanPlaceholder ( ) { return this . discardCurrent ? '扫描废弃订单对应托盘码' : this . hasReturnPallet ? '扫描托盘号;散箱扫描箱唛' : '扫描任务号 / 出库单号 / 排车单号 / 托盘号 / 箱码' } ,
recentTaskNo ( ) { return fulfillment . outbound . currentTaskNo || '' } ,
packages ( ) { return fulfillment . outbound . packages } ,
plannedPackages ( ) { return ( this . current ? . items || [ ] ) . reduce ( ( total , item ) => total + item . plannedPackages , 0 ) } ,