fix(dispatch): surface departure gate
This commit is contained in:
@@ -24,6 +24,8 @@ export function normalizeDispatchTask(value) {
|
|||||||
dispatchNo: String(value?.dispatchNo || ''),
|
dispatchNo: String(value?.dispatchNo || ''),
|
||||||
vehiclePlate: String(value?.vehiclePlate || ''),
|
vehiclePlate: String(value?.vehiclePlate || ''),
|
||||||
status: String(value?.status || ''),
|
status: String(value?.status || ''),
|
||||||
|
canDepart: value?.canDepart === true,
|
||||||
|
departBlockReason: String(value?.departBlockReason || ''),
|
||||||
items: asList(value?.items).map((item) => ({
|
items: asList(value?.items).map((item) => ({
|
||||||
...item,
|
...item,
|
||||||
dispatchItemId: String(item?.dispatchItemId || ''),
|
dispatchItemId: String(item?.dispatchItemId || ''),
|
||||||
|
|||||||
@@ -69,7 +69,8 @@
|
|||||||
<text class="card-title">发车门禁</text>
|
<text class="card-title">发车门禁</text>
|
||||||
<text v-if="!allPicked" class="gate-warning">服务端仍显示 {{ remainingPackages }} 箱未拣,不允许发车。</text>
|
<text v-if="!allPicked" class="gate-warning">服务端仍显示 {{ remainingPackages }} 箱未拣,不允许发车。</text>
|
||||||
<text v-else-if="departed" class="gate-success">该排车任务已执行发车,不可重复提交。</text>
|
<text v-else-if="departed" class="gate-success">该排车任务已执行发车,不可重复提交。</text>
|
||||||
<text v-else class="gate-note">拣货已完成且全部箱数核平,服务端将再次校验出库单和托盘门禁。</text>
|
<text v-else-if="!current.canDepart" class="gate-warning">{{ current.departBlockReason || '当前排车暂不满足发车条件,请刷新后重试。' }}</text>
|
||||||
|
<text v-else class="gate-note">拣货已完成且全部箱数核平,可以发车。</text>
|
||||||
<button v-if="!departed" class="depart-button" :disabled="!canDepart || busy" @tap="depart">{{ busyAction === 'depart' ? '发车中…' : '确认发车' }}</button>
|
<button v-if="!departed" class="depart-button" :disabled="!canDepart || busy" @tap="depart">{{ busyAction === 'depart' ? '发车中…' : '确认发车' }}</button>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
@@ -108,7 +109,7 @@
|
|||||||
canPick() { return this.selectedPosition && Number(this.packages) > 0 && Number(this.packages) <= this.selectedRemaining && !this.pickingCompleted },
|
canPick() { return this.selectedPosition && Number(this.packages) > 0 && Number(this.packages) <= this.selectedRemaining && !this.pickingCompleted },
|
||||||
canCompleteStage() { return Boolean(this.current) && !this.pickingCompleted },
|
canCompleteStage() { return Boolean(this.current) && !this.pickingCompleted },
|
||||||
canComplete() { return this.plannedPackages > 0 && this.remainingPackages === 0 },
|
canComplete() { return this.plannedPackages > 0 && this.remainingPackages === 0 },
|
||||||
canDepart() { return this.pickingCompleted && this.allPicked && !this.departed }
|
canDepart() { return this.pickingCompleted && this.allPicked && this.current?.canDepart === true && !this.departed }
|
||||||
},
|
},
|
||||||
onShow() {
|
onShow() {
|
||||||
if (!requireSession()) return
|
if (!requireSession()) return
|
||||||
|
|||||||
@@ -78,10 +78,12 @@ test('fulfillment API calls the frozen list detail pick complete and depart rout
|
|||||||
})
|
})
|
||||||
|
|
||||||
test('dispatch and outbound adapters retain stable business identifiers and count progress', () => {
|
test('dispatch and outbound adapters retain stable business identifiers and count progress', () => {
|
||||||
const dispatch = normalizeDispatchTask({ taskNo: 'DPT-1', dispatchNo: 'DSP-1', items: [{ dispatchItemId: 8, palletNo: 'PLT-1', scheduledPackages: 5, pickedPackages: 2, positions: [{ id: 9, availablePackages: 5, pickedPackages: 2 }] }] })
|
const dispatch = normalizeDispatchTask({ taskNo: 'DPT-1', dispatchNo: 'DSP-1', canDepart: false, departBlockReason: '请先在平台完成“转派送”', items: [{ dispatchItemId: 8, palletNo: 'PLT-1', scheduledPackages: 5, pickedPackages: 2, positions: [{ id: 9, availablePackages: 5, pickedPackages: 2 }] }] })
|
||||||
assert.equal(dispatch.dispatchNo, 'DSP-1')
|
assert.equal(dispatch.dispatchNo, 'DSP-1')
|
||||||
assert.equal(dispatch.items[0].palletNo, 'PLT-1')
|
assert.equal(dispatch.items[0].palletNo, 'PLT-1')
|
||||||
assert.equal(dispatch.items[0].positions[0].availablePackages, 5)
|
assert.equal(dispatch.items[0].positions[0].availablePackages, 5)
|
||||||
|
assert.equal(dispatch.canDepart, false)
|
||||||
|
assert.equal(dispatch.departBlockReason, '请先在平台完成“转派送”')
|
||||||
|
|
||||||
const outbound = normalizeOutboundTask({ task: { taskNo: 'OUT-TASK-1', outboundNo: 'OUT-1', status: 'PENDING' }, items: [{ outboundPalletItemId: 3, palletNo: 'PLT-2', skuCode: 'SKU-1', inboundCode: 'INB-1', packageCount: 4, pickedPackageCount: 1, status: 'PARTIAL_PICKED', positions: [{ inventoryPositionId: 7, palletNo: 'PLT-2', cartonMark: 'BOX-1', skuCode: 'SKU-1', inboundCode: 'INB-1', availablePackages: 3, pickedPackages: 1 }] }] })
|
const outbound = normalizeOutboundTask({ task: { taskNo: 'OUT-TASK-1', outboundNo: 'OUT-1', status: 'PENDING' }, items: [{ outboundPalletItemId: 3, palletNo: 'PLT-2', skuCode: 'SKU-1', inboundCode: 'INB-1', packageCount: 4, pickedPackageCount: 1, status: 'PARTIAL_PICKED', positions: [{ inventoryPositionId: 7, palletNo: 'PLT-2', cartonMark: 'BOX-1', skuCode: 'SKU-1', inboundCode: 'INB-1', availablePackages: 3, pickedPackages: 1 }] }] })
|
||||||
assert.equal(outbound.taskNo, 'OUT-TASK-1')
|
assert.equal(outbound.taskNo, 'OUT-TASK-1')
|
||||||
@@ -130,7 +132,8 @@ test('pages expose loading empty error offline and permission diagnostics with g
|
|||||||
assert.match(dispatch, /completeDispatchPicking/)
|
assert.match(dispatch, /completeDispatchPicking/)
|
||||||
assert.match(dispatch, /this\.remainingPackages === 0/)
|
assert.match(dispatch, /this\.remainingPackages === 0/)
|
||||||
assert.doesNotMatch(dispatch, /partialReason|reason \}/)
|
assert.doesNotMatch(dispatch, /partialReason|reason \}/)
|
||||||
assert.match(dispatch, /this\.pickingCompleted && this\.allPicked && !this\.departed/)
|
assert.match(dispatch, /this\.pickingCompleted && this\.allPicked && this\.current\?\.canDepart === true && !this\.departed/)
|
||||||
|
assert.match(dispatch, /current\.departBlockReason/)
|
||||||
assert.match(dispatch, /this\.selectedPosition\?\.availablePackages \|\| 0/)
|
assert.match(dispatch, /this\.selectedPosition\?\.availablePackages \|\| 0/)
|
||||||
assert.doesNotMatch(dispatch, /availablePackages - (?:this\.)?selectedPosition.*pickedPackages/)
|
assert.doesNotMatch(dispatch, /availablePackages - (?:this\.)?selectedPosition.*pickedPackages/)
|
||||||
assert.match(dispatch, /departDispatch/)
|
assert.match(dispatch, /departDispatch/)
|
||||||
|
|||||||
Reference in New Issue
Block a user