From fafcf7501458f41d972ad10a99df627d011bbd86 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Mon, 19 Oct 2026 12:21:57 +0800 Subject: [PATCH] fix(appointments): exclude pickup trips from delivery calendar --- .../com/baiyue/lastleg/fleet/trip/FleetTripMapper.java | 6 ++++-- .../src/main/resources/openapi/fleet-trips-v1.yaml | 1 + .../lastleg/fleet/trip/FleetTripCalendarMapperTest.java | 7 ++++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/fleet/trip/FleetTripMapper.java b/lastleg-service/src/main/java/com/baiyue/lastleg/fleet/trip/FleetTripMapper.java index 01617e259..882d206cc 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/fleet/trip/FleetTripMapper.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/fleet/trip/FleetTripMapper.java @@ -7,12 +7,14 @@ import org.apache.ibatis.annotations.Select; @Mapper public interface FleetTripMapper extends BaseMapper { + /** 预约日历只读海外仓出库派送,取货入仓车次不属于排车类型。 */ @Select(""" SELECT trip_no,status,warehouse_id,warehouse_code,warehouse_name,planned_departure_at, expected_driver_end_at,departed_at,completed_at,stops_json FROM ll_fleet_trip - WHERE (departed_at IS NOT NULL AND departed_at>=#{from} AND departed_at<#{to}) - OR (departed_at IS NULL AND planned_departure_at>=#{from} AND planned_departure_at<#{to}) + WHERE trip_purpose='DELIVERY' AND ( + (departed_at IS NOT NULL AND departed_at>=#{from} AND departed_at<#{to}) + OR (departed_at IS NULL AND planned_departure_at>=#{from} AND planned_departure_at<#{to})) ORDER BY COALESCE(departed_at,planned_departure_at),trip_no LIMIT 2001 """) java.util.List calendar(@Param("from") java.time.LocalDateTime from,@Param("to") java.time.LocalDateTime to); diff --git a/lastleg-service/src/main/resources/openapi/fleet-trips-v1.yaml b/lastleg-service/src/main/resources/openapi/fleet-trips-v1.yaml index 0138397ec..d19cadd9c 100644 --- a/lastleg-service/src/main/resources/openapi/fleet-trips-v1.yaml +++ b/lastleg-service/src/main/resources/openapi/fleet-trips-v1.yaml @@ -63,6 +63,7 @@ paths: description: >- 仅PLATFORM且平台公共主体(tenantId=0),权限 platform:fleet:trip:list。from/to 是明确UTC时间点,已发车按实际发车时间、尚未发车按计划发车时间读取半开区间,最多44天; 该保护性窗口供界面最多42个当地日历日加时区边界使用,不扩大界面范围。 + 仅出库派送用途(DELIVERY);上门取货入仓用途(PICKUP)不属于此日历排车来源。 最多2000条候选,超限明确拒绝并要求缩小日期范围,不分页扫描、不静默截断。 一车一条,保留取消及完成状态;保留原计划与实际时间,已执行事实不随计划改期移动,不表示收货预约已确认。 已知非美国仓排除;未知仓库/国家/地理IANA时区进入unresolvedRecords,不落入美国当地日槽。 diff --git a/lastleg-service/src/test/java/com/baiyue/lastleg/fleet/trip/FleetTripCalendarMapperTest.java b/lastleg-service/src/test/java/com/baiyue/lastleg/fleet/trip/FleetTripCalendarMapperTest.java index 19174d845..77fe8fdf7 100644 --- a/lastleg-service/src/test/java/com/baiyue/lastleg/fleet/trip/FleetTripCalendarMapperTest.java +++ b/lastleg-service/src/test/java/com/baiyue/lastleg/fleet/trip/FleetTripCalendarMapperTest.java @@ -11,16 +11,21 @@ import java.util.*; import static org.assertj.core.api.Assertions.*; class FleetTripCalendarMapperTest { + /** 同时验证计划和实发的半开范围,取货车次不能混入送仓日历。 */ @Test void queriesAHalfOpenUtcWindowWithoutStatusFilteringAndCapsCandidateRows() throws Exception { var ds=new DriverManagerDataSource("jdbc:h2:mem:"+UUID.randomUUID()+";MODE=MySQL;DB_CLOSE_DELAY=-1","sa",""); var jdbc=new JdbcTemplate(ds); - jdbc.execute("CREATE TABLE ll_fleet_trip(trip_no VARCHAR(64) PRIMARY KEY,status VARCHAR(32),warehouse_id BIGINT,warehouse_code VARCHAR(64),warehouse_name VARCHAR(100),planned_departure_at TIMESTAMP,expected_driver_end_at TIMESTAMP,departed_at TIMESTAMP,completed_at TIMESTAMP,stops_json VARCHAR(2000))"); + jdbc.execute("CREATE TABLE ll_fleet_trip(trip_no VARCHAR(64) PRIMARY KEY,status VARCHAR(32),trip_purpose VARCHAR(32) DEFAULT 'DELIVERY',warehouse_id BIGINT,warehouse_code VARCHAR(64),warehouse_name VARCHAR(100),planned_departure_at TIMESTAMP,expected_driver_end_at TIMESTAMP,departed_at TIMESTAMP,completed_at TIMESTAMP,stops_json VARCHAR(2000))"); var from=LocalDateTime.of(2026,11,1,0,0);var to=from.plusDays(1); String insert="INSERT INTO ll_fleet_trip(trip_no,status,warehouse_id,planned_departure_at,expected_driver_end_at,stops_json) VALUES(?,?,1,?,?, '[]')"; jdbc.update(insert,"TR-BEFORE","PLANNED",from.minusSeconds(1),to); jdbc.update(insert,"TR-FROM","CANCELLED",from,to); jdbc.update(insert,"TR-LAST","COMPLETED",to.minusSeconds(1),to); jdbc.update(insert,"TR-TO","IN_TRANSIT",to,to.plusDays(1)); + jdbc.update(insert,"TR-PICKUP-PLAN","PLANNED",from,to); + jdbc.update(insert,"TR-PICKUP-ACTUAL","IN_TRANSIT",from.minusDays(2),to); + jdbc.update("UPDATE ll_fleet_trip SET trip_purpose='PICKUP' WHERE trip_no LIKE 'TR-PICKUP-%'"); + jdbc.update("UPDATE ll_fleet_trip SET departed_at=? WHERE trip_no='TR-PICKUP-ACTUAL'",from.plusHours(1)); var config=new MybatisConfiguration();config.setMapUnderscoreToCamelCase(true);config.addMapper(FleetTripMapper.class); var factory=new MybatisSqlSessionFactoryBean();factory.setDataSource(ds);factory.setConfiguration(config); var mapper=new SqlSessionTemplate(factory.getObject()).getMapper(FleetTripMapper.class);