From 2c3435adafe48c8e97ef145fa301eaa11ea230be Mon Sep 17 00:00:00 2001
From: ouyangxq <775153912@qq.com>
Date: Wed, 21 Oct 2026 23:20:09 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=B4=B9=E7=94=A8=E8=AE=B0?=
=?UTF-8?q?=E5=BD=95=E3=80=81=E8=A3=85=E6=9F=9C=E5=AE=8C=E6=88=90=E5=8F=8A?=
=?UTF-8?q?=E6=B5=B7=E5=A4=96=E5=B1=A5=E7=BA=A6=E8=B5=84=E6=96=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../mapper/FinanceFeeSourceReadMapper.java | 60 ++++++
.../FinanceFeeSourceReadRepository.java | 145 +++++++++++++
.../FinancePhase1OperationService.java | 73 ++-----
.../baiyue/finance/FinanceContractTest.java | 4 +-
.../FinanceFeeSourceReadMapperTest.java | 141 +++++++++++++
.../FinancePhase1OperationBehaviorTest.java | 139 +++++++------
.../LoadingCompletionCommandMapper.java | 32 ++-
.../service/AppointmentForecastService.java | 17 +-
.../LoadingCompletionCommandRepository.java | 14 +-
.../service/LoadingCompletionWorker.java | 71 +++++--
.../firstleg/service/LoadingPickService.java | 70 ++++---
.../mapper/ContainerCalendarSourceMapper.java | 19 ++
.../ContainerCalendarSourceRepository.java | 2 +
.../appointment-forecasts-internal-v1.yaml | 1 +
.../AppointmentForecastServiceTest.java | 16 +-
.../LoadingCompletionCheckpointLeaseTest.java | 190 ++++++++++++++++++
...LoadingCompletionOwnerPersistenceTest.java | 12 +-
.../service/LoadingCompletionWorkerTest.java | 104 +++++++++-
.../service/LoadingPickServiceTest.java | 43 +++-
.../ContainerCalendarSourceMapperTest.java | 2 +
lastleg-service/docs/business-index.md | 6 +-
.../AppointmentForecastClient.java | 2 +-
.../calendar/WarehouseCalendarMapper.java | 19 +-
.../calendar/WarehouseCalendarModels.java | 4 +-
.../calendar/WarehouseCalendarService.java | 18 +-
.../dispatch/port/DispatchCommands.java | 2 +-
.../dispatch/port/DispatchContracts.java | 34 +++-
.../DispatchMaintenanceDateDeserializer.java | 29 +++
.../lastleg/dispatch/port/DispatchViews.java | 2 +-
.../service/DispatchAggregateService.java | 21 +-
.../transport/TransportReviewPhotos.java | 2 +-
.../transport/TransportTaskProjection.java | 10 +-
.../lastleg/dto/ContainerArrivalTimeView.java | 4 +-
.../lastleg/fleet/trip/FleetTripService.java | 4 +-
.../mapper/InboundPlanOrderMapper.java | 5 -
.../service/InboundPlanService.java | 12 +-
.../lastleg/mapper/LastlegOrderMapper.java | 17 +-
.../ContainerWarehouseArrivalRepository.java | 16 ++
.../LastlegOrderNumberRepository.java | 21 ++
.../ContainerWarehouseArrivalService.java | 67 ++++++
.../LastlegDocumentNumberGenerator.java | 2 +-
.../service/LastlegOrderNoGenerator.java | 20 +-
.../lastleg/service/LastlegOrderService.java | 7 +-
.../service/LoadingCompletedConsumer.java | 6 +-
.../appointment-calendar-warehouse-v1.yaml | 7 +-
.../openapi/overseas-business-v1.yaml | 58 +++++-
.../AppointmentImpactPersistenceTest.java | 2 +-
.../calendar/WarehouseCalendarMapperTest.java | 24 ++-
.../WarehouseCalendarServiceTest.java | 11 +-
.../DispatchAggregatePersistenceTest.java | 8 +-
.../DispatchBolReadPersistenceTest.java | 2 +-
...DispatchCapacityDemandPersistenceTest.java | 2 +-
.../DispatchMaintenancePersistenceTest.java | 178 ++++++++++++++++
...DispatchResourcePhotosPersistenceTest.java | 2 +-
...DispatchReviewWorkflowPersistenceTest.java | 2 +-
.../transport/TransportReviewPhotosTest.java | 4 +-
.../OwnedBusinessScopePersistenceTest.java | 4 +-
.../service/InboundPlanServiceTest.java | 13 +-
.../ContainerWarehouseArrivalServiceTest.java | 67 ++++++
.../service/LastlegOrderNoGeneratorTest.java | 10 +-
.../service/LastlegOrderServiceTest.java | 4 +-
.../service/LoadingCompletedConsumerTest.java | 37 +++-
62 files changed, 1622 insertions(+), 298 deletions(-)
create mode 100644 finance/src/main/java/com/baiyue/finance/mapper/FinanceFeeSourceReadMapper.java
create mode 100644 finance/src/main/java/com/baiyue/finance/repository/FinanceFeeSourceReadRepository.java
create mode 100644 finance/src/test/java/com/baiyue/finance/FinanceFeeSourceReadMapperTest.java
create mode 100644 firstleg/src/test/java/com/baiyue/firstleg/repository/LoadingCompletionCheckpointLeaseTest.java
create mode 100644 lastleg-service/src/main/java/com/baiyue/lastleg/dispatch/port/DispatchMaintenanceDateDeserializer.java
create mode 100644 lastleg-service/src/main/java/com/baiyue/lastleg/repository/ContainerWarehouseArrivalRepository.java
create mode 100644 lastleg-service/src/main/java/com/baiyue/lastleg/repository/LastlegOrderNumberRepository.java
create mode 100644 lastleg-service/src/main/java/com/baiyue/lastleg/service/ContainerWarehouseArrivalService.java
create mode 100644 lastleg-service/src/test/java/com/baiyue/lastleg/dispatch/service/DispatchMaintenancePersistenceTest.java
create mode 100644 lastleg-service/src/test/java/com/baiyue/lastleg/service/ContainerWarehouseArrivalServiceTest.java
diff --git a/finance/src/main/java/com/baiyue/finance/mapper/FinanceFeeSourceReadMapper.java b/finance/src/main/java/com/baiyue/finance/mapper/FinanceFeeSourceReadMapper.java
new file mode 100644
index 000000000..4fa153600
--- /dev/null
+++ b/finance/src/main/java/com/baiyue/finance/mapper/FinanceFeeSourceReadMapper.java
@@ -0,0 +1,60 @@
+package com.baiyue.finance.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import java.util.List;
+import java.util.Map;
+
+/** 费用池按稳定来源读取当前版本,历史快照保留在同一费用的操作记录中。 */
+@Mapper
+public interface FinanceFeeSourceReadMapper {
+ String GENERATED = "(EXISTS(SELECT 1 FROM fin_bill_line bl WHERE bl.source_id=f.id AND bl.source_version=f.source_fee_version))";
+ String STATUS = "CASE WHEN f.status='AVAILABLE' AND " + GENERATED + " THEN 'BILLED' ELSE f.status END";
+ String BUSINESS_DATE = "CAST(JSON_UNQUOTE(JSON_EXTRACT(f.source_snapshot,'$.businessDate')) AS DATE)";
+ String FILTER = " FROM fin_fee_source f WHERE 1=1 " +
+ "" +
+ " AND f.status<>'SUPERSEDED' AND NOT EXISTS(SELECT 1 FROM fin_fee_source newer" +
+ " WHERE newer.source_system=f.source_system AND newer.source_type=f.source_type" +
+ " AND newer.source_fee_id=f.source_fee_id AND newer.source_fee_version>f.source_fee_version)" +
+ "" +
+ " AND f.customer_id=#{customerId}" +
+ " AND f.direction=#{direction}" +
+ " AND f.review_status=#{reviewStatus}" +
+ " AND " + STATUS + "=#{status}" +
+ " AND " + GENERATED + "=#{statementGenerated}" +
+ " AND " + BUSINESS_DATE + ">=#{dateFrom}" +
+ " AND " + BUSINESS_DATE + "<=#{dateTo}" +
+ " AND (f.source_no LIKE CONCAT('%',#{keyword},'%')" +
+ " OR f.fee_item_name LIKE CONCAT('%',#{keyword},'%')" +
+ " OR JSON_UNQUOTE(JSON_EXTRACT(f.source_snapshot,'$.customerName')) LIKE CONCAT('%',#{keyword},'%')" +
+ " OR JSON_UNQUOTE(JSON_EXTRACT(f.source_snapshot,'$.inboundCode')) LIKE CONCAT('%',#{keyword},'%')" +
+ " OR JSON_UNQUOTE(JSON_EXTRACT(f.source_snapshot,'$.containerNo')) LIKE CONCAT('%',#{keyword},'%')" +
+ " OR JSON_UNQUOTE(JSON_EXTRACT(f.source_snapshot,'$.supplierName')) LIKE CONCAT('%',#{keyword},'%'))";
+
+ /** 筛选和计数共用当前版本条件,不能先分页再去重。 */
+ @Select("")
+ long count(Map filters);
+
+ /** 应收、应付分别展示当前快照;同名但来源费用号不同的费用不合并。 */
+ @Select("")
+ List