feat(lastleg): retain receipt and redispatch history on exceptions
This commit is contained in:
+6
-1
@@ -27,7 +27,12 @@ public final class ExceptionOrderResponses {
|
||||
|
||||
public record ReturnSource(Long outboundPalletItemId, Long inventoryPositionId,
|
||||
String palletNo, String skuCode, long maxReturnPackages) {}
|
||||
public record Detail(Row order, List<ReturnSource> returnSources) {}
|
||||
public record Detail(Row order, List<ReturnSource> returnSources, List<ReturnReceipt> returnReceipts) {}
|
||||
public record ReturnReceipt(String receiptNo, long receivedPackages, LocalDateTime receivedAt,
|
||||
List<Redispatch> redispatches) {}
|
||||
public record Redispatch(String dispatchNo, String status, long selectedPackages, long pickedPackages,
|
||||
List<RelatedDelivery> deliveries) {}
|
||||
public record RelatedDelivery(String deliveryNo, String status) {}
|
||||
public record CommandResult(Long id, String exceptionNo, String status, long version,
|
||||
Long inventoryAdjustmentId, long restoredPackages,
|
||||
LocalDateTime completedAt, boolean replayed) {}
|
||||
|
||||
+39
-1
@@ -83,6 +83,7 @@ public class ExceptionOrderService {
|
||||
@Resource private InventoryCommandService inventoryCommands;
|
||||
@Resource private ExceptionEvidenceFileGateway evidenceFiles;
|
||||
@Resource private ObjectMapper objectMapper;
|
||||
@Resource private com.baiyue.lastleg.inventory.mapper.ReturnStockReceiptMapper returnReceipts;
|
||||
|
||||
public PageResult<ExceptionOrderResponses.Row> page(String scopedCustomerId, ExceptionOrderRequests.Query query) {
|
||||
String customerId = customerScope(scopedCustomerId, query.customerId());
|
||||
@@ -114,7 +115,44 @@ public class ExceptionOrderService {
|
||||
public ExceptionOrderResponses.Detail detail(String customerId, String exceptionNo) {
|
||||
ExceptionOrder order = exceptionOrders.findByNo(customerId, exceptionNo);
|
||||
if (order == null) throw notFound("异常订单不存在");
|
||||
return new ExceptionOrderResponses.Detail(row(order), storedReturnSources(order));
|
||||
return new ExceptionOrderResponses.Detail(row(order), storedReturnSources(order),
|
||||
receiptHistory(returnReceipts.history(customerId, order.getId())));
|
||||
}
|
||||
|
||||
private List<ExceptionOrderResponses.ReturnReceipt> receiptHistory(
|
||||
List<com.baiyue.lastleg.inventory.mapper.ReturnStockReceiptMapper.ReturnHistoryRow> rows) {
|
||||
var grouped = new LinkedHashMap<Long, List<com.baiyue.lastleg.inventory.mapper.ReturnStockReceiptMapper.ReturnHistoryRow>>();
|
||||
for (var item : rows) grouped.computeIfAbsent(item.receiptId(), ignored -> new ArrayList<>()).add(item);
|
||||
var receipts = new ArrayList<ExceptionOrderResponses.ReturnReceipt>();
|
||||
for (var batch : grouped.values()) {
|
||||
var first = batch.get(0);
|
||||
if (first.receiptId() == null || !StringUtils.hasText(first.receiptNo())
|
||||
|| first.receivedPackages() == null || first.receivedPackages() <= 0)
|
||||
throw conflict("退回实收凭据缺少有效业务编号或数量");
|
||||
var dispatches = new LinkedHashMap<String, List<com.baiyue.lastleg.inventory.mapper.ReturnStockReceiptMapper.ReturnHistoryRow>>();
|
||||
for (var item : batch) if (StringUtils.hasText(item.dispatchNo()))
|
||||
dispatches.computeIfAbsent(item.dispatchNo(), ignored -> new ArrayList<>()).add(item);
|
||||
var redispatches = new ArrayList<ExceptionOrderResponses.Redispatch>();
|
||||
for (var entry : dispatches.entrySet()) {
|
||||
var distinctItems = new LinkedHashMap<Long, com.baiyue.lastleg.inventory.mapper.ReturnStockReceiptMapper.ReturnHistoryRow>();
|
||||
var deliveries = new LinkedHashMap<String, ExceptionOrderResponses.RelatedDelivery>();
|
||||
for (var item : entry.getValue()) {
|
||||
if (item.dispatchItemId() == null || item.selectedPackages() == null || item.selectedPackages() < 0
|
||||
|| item.pickedPackages() == null || item.pickedPackages() < 0)
|
||||
throw conflict("退回重派关联缺少有效排车数量");
|
||||
distinctItems.putIfAbsent(item.dispatchItemId(), item);
|
||||
if (StringUtils.hasText(item.deliveryNo())) deliveries.putIfAbsent(item.deliveryNo(),
|
||||
new ExceptionOrderResponses.RelatedDelivery(item.deliveryNo(), item.deliveryStatus()));
|
||||
}
|
||||
long selected = distinctItems.values().stream().mapToLong(item -> item.selectedPackages()).sum();
|
||||
long picked = distinctItems.values().stream().mapToLong(item -> item.pickedPackages()).sum();
|
||||
redispatches.add(new ExceptionOrderResponses.Redispatch(entry.getKey(), entry.getValue().get(0).dispatchStatus(),
|
||||
selected, picked, List.copyOf(deliveries.values())));
|
||||
}
|
||||
receipts.add(new ExceptionOrderResponses.ReturnReceipt(first.receiptNo(), first.receivedPackages(), first.receivedAt(),
|
||||
List.copyOf(redispatches)));
|
||||
}
|
||||
return List.copyOf(receipts);
|
||||
}
|
||||
|
||||
public ExceptionOrderResponses.UploadedEvidence uploadEvidence(String customerId, String operatorId,
|
||||
|
||||
Reference in New Issue
Block a user