提交
This commit is contained in:
+20
@@ -35,6 +35,26 @@ import static com.baiyue.lastleg.dispatch.port.DispatchTypes.*;
|
||||
|
||||
/** 主单/资源/占用/账本真实SQL回归;外部目录与选货权威提供者使用受控输入。 */
|
||||
public class DispatchAggregatePersistenceTest {
|
||||
/** 取货确认可复用本车释放记录;缺失、已失效或他车重新占用不能被当作本车取货完成。 */
|
||||
@Test void pickupReleaseAcceptsOnlyOwnReleasedSourceWithoutActiveReassignment() throws Exception {
|
||||
var f=new Fixture();var selection=f.source(1,"101",501,"ONT8",3);
|
||||
var created=f.tx.execute(s->f.service.create(f.actor,f.configured("pickup-release-create",List.of(selection))));
|
||||
var row=f.repository.find(created.dispatchNo());var items=f.repository.cargo(row.getId());var at=LocalDateTime.now();
|
||||
f.tx.executeWithoutResult(s->f.service.releasePickupSources(row,f.actor,items,at));
|
||||
var released=f.db.queryForObject("SELECT released_at FROM ll_dispatch_pallet_lock WHERE dispatch_order_id=?",LocalDateTime.class,row.getId());
|
||||
f.tx.executeWithoutResult(s->f.service.releasePickupSources(row,f.actor,items,at.plusSeconds(1)));
|
||||
assertThat(f.db.queryForObject("SELECT released_at FROM ll_dispatch_pallet_lock WHERE dispatch_order_id=?",LocalDateTime.class,row.getId())).isEqualTo(released);
|
||||
assertThatThrownBy(()->f.tx.executeWithoutResult(s->f.service.releaseSources(row,f.actor,items,at))).hasMessageContaining("来源占用");
|
||||
f.db.update("UPDATE ll_dispatch_pallet_lock SET status='EXPIRED' WHERE dispatch_order_id=?",row.getId());
|
||||
assertThatThrownBy(()->f.tx.executeWithoutResult(s->f.service.releasePickupSources(row,f.actor,items,at))).hasMessageContaining("来源占用");
|
||||
f.db.update("UPDATE ll_dispatch_pallet_lock SET status='RELEASED',dispatch_order_id=? WHERE dispatch_order_id=?",row.getId()+1,row.getId());
|
||||
assertThatThrownBy(()->f.tx.executeWithoutResult(s->f.service.releasePickupSources(row,f.actor,items,at))).hasMessageContaining("来源占用");
|
||||
f.db.update("UPDATE ll_dispatch_pallet_lock SET dispatch_order_id=?",row.getId());
|
||||
var item=items.get(0);
|
||||
f.session.getMapper(DispatchSourceMapper.class).claim(999999L,item.getCustomerId(),item.getSourceKey(),item.getPlanPalletId(),null,null,null,row.getId()+1,"other",at);
|
||||
assertThatThrownBy(()->f.tx.executeWithoutResult(s->f.service.releasePickupSources(row,f.actor,items,at))).hasMessageContaining("来源占用");
|
||||
assertThat(f.db.queryForObject("SELECT status FROM ll_dispatch_pallet_lock WHERE id=999999",String.class)).isEqualTo("ACTIVE");
|
||||
}
|
||||
/** 正式司机附件从排车冻结引用选出真实司机,再复用司机域及File的读取边界。 */
|
||||
@Test void masterDriverEvidenceUsesFrozenDriverOwnerForMetadataAndContent() throws Exception {
|
||||
var e=new DriverEvidenceFixture();var number=e.dispatch(ResourceMode.MASTER,71L,List.of(81L));
|
||||
|
||||
+36
@@ -30,6 +30,42 @@ import static org.mockito.ArgumentMatchers.*;
|
||||
|
||||
/** 装车后五框门禁、保存发车共同事务及跨端竞争使用真实单据和版本。 */
|
||||
class DispatchLoadingDeparturePersistenceTest {
|
||||
/** 仓内已发运、异地尚未确认取齐时两个页签同时命中,取齐后只保留派送中且总量不重复。 */
|
||||
@Test void mixedInTransitPendingPickupAppearsInBothTabsWithoutDuplicatingTotal() throws Exception {
|
||||
var f=new Fixture();var mapper=f.f.session.getMapper(DispatchAggregateMapper.class);
|
||||
f.f.db.update("UPDATE ll_dispatch_order SET stage='DELIVERING',departed_at=?,shipped_package_count=4",java.time.LocalDateTime.now());
|
||||
var after=new DispatchAggregateMapper.Search(null,null,null,null,null,"ACTIVE","AFTER_LOADING",null,null,0,10);
|
||||
var delivering=new DispatchAggregateMapper.Search(null,null,null,null,null,"ACTIVE","DELIVERING",null,null,0,10);
|
||||
assertThat(mapper.count(after)).isOne();assertThat(mapper.count(delivering)).isOne();
|
||||
assertThat(mapper.page(after)).hasSize(1);
|
||||
assertThat(mapper.summaries(after)).singleElement().satisfies(s->{assertThat(s.quantity()).isOne();assertThat(s.pendingPickups()).isOne();});
|
||||
f.f.db.update("UPDATE ll_dispatch_order SET shipped_package_count=package_count");
|
||||
assertThat(mapper.count(after)).isZero();assertThat(mapper.count(delivering)).isOne();
|
||||
}
|
||||
/** 混排仓内真实装车后直接派送,装车照片可后补,取货节点不能阻塞仓内货签收。 */
|
||||
@Test void mixedLoadingCompletionDepartsWithoutWaitingForAllLoadingPhotos() throws Exception {
|
||||
authorize();var f=new Fixture();var workflow=spy(f.f.service);
|
||||
doReturn(true).when(workflow).mixedPickup(any());
|
||||
org.springframework.test.util.ReflectionTestUtils.setField(f.service,"workflow",workflow);
|
||||
var result=f.f.tx.execute(s->f.service.complete(f.f.actor,f.number,f.request("mixed-start-delivery")));
|
||||
assertThat(result.stage()).isEqualTo(Stage.DELIVERING);
|
||||
assertThat(f.documents.get(f.f.actor,f.number).complete()).isFalse();
|
||||
assertThat(f.f.db.queryForList("SELECT status FROM ll_delivery_order",String.class)).containsOnly("DELIVERING");
|
||||
assertThat(f.f.tx.execute(s->f.service.complete(f.f.actor,f.number,f.request("mixed-start-delivery"))).replayed()).isTrue();
|
||||
verify(f.delivery,times(1)).prepareForDeparture(any(),any(),anyString());
|
||||
}
|
||||
/** 旧混排已装车可按当前版本续接正式派送;过期请求失败且不重复仓内装车。 */
|
||||
@Test void alreadyLoadedMixedDispatchCanResumeWithFreshVersionAndManifest() throws Exception {
|
||||
authorize();var f=new Fixture();
|
||||
var loaded=f.f.tx.execute(s->f.f.service.loadingComplete(f.f.actor,f.number,f.request("mixed-original-load")));
|
||||
var workflow=spy(f.f.service);doReturn(true).when(workflow).mixedPickup(any());
|
||||
org.springframework.test.util.ReflectionTestUtils.setField(f.service,"workflow",workflow);
|
||||
assertThatThrownBy(()->f.f.tx.execute(s->f.service.complete(f.f.actor,f.number,f.request("mixed-stale")))).hasMessageContaining("版本");
|
||||
var request=new DispatchCommands.LoadingComplete(loaded.recordVersion(),"mixed-resume-delivery",f.manifest,null);
|
||||
assertThat(f.f.tx.execute(s->f.service.complete(f.f.actor,f.number,request)).stage()).isEqualTo(Stage.DELIVERING);
|
||||
verify(workflow,never()).loadingComplete(any(),anyString(),any());
|
||||
verify(f.sourceWorkflow,times(1)).departWholeSources(any(),any(),any(),any());
|
||||
}
|
||||
/** 绑定必须引用本人的原上传文件及分类,不能用另一张图或另一个操作者的回执充数。 */
|
||||
@Test void bindingRequiresTheOriginalUploadFileSlotAndActor() throws Exception {
|
||||
authorize();var f=new Fixture();
|
||||
|
||||
+55
-17
@@ -19,6 +19,37 @@ import static org.mockito.Mockito.*;
|
||||
import static org.mockito.ArgumentMatchers.*;
|
||||
|
||||
class DispatchLooseboardExecutionServiceTest {
|
||||
/** 装车后仓内货可先送达,异地货独立取送,不要求仓内货重复上传取货凭证。 */
|
||||
@Test void warehouseArrivalDoesNotWaitForRemotePickupOrOwnPickupPhoto() {
|
||||
var f=new Fixture(true);f.repository.cargo(1).get(0).setWarehousePalletId(501L);
|
||||
f.row.setStage("AFTER_LOADING");f.row.setPickedPackageCount(2);
|
||||
var initial=f.service.get(f.actor,"PC1");
|
||||
assertThat(initial.items().get(0).canArrive()).isTrue();
|
||||
assertThat(initial.items().get(0).pickupRequired()).isFalse();
|
||||
assertThat(initial.items().get(1).pickupRequired()).isTrue();
|
||||
assertThat(initial.items().get(1).canPickup()).isTrue();
|
||||
assertThat(initial.items().get(1).canArrive()).isFalse();
|
||||
f.save(101,Phase.ARRIVAL,1);
|
||||
assertThat(f.row.getStage()).isEqualTo("AFTER_LOADING");
|
||||
assertThat(f.facts.complete(f.row,Phase.PICKUP)).isFalse();
|
||||
f.save(102,Phase.PICKUP,2);
|
||||
assertThat(f.facts.complete(f.row,Phase.PICKUP)).isTrue();f.confirm();
|
||||
f.save(102,Phase.ARRIVAL,3);
|
||||
assertThat(f.facts.complete(f.row,Phase.ARRIVAL)).isTrue();
|
||||
assertThat(f.service.get(f.actor,"PC1").items().get(0).pickupPhotos()).isEmpty();
|
||||
assertThat(f.row.getShippedPackageCount()).isEqualTo(2);
|
||||
verifyNoInteractions(f.completion);
|
||||
}
|
||||
/** 待入仓提示仅针对送货到仓且无实托的票,已入仓与上门取货均不误报。 */
|
||||
@Test void pendingInboundNoticeIdentifiesOnlyUnreceivedWarehouseDelivery() {
|
||||
var f=new Fixture(true);
|
||||
when(f.sourceRepo.businessSources(anyList())).thenReturn(List.of(new BusinessSource("A","ZY1","LB1",101L,"DELIVERY_TO_WAREHOUSE"),new BusinessSource("B","ZY2","LB2",102L,"WAREHOUSE_PICKUP")));
|
||||
var items=f.service.get(f.actor,"PC1").items();
|
||||
assertThat(items.get(0).warehouseNotice()).isEqualTo("LB1:还没拣货入库");
|
||||
assertThat(items.get(1).warehouseNotice()).isNull();
|
||||
f.repository.cargo(1).get(0).setWarehousePalletId(501L);
|
||||
assertThat(f.service.get(f.actor,"PC1").items().get(0).warehouseNotice()).isNull();
|
||||
}
|
||||
/** 追加、逐张删除及清空后重传不重复计入取货箱数;删除历史保留但不再授权下载。 */
|
||||
@Test void editsPhotoListsWithoutDuplicatingRemotePickup() {
|
||||
var f=new Fixture(true);f.row.setStage("AFTER_LOADING");f.row.setPickedPackageCount(2);
|
||||
@@ -31,15 +62,15 @@ class DispatchLooseboardExecutionServiceTest {
|
||||
assertThat(f.facts.current(f.row).get(0).files()).isEmpty();
|
||||
assertThat(f.facts.complete(f.row,Phase.PICKUP)).isFalse();
|
||||
f.replace(101,Phase.PICKUP,3L);
|
||||
assertThat(f.row.getShippedPackageCount()).isEqualTo(2);
|
||||
assertThat(f.facts.pickedRemotePackages(f.row)).isEqualTo(2);
|
||||
assertThat(f.row.getShippedPackageCount()).isZero();
|
||||
assertThat(f.facts.pickedRemotePackages(f.row)).isZero();
|
||||
assertThat(f.facts.history(1)).hasSize(5);
|
||||
verify(f.workflow,times(1)).requireRemotePickupCapacity(f.row);
|
||||
verify(f.orders,times(1)).progress("A","LB1","operator",0);
|
||||
verify(f.workflow,never()).requireRemotePickupCapacity(f.row);
|
||||
verifyNoInteractions(f.orders);
|
||||
}
|
||||
/** 送达后可替换及追加照片,但最后一张完成凭证不可删,修改不重复触发结案。 */
|
||||
@Test void completedPhotosCanBeAppendedAndDeletedWhileRetainingEvidence() {
|
||||
var f=new Fixture(false);f.save(101,Phase.PICKUP,1);f.save(102,Phase.PICKUP,2);
|
||||
var f=new Fixture(false);f.save(101,Phase.PICKUP,1);f.save(102,Phase.PICKUP,2);f.confirm();
|
||||
f.save(101,Phase.ARRIVAL,3);
|
||||
assertThatThrownBy(()->f.replace(101,Phase.PICKUP)).hasMessageContaining("至少保留一张");
|
||||
f.save(102,Phase.ARRIVAL,4);
|
||||
@@ -56,7 +87,9 @@ class DispatchLooseboardExecutionServiceTest {
|
||||
var f=new Fixture(false);var first=f.save(101,Phase.PICKUP,1);
|
||||
assertThat(first.direct()).isTrue();assertThat(first.stage()).isEqualTo("LOADING");verifyNoInteractions(f.fleet);
|
||||
var request=new DispatchLooseboardExecutionService.Save(f.row.getRecordVersion(),"pickup-original",List.of(2L));
|
||||
var departed=f.service.save(f.actor,"PC1",102,Phase.PICKUP,request);
|
||||
var saved=f.service.save(f.actor,"PC1",102,Phase.PICKUP,request);
|
||||
assertThat(saved.stage()).isEqualTo("LOADING");assertThat(saved.canCompletePickup()).isTrue();verifyNoInteractions(f.fleet);
|
||||
var departed=f.confirm();
|
||||
assertThat(departed.stage()).isEqualTo("DELIVERING");assertThat(f.row.getPickedPackageCount()).isZero();assertThat(f.row.getShippedPackageCount()).isEqualTo(4);
|
||||
f.service.save(f.actor,"PC1",102,Phase.PICKUP,request);
|
||||
verify(f.fleet,times(1)).departPhotoDispatchShell(eq("PC1"),eq("operator"),any(),anyString());
|
||||
@@ -69,27 +102,28 @@ class DispatchLooseboardExecutionServiceTest {
|
||||
}
|
||||
/** 混排仍保留原出库链,散板照片不能单独结束其他客户的派送。 */
|
||||
@Test void mixedCargoOnlyAddsEvidenceAndWakesNormalCompletion() {
|
||||
var f=new Fixture(true);f.row.setStage("DELIVERING");f.row.setPickedPackageCount(2);f.row.setShippedPackageCount(2);
|
||||
f.save(101,Phase.PICKUP,1);f.save(102,Phase.PICKUP,2);f.save(101,Phase.ARRIVAL,3);f.save(102,Phase.ARRIVAL,4);
|
||||
var f=new Fixture(true);f.row.setStage("DELIVERING");f.row.setDepartedAt(LocalDateTime.now());f.row.setPickedPackageCount(2);f.row.setShippedPackageCount(2);
|
||||
f.save(101,Phase.PICKUP,1);f.save(102,Phase.PICKUP,2);f.confirm();f.save(101,Phase.ARRIVAL,3);f.save(102,Phase.ARRIVAL,4);
|
||||
assertThat(f.row.getStage()).isEqualTo("DELIVERING");assertThat(f.facts.direct(f.row)).isFalse();
|
||||
assertThat(f.facts.complete(f.row,Phase.PICKUP)).isTrue();assertThat(f.facts.complete(f.row,Phase.ARRIVAL)).isTrue();
|
||||
verifyNoInteractions(f.fleet,f.outbounds,f.completion);
|
||||
verify(f.deliveries).normalDeliveryFacts(any());
|
||||
assertThat(f.row.getShippedPackageCount()).isEqualTo(6);assertThat(f.row.getPickedPackageCount()).isEqualTo(2);
|
||||
verify(f.workflow).releasePickupSources(eq(f.row),eq(f.actor),argThat(items->items.size()==2),any());
|
||||
verify(f.workflow,never()).releaseSources(any(),any(),anyList(),any());
|
||||
}
|
||||
/** 仓内货先送达不阻塞后续异地取货;各票散板可交错取送,最后一票送达才整车完结。 */
|
||||
@Test void mixedWarehouseDeliveryMayFinishBeforeRemotePickupsAndInterleavedArrivals() {
|
||||
var f=new Fixture(true);f.row.setStage("DELIVERING");f.row.setPickedPackageCount(2);f.row.setShippedPackageCount(2);
|
||||
var f=new Fixture(true);f.row.setStage("DELIVERING");f.row.setDepartedAt(LocalDateTime.now());f.row.setPickedPackageCount(2);f.row.setShippedPackageCount(2);
|
||||
when(f.deliveries.normalDeliveryFacts(any())).thenReturn(new NormalDeliveryFacts("PC1","signed",true,Instant.now(),List.of("DL1"),List.of(),List.of()));
|
||||
var initial=f.service.get(f.actor,"PC1");
|
||||
assertThat(initial.stage()).isEqualTo("DELIVERING");
|
||||
assertThat(initial.items()).allMatch(i->i.canPickup() && !i.canArrive());
|
||||
f.save(101,Phase.PICKUP,1);
|
||||
f.save(101,Phase.PICKUP,1);f.save(102,Phase.PICKUP,3);f.confirm();
|
||||
var partial=f.save(101,Phase.ARRIVAL,2);
|
||||
assertThat(partial.stage()).isEqualTo("DELIVERING");
|
||||
assertThat(partial.items().stream().filter(i->i.itemId().equals("102")).findFirst().orElseThrow().canPickup()).isTrue();
|
||||
verifyNoInteractions(f.completion);
|
||||
f.save(102,Phase.PICKUP,3);
|
||||
assertThat(f.row.getStage()).isEqualTo("DELIVERING");
|
||||
f.save(102,Phase.ARRIVAL,4);
|
||||
assertThat(f.row.getStage()).isEqualTo("DELIVERED");
|
||||
@@ -105,13 +139,13 @@ class DispatchLooseboardExecutionServiceTest {
|
||||
assertThat(initial.items()).allMatch(i->i.canPickup() && !i.canArrive());
|
||||
var picked=f.save(101,Phase.PICKUP,1);
|
||||
assertThat(picked.stage()).isEqualTo("AFTER_LOADING");
|
||||
assertThat(picked.items().stream().filter(i->i.itemId().equals("101")).findFirst().orElseThrow().canArrive()).isTrue();
|
||||
f.save(101,Phase.ARRIVAL,2);f.save(102,Phase.PICKUP,3);f.save(102,Phase.ARRIVAL,4);
|
||||
assertThat(picked.items().stream().filter(i->i.itemId().equals("101")).findFirst().orElseThrow().canArrive()).isFalse();
|
||||
f.save(102,Phase.PICKUP,3);f.confirm();f.save(101,Phase.ARRIVAL,2);f.save(102,Phase.ARRIVAL,4);
|
||||
assertThat(f.row.getStage()).isEqualTo("AFTER_LOADING");
|
||||
assertThat(f.row.getDepartedAt()).isNull();assertThat(f.row.getDeliveryCompletedAt()).isNull();
|
||||
assertThat(f.row.getPickedPackageCount()).isEqualTo(2);assertThat(f.row.getShippedPackageCount()).isEqualTo(4);
|
||||
assertThat(f.facts.pickedRemotePackages(f.row)).isEqualTo(4);
|
||||
verify(f.workflow,times(2)).requireRemotePickupCapacity(f.row);
|
||||
verify(f.workflow,times(1)).requireRemotePickupCapacity(f.row);
|
||||
verifyNoInteractions(f.fleet,f.outbounds,f.deliveries,f.completion);
|
||||
}
|
||||
/** 未确认装车的混排不允许提前上传,取消后同样不能上传。 */
|
||||
@@ -148,22 +182,24 @@ class DispatchLooseboardExecutionServiceTest {
|
||||
}
|
||||
static class Fixture {
|
||||
final ObjectMapper json=new ObjectMapper().findAndRegisterModules();final Actor actor=new Actor("operator",DispatchTypes.ActorMode.PLATFORM,null);
|
||||
final DispatchAggregate row=new DispatchAggregate();final List<String> history=new ArrayList<>();
|
||||
final DispatchAggregate row=new DispatchAggregate();final List<String> history=new ArrayList<>();final List<String> confirmations=new ArrayList<>();
|
||||
final DispatchAggregateRepository repository=mock(DispatchAggregateRepository.class);
|
||||
final DispatchLooseboardEvidenceRepository evidence=mock(DispatchLooseboardEvidenceRepository.class);
|
||||
final DispatchAggregateService workflow=mock(DispatchAggregateService.class);final DispatchEvidenceGateway files=mock(DispatchEvidenceGateway.class);
|
||||
final DispatchOutboundPort outbounds=mock(DispatchOutboundPort.class);final FleetTripExecutionService fleet=mock(FleetTripExecutionService.class);
|
||||
final FleetTripCompletionService completion=mock(FleetTripCompletionService.class);final DispatchDeliveryPort deliveries=mock(DispatchDeliveryPort.class);
|
||||
final LooseboardTransportPort orders=mock(LooseboardTransportPort.class);
|
||||
final LooseboardCargoRepository sourceRepo=mock(LooseboardCargoRepository.class);
|
||||
final DispatchLooseboardFacts facts;final DispatchLooseboardExecutionService service;
|
||||
Fixture(boolean mixed){
|
||||
row.setId(1L);row.setDispatchNo("PC1");row.setStage("LOADING");row.setStatus("ACTIVE");row.setReviewState("APPROVED");row.setRecordVersion(0L);
|
||||
row.setReviewRound(1L);row.setCargoHash("cargo");row.setPackageCount(mixed?6:4);row.setPickedPackageCount(0);row.setPalletCount(mixed?3:2);row.setShippedPackageCount(0);
|
||||
var cargo=new ArrayList<>(List.of(item(101,"A","ZY1"),item(102,"B","ZY2")));if(mixed)cargo.add(item(103,"C","OTHER"));
|
||||
when(repository.find("PC1")).thenReturn(row);when(repository.cargo(1)).thenReturn(cargo);when(repository.saveState(eq(row),anyLong())).thenReturn(1);
|
||||
when(repository.history(anyLong(),eq(row),anyString(),anyString(),any(),anyString(),any())).thenAnswer(call->{if("LOOSEBOARD_PHOTO".equals(call.getArgument(2)))history.add(call.getArgument(5));return 1;});
|
||||
when(repository.history(anyLong(),eq(row),anyString(),anyString(),any(),anyString(),any())).thenAnswer(call->{if("LOOSEBOARD_PHOTO".equals(call.getArgument(2)))history.add(call.getArgument(5));if("LOOSEBOARD_PICKUP_COMPLETE".equals(call.getArgument(2)))confirmations.add(call.getArgument(5));return 1;});
|
||||
when(evidence.pickupConfirmations(1)).thenAnswer(call->List.copyOf(confirmations));when(workflow.warehouseItems(row)).thenAnswer(call->factsWarehouseItems());
|
||||
when(evidence.snapshots(1)).thenAnswer(call->List.copyOf(history));when(evidence.deliveredPackages(anyString(),anyString())).thenReturn(2L);
|
||||
var sourceRepo=mock(LooseboardCargoRepository.class);when(sourceRepo.businessSources(anyList())).thenReturn(List.of(new BusinessSource("A","ZY1","LB1",101L,"WAREHOUSE_PICKUP"),new BusinessSource("B","ZY2","LB2",102L,"WAREHOUSE_PICKUP")));
|
||||
when(sourceRepo.businessSources(anyList())).thenReturn(List.of(new BusinessSource("A","ZY1","LB1",101L,"WAREHOUSE_PICKUP"),new BusinessSource("B","ZY2","LB2",102L,"WAREHOUSE_PICKUP")));
|
||||
facts=new DispatchLooseboardFacts(repository,new DispatchLooseboardDisplayService(sourceRepo),evidence,json);
|
||||
var context=mock(Context.class);var resources=new Resources(new VehicleSnapshot(DispatchTypes.ResourceMode.MASTER,1L,"TEST",null,"IN_SERVICE",new Capacity(10,new java.math.BigDecimal("1000"),new java.math.BigDecimal("50")),List.of()),null,null);
|
||||
when(context.resources()).thenReturn(resources);when(workflow.preview(actor,"PC1")).thenReturn(context);when(workflow.lockForArrangement(actor,"PC1")).thenReturn(context);
|
||||
@@ -172,6 +208,8 @@ class DispatchLooseboardExecutionServiceTest {
|
||||
when(deliveries.normalDeliveryFacts(context)).thenReturn(new NormalDeliveryFacts("PC1","hash",false,null,List.of("DL1"),List.of(new NormalDeliveryFact("A","group","OUT1","DL1",5,6,0,0,0,"DELIVERING",true,null)),List.of()));
|
||||
service=new DispatchLooseboardExecutionService(workflow,repository,facts,files,outbounds,fleet,completion,deliveries,orders,new DispatchCommandHasher(json),json);
|
||||
}
|
||||
List<DispatchItem> factsWarehouseItems(){return facts.warehouseItems(1);}
|
||||
DispatchLooseboardExecutionService.Detail confirm(){return service.completePickup(actor,"PC1",new DispatchLooseboardExecutionService.Confirm(row.getRecordVersion(),UUID.randomUUID().toString()));}
|
||||
DispatchLooseboardExecutionService.Detail save(long item,Phase phase,long file){return service.save(actor,"PC1",item,phase,new DispatchLooseboardExecutionService.Save(row.getRecordVersion(),UUID.randomUUID().toString(),List.of(file)));}
|
||||
DispatchLooseboardExecutionService.Detail replace(long item,Phase phase,Long... files){return service.save(actor,"PC1",item,phase,new DispatchLooseboardExecutionService.Save(row.getRecordVersion(),UUID.randomUUID().toString(),List.of(files)));}
|
||||
DispatchItem item(long id,String customer,String number){var item=new DispatchItem();item.setId(id);item.setCustomerId(customer);item.setOrderNo(number);item.setPlanPalletId(id);item.setPackageCount(2);item.setDeliveryAddress("TEST DESTINATION");return item;}
|
||||
|
||||
+6
-3
@@ -36,12 +36,15 @@ class DispatchLooseboardPhotoPersistenceTest {
|
||||
var proxy=new ProxyFactory(target);proxy.setProxyTargetClass(true);proxy.addAdvice(new TransactionInterceptor(f.transactions,new AnnotationTransactionAttributeSource()));
|
||||
var service=(DispatchLooseboardExecutionService)proxy.getProxy();
|
||||
var request=new DispatchLooseboardExecutionService.Save(root.getRecordVersion(),"pickup-rollback-original",List.of(77L));
|
||||
service.save(f.actor,number,item.getId(),DispatchLooseboardFacts.Phase.PICKUP,request);
|
||||
var savedVersion=f.repository.find(number).getRecordVersion();
|
||||
var confirm=new DispatchLooseboardExecutionService.Confirm(savedVersion,"pickup-explicit-confirm");
|
||||
doThrow(new IllegalStateException("模拟发车故障")).when(fleet).departPhotoDispatchShell(eq(number),anyString(),any(),anyString());
|
||||
assertThatThrownBy(()->service.save(f.actor,number,item.getId(),DispatchLooseboardFacts.Phase.PICKUP,request)).hasMessageContaining("模拟发车故障");
|
||||
assertThat(evidence.snapshots(root.getId())).isEmpty();assertThat(f.repository.find(number).getRecordVersion()).isEqualTo(root.getRecordVersion());
|
||||
assertThatThrownBy(()->service.completePickup(f.actor,number,confirm)).hasMessageContaining("模拟发车故障");
|
||||
assertThat(evidence.snapshots(root.getId())).hasSize(1);assertThat(evidence.pickupConfirmations(root.getId())).isEmpty();assertThat(f.repository.find(number).getRecordVersion()).isEqualTo(savedVersion);
|
||||
assertThat(f.repository.find(number).getStage()).isEqualTo("LOADING");assertThat(f.repository.find(number).getShippedPackageCount()).isZero();
|
||||
doNothing().when(fleet).departPhotoDispatchShell(eq(number),anyString(),any(),anyString());
|
||||
assertThat(service.save(f.actor,number,item.getId(),DispatchLooseboardFacts.Phase.PICKUP,request).stage()).isEqualTo("DELIVERING");
|
||||
assertThat(service.completePickup(f.actor,number,confirm).stage()).isEqualTo("DELIVERING");
|
||||
assertThat(evidence.snapshots(root.getId())).hasSize(1);assertThat(f.repository.find(number).getPickedPackageCount()).isZero();
|
||||
service.save(f.actor,number,item.getId(),DispatchLooseboardFacts.Phase.PICKUP,request);
|
||||
assertThat(evidence.snapshots(root.getId())).hasSize(1);
|
||||
|
||||
Reference in New Issue
Block a user