fix: enforce dropship whole-pallet receiving
This commit is contained in:
+3
@@ -289,6 +289,9 @@ public class ReceivingContainerService {
|
|||||||
ReceivingContainerSession session = requireSigned(operatorKey);
|
ReceivingContainerSession session = requireSigned(operatorKey);
|
||||||
String customerId = session.getCustomerId();
|
String customerId = session.getCustomerId();
|
||||||
InboundRef ref = requireInbound(customerId, session.getContainerNo(), request.inboundCode());
|
InboundRef ref = requireInbound(customerId, session.getContainerNo(), request.inboundCode());
|
||||||
|
if ("ONE_CLICK_DROPSHIP".equals(ref.order().getOrderType())) {
|
||||||
|
throw conflict("One-click dropship inbound must be operated by complete source pallet");
|
||||||
|
}
|
||||||
if (!"FBA".equals(destinationType(ref.line(), ref.order()))) {
|
if (!"FBA".equals(destinationType(ref.line(), ref.order()))) {
|
||||||
throw conflict("OVERSEAS destination must use carton-by-carton scanning; bulk count is forbidden");
|
throw conflict("OVERSEAS destination must use carton-by-carton scanning; bulk count is forbidden");
|
||||||
}
|
}
|
||||||
|
|||||||
+16
@@ -364,6 +364,22 @@ class ReceivingContainerServiceBehaviorTest {
|
|||||||
verifyNoInteractions(warehouse);
|
verifyNoInteractions(warehouse);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void dropshipFbaBulkReceiveIsRejectedBeforeWarehouseCalls() {
|
||||||
|
stubCurrent("FBA", "CONT-A");
|
||||||
|
LastlegOrder dropshipOrder = order("FBA");
|
||||||
|
dropshipOrder.setOrderType("ONE_CLICK_DROPSHIP");
|
||||||
|
when(orders.selectById(1L)).thenReturn(dropshipOrder);
|
||||||
|
|
||||||
|
assertThatThrownBy(() -> service.receiveBulk("7", "receiver",
|
||||||
|
new ReceivingContainerRequests.BulkReceive("IN-1", "PAL-1", 1, "dropship-bulk-key")))
|
||||||
|
.isInstanceOf(ResponseStatusException.class)
|
||||||
|
.hasMessageContaining("complete source pallet");
|
||||||
|
|
||||||
|
verifyNoInteractions(warehouse);
|
||||||
|
verifyNoInteractions(workflow);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void crossContainerCartonAndMismatchedPalletAreRejectedBeforeReservation() {
|
void crossContainerCartonAndMismatchedPalletAreRejectedBeforeReservation() {
|
||||||
stubCurrent("OVERSEAS", "CONT-A");
|
stubCurrent("OVERSEAS", "CONT-A");
|
||||||
|
|||||||
@@ -177,6 +177,7 @@ async function exerciseSystemPalletScenario(fault = '') {
|
|||||||
}
|
}
|
||||||
const sealed = await completeDropshipPalletization(context, { inboundId: '82', inboundCode: 'CODE', warehouseId: '83', measurement: { actualPackageCount: 2 } })
|
const sealed = await completeDropshipPalletization(context, { inboundId: '82', inboundCode: 'CODE', warehouseId: '83', measurement: { actualPackageCount: 2 } })
|
||||||
assert.deepEqual(sealed.sealedCartonMarks, ['CODE#2-1', 'CODE#2-2'])
|
assert.deepEqual(sealed.sealedCartonMarks, ['CODE#2-1', 'CODE#2-2'])
|
||||||
|
assert.deepEqual(sealed.sealedSourcePalletNos, ['DP-260909-0001'])
|
||||||
return checks
|
return checks
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -257,7 +257,7 @@ export async function completeDropshipPalletization(context, { inboundId, inboun
|
|||||||
context.assert(MODULE, '完成后重放不重开任务或新建空托', sealedReplayResponse,
|
context.assert(MODULE, '完成后重放不重开任务或新建空托', sealedReplayResponse,
|
||||||
sealedReplay?.taskStatus === 'COMPLETED' && palletSnapshot(sealedReplay) === palletSnapshot(sealed),
|
sealedReplay?.taskStatus === 'COMPLETED' && palletSnapshot(sealedReplay) === palletSnapshot(sealed),
|
||||||
`taskStatus=${sealedReplay?.taskStatus || 'missing'}, palletNo=${palletNo}`, OPTIONS)
|
`taskStatus=${sealedReplay?.taskStatus || 'missing'}, palletNo=${palletNo}`, OPTIONS)
|
||||||
return { ...sealed, sealedCartonMarks }
|
return { ...sealed, sealedCartonMarks, sealedSourcePalletNos: [palletNo] }
|
||||||
}
|
}
|
||||||
|
|
||||||
async function provisionWarehouseResources(context, { inboundId, tenantId, warehouseId, palletCount }) {
|
async function provisionWarehouseResources(context, { inboundId, tenantId, warehouseId, palletCount }) {
|
||||||
@@ -1074,7 +1074,7 @@ export async function run(context) {
|
|||||||
})
|
})
|
||||||
sealedCartonMarks = sealed?.taskStatus === 'COMPLETED' ? sealed.sealedCartonMarks : []
|
sealedCartonMarks = sealed?.taskStatus === 'COMPLETED' ? sealed.sealedCartonMarks : []
|
||||||
sealedSourcePalletNos = sealed?.taskStatus === 'COMPLETED'
|
sealedSourcePalletNos = sealed?.taskStatus === 'COMPLETED'
|
||||||
? (sealed.pallets || []).map((item) => item?.palletNo).filter(Boolean) : []
|
? (sealed.sealedSourcePalletNos || []).filter(Boolean) : []
|
||||||
completed = await waitForCompletedMeasurement(context, measurementPath, ['WAIT_SPLIT'], 10)
|
completed = await waitForCompletedMeasurement(context, measurementPath, ['WAIT_SPLIT'], 10)
|
||||||
finalResponse = completed.response
|
finalResponse = completed.response
|
||||||
finalMeasurement = context.apiSuccess(MODULE, '合托后回查一件代发入仓单', finalResponse,
|
finalMeasurement = context.apiSuccess(MODULE, '合托后回查一件代发入仓单', finalResponse,
|
||||||
|
|||||||
Reference in New Issue
Block a user