贴标申请,仓储转运

This commit is contained in:
2026-10-13 20:51:44 +08:00
parent c2bb769676
commit b033a89aaf
4 changed files with 34 additions and 3 deletions
@@ -36,7 +36,8 @@ public final class WarehouseTransferResponses {
String destinationType, String destinationWarehouseCode, String destinationWarehouseName, String destinationType, String destinationWarehouseCode, String destinationWarehouseName,
int packageCount, String deliveryMethod, boolean needRelabel, String relabelNo, int packageCount, String deliveryMethod, boolean needRelabel, String relabelNo,
String relabelStatus, String relabelFulfillmentStatus, String relabelStatus, String relabelFulfillmentStatus,
String status, LocalDateTime estimatedArrivalAt, LocalDateTime createdAt) {} String status, LocalDateTime estimatedArrivalAt, LocalDateTime createdAt,
LocalDateTime reviewedAt, LocalDateTime measuredAt, LocalDateTime outboundAt) {}
public record Detail(Long id, String transferNo, Long inboundOrderId, String inboundCode, public record Detail(Long id, String transferNo, Long inboundOrderId, String inboundCode,
Long lastlegOrderId, String lastlegOrderNo, String orderType, String orderStatus, Long lastlegOrderId, String lastlegOrderNo, String orderType, String orderStatus,
String status, String status,
@@ -10,6 +10,15 @@ import java.util.List;
@Mapper @Mapper
public interface WarehouseTransferPalletMapper extends BaseMapper<WarehouseTransferPallet> { public interface WarehouseTransferPalletMapper extends BaseMapper<WarehouseTransferPallet> {
record MeasurementTime(Long transferOrderId, java.time.LocalDateTime measuredAt) {}
@Select("<script>SELECT p.transfer_order_id AS transferOrderId,MAX(p.completed_at) AS measuredAt " +
"FROM ll_warehouse_transfer_pallet p JOIN ll_warehouse_transfer_order t " +
"ON t.id=p.transfer_order_id AND t.customer_id=p.customer_id " +
"WHERE t.id IN <foreach collection='orderIds' item='id' open='(' separator=',' close=')'>#{id}</foreach> " +
"AND p.completed_at IS NOT NULL GROUP BY p.transfer_order_id</script>")
List<MeasurementTime> measurementTimes(@Param("orderIds") List<Long> orderIds);
@Select("SELECT * FROM ll_warehouse_transfer_pallet WHERE customer_id=#{customerId} AND transfer_order_id=#{transferOrderId} ORDER BY sequence_no") @Select("SELECT * FROM ll_warehouse_transfer_pallet WHERE customer_id=#{customerId} AND transfer_order_id=#{transferOrderId} ORDER BY sequence_no")
List<WarehouseTransferPallet> listOrder(@Param("customerId") String customerId, List<WarehouseTransferPallet> listOrder(@Param("customerId") String customerId,
@Param("transferOrderId") Long transferOrderId); @Param("transferOrderId") Long transferOrderId);
@@ -428,6 +428,7 @@ public class WarehouseTransferService {
.orderByDesc(WarehouseTransferOrder::getCreatedAt).orderByDesc(WarehouseTransferOrder::getId); .orderByDesc(WarehouseTransferOrder::getCreatedAt).orderByDesc(WarehouseTransferOrder::getId);
Page<WarehouseTransferOrder> result = transfers.selectPage(Page.of(query.page(), query.size()), wrapper); Page<WarehouseTransferOrder> result = transfers.selectPage(Page.of(query.page(), query.size()), wrapper);
Map<String, RelabelApplication> relabelApplicationsByNo = relabelApplications(result.getRecords()); Map<String, RelabelApplication> relabelApplicationsByNo = relabelApplications(result.getRecords());
Map<Long, LocalDateTime> measurementTimes = measurementTimes(result.getRecords());
List<WarehouseTransferResponses.Summary> records = result.getRecords().stream().map(value -> List<WarehouseTransferResponses.Summary> records = result.getRecords().stream().map(value ->
new WarehouseTransferResponses.Summary(value.getId(), value.getTransferNo(), value.getInboundCode(), new WarehouseTransferResponses.Summary(value.getId(), value.getTransferNo(), value.getInboundCode(),
value.getLastlegOrderId(), value.getLastlegOrderNo(), value.getOperatingWarehouseId(), value.getLastlegOrderId(), value.getLastlegOrderNo(), value.getOperatingWarehouseId(),
@@ -439,7 +440,8 @@ public class WarehouseTransferService {
value.getRelabelNo() == null || relabelApplicationsByNo.get(value.getRelabelNo()) == null value.getRelabelNo() == null || relabelApplicationsByNo.get(value.getRelabelNo()) == null
? null : relabelApplicationsByNo.get(value.getRelabelNo()).getFulfillmentStatus(), ? null : relabelApplicationsByNo.get(value.getRelabelNo()).getFulfillmentStatus(),
value.getStatus(), value.getStatus(),
value.getEstimatedArrivalAt(), value.getCreatedAt())).toList(); value.getEstimatedArrivalAt(), value.getCreatedAt(), value.getReviewedAt(),
measurementTimes.get(value.getId()), value.getOutboundAt())).toList();
return new PageResult<>(records, result.getCurrent(), result.getSize(), result.getTotal(), result.getPages()); return new PageResult<>(records, result.getCurrent(), result.getSize(), result.getTotal(), result.getPages());
} }
@@ -1320,10 +1322,17 @@ public class WarehouseTransferService {
relabel == null ? null : relabel.getStatus(), relabel == null ? null : relabel.getStatus(),
relabel == null ? null : relabel.getFulfillmentStatus(), relabel == null ? null : relabel.getFulfillmentStatus(),
value.getStatus(), value.getStatus(),
value.getEstimatedArrivalAt(), value.getCreatedAt()); value.getEstimatedArrivalAt(), value.getCreatedAt(), value.getReviewedAt(), null, value.getOutboundAt());
}).toList(); }).toList();
} }
private Map<Long, LocalDateTime> measurementTimes(List<WarehouseTransferOrder> transferOrders) {
if (transferOrders.isEmpty()) return Map.of();
return transferPallets.measurementTimes(transferOrders.stream().map(WarehouseTransferOrder::getId).toList())
.stream().collect(Collectors.toMap(WarehouseTransferPalletMapper.MeasurementTime::transferOrderId,
WarehouseTransferPalletMapper.MeasurementTime::measuredAt));
}
private Map<String, RelabelApplication> relabelApplications(List<WarehouseTransferOrder> transferOrders) { private Map<String, RelabelApplication> relabelApplications(List<WarehouseTransferOrder> transferOrders) {
Set<String> relabelNos = transferOrders.stream().map(WarehouseTransferOrder::getRelabelNo) Set<String> relabelNos = transferOrders.stream().map(WarehouseTransferOrder::getRelabelNo)
.filter(StringUtils::hasText).collect(Collectors.toSet()); .filter(StringUtils::hasText).collect(Collectors.toSet());
@@ -126,6 +126,12 @@ class WarehouseTransferServiceTest {
WarehouseTransferOrder transfer = transfer(WarehouseTransferService.WAIT_RELABEL); WarehouseTransferOrder transfer = transfer(WarehouseTransferService.WAIT_RELABEL);
transfer.setNeedRelabel(true); transfer.setNeedRelabel(true);
transfer.setRelabelNo("RL-20260923-000001"); transfer.setRelabelNo("RL-20260923-000001");
var reviewedAt = LocalDateTime.of(2026, 10, 9, 15, 36, 14);
var measuredAt = reviewedAt.plusNanos(300_000_000);
var outboundAt = reviewedAt.plusSeconds(2);
transfer.setReviewedAt(reviewedAt); transfer.setOutboundAt(outboundAt);
when(transferPallets.measurementTimes(List.of(transfer.getId()))).thenReturn(List.of(
new WarehouseTransferPalletMapper.MeasurementTime(transfer.getId(), measuredAt)));
Page<WarehouseTransferOrder> resultPage = new Page<>(1, 20, 1); Page<WarehouseTransferOrder> resultPage = new Page<>(1, 20, 1);
resultPage.setRecords(List.of(transfer)); resultPage.setRecords(List.of(transfer));
RelabelApplication relabel = new RelabelApplication(); RelabelApplication relabel = new RelabelApplication();
@@ -141,6 +147,9 @@ class WarehouseTransferServiceTest {
assertEquals("RL-20260923-000001", result.records().get(0).relabelNo()); assertEquals("RL-20260923-000001", result.records().get(0).relabelNo());
assertEquals("COMPLETED", result.records().get(0).relabelStatus()); assertEquals("COMPLETED", result.records().get(0).relabelStatus());
assertEquals("READY_FOR_DISPATCH", result.records().get(0).relabelFulfillmentStatus()); assertEquals("READY_FOR_DISPATCH", result.records().get(0).relabelFulfillmentStatus());
assertEquals(reviewedAt, result.records().get(0).reviewedAt());
assertEquals(measuredAt, result.records().get(0).measuredAt());
assertEquals(outboundAt, result.records().get(0).outboundAt());
} }
@Test @Test
@@ -157,6 +166,9 @@ class WarehouseTransferServiceTest {
assertEquals(1, result.records().size()); assertEquals(1, result.records().size());
assertNull(result.records().get(0).relabelStatus()); assertNull(result.records().get(0).relabelStatus());
assertNull(result.records().get(0).relabelFulfillmentStatus()); assertNull(result.records().get(0).relabelFulfillmentStatus());
assertNull(result.records().get(0).reviewedAt());
assertNull(result.records().get(0).measuredAt());
assertNull(result.records().get(0).outboundAt());
verify(relabelApplications, never()).selectList(any()); verify(relabelApplications, never()).selectList(any());
} }