生产更新:同步已提交的海外仓分析及业务修复(2026-10-16) #27

Merged
admin merged 138 commits from test into main 2026-10-16 18:02:59 +08:00
4 changed files with 34 additions and 3 deletions
Showing only changes of commit b033a89aaf - Show all commits
@@ -36,7 +36,8 @@ public final class WarehouseTransferResponses {
String destinationType, String destinationWarehouseCode, String destinationWarehouseName,
int packageCount, String deliveryMethod, boolean needRelabel, String relabelNo,
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,
Long lastlegOrderId, String lastlegOrderNo, String orderType, String orderStatus,
String status,
@@ -10,6 +10,15 @@ import java.util.List;
@Mapper
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")
List<WarehouseTransferPallet> listOrder(@Param("customerId") String customerId,
@Param("transferOrderId") Long transferOrderId);
@@ -428,6 +428,7 @@ public class WarehouseTransferService {
.orderByDesc(WarehouseTransferOrder::getCreatedAt).orderByDesc(WarehouseTransferOrder::getId);
Page<WarehouseTransferOrder> result = transfers.selectPage(Page.of(query.page(), query.size()), wrapper);
Map<String, RelabelApplication> relabelApplicationsByNo = relabelApplications(result.getRecords());
Map<Long, LocalDateTime> measurementTimes = measurementTimes(result.getRecords());
List<WarehouseTransferResponses.Summary> records = result.getRecords().stream().map(value ->
new WarehouseTransferResponses.Summary(value.getId(), value.getTransferNo(), value.getInboundCode(),
value.getLastlegOrderId(), value.getLastlegOrderNo(), value.getOperatingWarehouseId(),
@@ -439,7 +440,8 @@ public class WarehouseTransferService {
value.getRelabelNo() == null || relabelApplicationsByNo.get(value.getRelabelNo()) == null
? null : relabelApplicationsByNo.get(value.getRelabelNo()).getFulfillmentStatus(),
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());
}
@@ -1320,10 +1322,17 @@ public class WarehouseTransferService {
relabel == null ? null : relabel.getStatus(),
relabel == null ? null : relabel.getFulfillmentStatus(),
value.getStatus(),
value.getEstimatedArrivalAt(), value.getCreatedAt());
value.getEstimatedArrivalAt(), value.getCreatedAt(), value.getReviewedAt(), null, value.getOutboundAt());
}).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) {
Set<String> relabelNos = transferOrders.stream().map(WarehouseTransferOrder::getRelabelNo)
.filter(StringUtils::hasText).collect(Collectors.toSet());
@@ -126,6 +126,12 @@ class WarehouseTransferServiceTest {
WarehouseTransferOrder transfer = transfer(WarehouseTransferService.WAIT_RELABEL);
transfer.setNeedRelabel(true);
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);
resultPage.setRecords(List.of(transfer));
RelabelApplication relabel = new RelabelApplication();
@@ -141,6 +147,9 @@ class WarehouseTransferServiceTest {
assertEquals("RL-20260923-000001", result.records().get(0).relabelNo());
assertEquals("COMPLETED", result.records().get(0).relabelStatus());
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
@@ -157,6 +166,9 @@ class WarehouseTransferServiceTest {
assertEquals(1, result.records().size());
assertNull(result.records().get(0).relabelStatus());
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());
}