diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/dto/ContainerArrivalTimeView.java b/lastleg-service/src/main/java/com/baiyue/lastleg/dto/ContainerArrivalTimeView.java index a8071e88b..72aa9e053 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/dto/ContainerArrivalTimeView.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/dto/ContainerArrivalTimeView.java @@ -7,5 +7,6 @@ public record ContainerArrivalTimeView( String sourceContainerBookingId, LocalDateTime estimatedWarehouseArrivalAt, LocalDateTime actualWarehouseArrivalAt, - int version + int version, + long planCount ) { } diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/mapper/LastlegOrderMapper.java b/lastleg-service/src/main/java/com/baiyue/lastleg/mapper/LastlegOrderMapper.java index 7d12730b1..801fa1ebd 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/mapper/LastlegOrderMapper.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/mapper/LastlegOrderMapper.java @@ -210,12 +210,19 @@ public interface LastlegOrderMapper extends BaseMapper { @Select("SELECT * FROM ll_order WHERE source_container_booking_id=#{sourceContainerBookingId} ORDER BY customer_id,id FOR UPDATE") List lockContainerOrders(@Param("sourceContainerBookingId") String sourceContainerBookingId); + /** 人工时间及计划冻结时间优先;返回计划数量供各页面统一判断默认日期。 */ @Select("") diff --git a/lastleg-service/src/main/resources/openapi/overseas-business-v1.yaml b/lastleg-service/src/main/resources/openapi/overseas-business-v1.yaml index 88b3221e9..6b741d5e8 100644 --- a/lastleg-service/src/main/resources/openapi/overseas-business-v1.yaml +++ b/lastleg-service/src/main/resources/openapi/overseas-business-v1.yaml @@ -3503,12 +3503,13 @@ components: remark: { type: string, maxLength: 500, nullable: true } ContainerArrivalTimeView: type: object - required: [sourceContainerBookingId, version] + required: [sourceContainerBookingId, version, planCount] properties: sourceContainerBookingId: { type: string } - estimatedWarehouseArrivalAt: { type: string, format: date-time, nullable: true } + estimatedWarehouseArrivalAt: { type: string, format: date-time, nullable: true, description: 人工维护或入库计划冻结的整柜时间;未维护未建计划时为空,由页面按到港当地日期加两个自然日展示默认日期 } actualWarehouseArrivalAt: { type: string, format: date-time, nullable: true, description: 海外 PDA 首次开始收货时间 } - version: { type: integer, minimum: 0 } + version: { type: integer, minimum: -1, description: -1表示柜内时间版本不一致 } + planCount: { type: integer, format: int64, minimum: 0, description: 整柜已有入库计划数量;非零时禁止默认推算及改期 } ContainerPlanProgressDetail: type: object required: [summary, orders] diff --git a/lastleg-service/src/test/java/com/baiyue/lastleg/calendar/WarehouseCalendarMapperTest.java b/lastleg-service/src/test/java/com/baiyue/lastleg/calendar/WarehouseCalendarMapperTest.java index 2e84dc2b9..a71d9901c 100644 --- a/lastleg-service/src/test/java/com/baiyue/lastleg/calendar/WarehouseCalendarMapperTest.java +++ b/lastleg-service/src/test/java/com/baiyue/lastleg/calendar/WarehouseCalendarMapperTest.java @@ -2,6 +2,7 @@ package com.baiyue.lastleg.calendar; import com.baomidou.mybatisplus.core.MybatisConfiguration; import com.baomidou.mybatisplus.core.MybatisSqlSessionFactoryBuilder; +import com.baiyue.lastleg.mapper.LastlegOrderMapper; import org.apache.ibatis.mapping.Environment; import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; import org.h2.jdbcx.JdbcDataSource; @@ -28,12 +29,23 @@ class WarehouseCalendarMapperTest { } var config=new MybatisConfiguration(); config.setEnvironment(new Environment("test",new JdbcTransactionFactory(),ds)); config.addMapper(WarehouseCalendarMapper.class); + config.addMapper(LastlegOrderMapper.class); try(var session=new MybatisSqlSessionFactoryBuilder().build(config).openSession()) { var rows=session.getMapper(WarehouseCalendarMapper.class).calendar(LocalDateTime.parse("2026-11-01T00:00:00"),LocalDateTime.parse("2026-12-01T00:00:00"),List.of("1")); assertEquals(3,rows.size()); assertEquals("1",rows.get(0).sourceContainerBookingId()); assertNull(rows.get(0).plannedAt()); assertEquals(2,rows.get(1).version()); assertEquals("2026-11-10T09:00",rows.get(1).plannedAt().toString()); assertEquals(1,rows.get(2).planCount()); assertNotNull(rows.get(2).plannedAt()); + // 清关提柜与日历必须读取相同的人工/冻结事实,默认日期由前端统一推算。 + var customs=session.getMapper(LastlegOrderMapper.class).findContainerArrivalTimes(List.of("1","2","3")); + assertEquals(3,customs.size()); + for(var calendar:rows) { + var arrival=customs.stream().filter(row -> row.sourceContainerBookingId().equals(calendar.sourceContainerBookingId())).findFirst().orElseThrow(); + assertEquals(calendar.plannedAt(),arrival.estimatedWarehouseArrivalAt()); + assertEquals(calendar.actualAt(),arrival.actualWarehouseArrivalAt()); + assertEquals(calendar.version(),arrival.version()); + assertEquals(calendar.planCount(),arrival.planCount()); + } } } } diff --git a/lastleg-service/src/test/java/com/baiyue/lastleg/service/LastlegOrderServiceTest.java b/lastleg-service/src/test/java/com/baiyue/lastleg/service/LastlegOrderServiceTest.java index 61b4a81dd..ddd8685d2 100644 --- a/lastleg-service/src/test/java/com/baiyue/lastleg/service/LastlegOrderServiceTest.java +++ b/lastleg-service/src/test/java/com/baiyue/lastleg/service/LastlegOrderServiceTest.java @@ -148,7 +148,7 @@ class LastlegOrderServiceTest { when(orders.countContainerPlans("BOOKING-1")).thenReturn(0L); when(orders.updateContainerExpectedWarehouseArrival("BOOKING-1", estimatedAt, 0)).thenReturn(2); when(orders.findContainerArrivalTimes(List.of("BOOKING-1"))).thenReturn(List.of( - new ContainerArrivalTimeView("BOOKING-1", estimatedAt, null, 1))); + new ContainerArrivalTimeView("BOOKING-1", estimatedAt, null, 1, 0))); ContainerArrivalTimeView result = service.changeExpectedWarehouseArrival("BOOKING-1", "arrival-1", new LastlegOrderRequests.ChangeExpectedWarehouseArrival(estimatedAt, 0, null), "admin");