2026-08-19 16:24:02 +08:00
|
|
|
package com.baiyue.lastleg.mapper;
|
|
|
|
|
|
|
|
|
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
|
|
|
|
import com.baiyue.lastleg.entity.LastlegOrder;
|
2026-08-27 17:16:33 +08:00
|
|
|
import com.baiyue.lastleg.dto.LastlegOrderRequests;
|
2026-08-28 13:54:32 +08:00
|
|
|
import com.baiyue.lastleg.dto.ContainerPlanProgressDetail;
|
|
|
|
|
import com.baiyue.lastleg.dto.ContainerPlanProgressSummary;
|
2026-08-19 16:24:02 +08:00
|
|
|
import org.apache.ibatis.annotations.Mapper;
|
|
|
|
|
import org.apache.ibatis.annotations.Param;
|
|
|
|
|
import org.apache.ibatis.annotations.Select;
|
|
|
|
|
import org.apache.ibatis.annotations.Update;
|
|
|
|
|
|
2026-08-27 17:16:33 +08:00
|
|
|
import java.util.List;
|
|
|
|
|
|
2026-08-19 16:24:02 +08:00
|
|
|
@Mapper
|
|
|
|
|
public interface LastlegOrderMapper extends BaseMapper<LastlegOrder> {
|
2026-08-28 13:54:32 +08:00
|
|
|
String CONTAINER_PROGRESS_FILTER = " FROM ll_order o LEFT JOIN ll_inbound_plan p " +
|
|
|
|
|
"ON p.customer_id=o.customer_id AND p.source_order_id=o.id " +
|
2026-08-27 17:16:33 +08:00
|
|
|
"WHERE o.source_container_booking_id IS NOT NULL AND o.source_container_booking_id<>'' " +
|
|
|
|
|
"<if test='q.containerNo != null and q.containerNo != \"\"'>AND o.container_no LIKE CONCAT('%',#{q.containerNo},'%') </if>" +
|
|
|
|
|
"<if test='q.createdFrom != null'>AND o.created_at >=#{q.createdFrom} </if>" +
|
|
|
|
|
"<if test='q.createdTo != null'>AND o.created_at <=#{q.createdTo} </if>" +
|
2026-09-02 14:39:28 +08:00
|
|
|
"GROUP BY o.source_container_booking_id " +
|
|
|
|
|
"HAVING SUM(CASE WHEN NULLIF(TRIM(o.inbound_code),'') IS NULL THEN 1 ELSE 0 END)>0 " +
|
|
|
|
|
"OR SUM(CASE WHEN p.id IS NULL OR NULLIF(TRIM(p.plan_no),'') IS NULL " +
|
|
|
|
|
"OR NULLIF(TRIM(p.status),'') IS NULL THEN 1 ELSE 0 END)>0 " +
|
|
|
|
|
"OR COUNT(DISTINCT p.id)<>COUNT(*) " +
|
|
|
|
|
"OR COUNT(NULLIF(o.container_no,''))<>COUNT(*) " +
|
|
|
|
|
"OR COUNT(DISTINCT NULLIF(o.container_no,''))<>1 ";
|
2026-08-27 17:16:33 +08:00
|
|
|
|
2026-08-28 13:54:32 +08:00
|
|
|
String CONTAINER_PROGRESS_COLUMNS = "SELECT o.source_container_booking_id AS sourceContainerBookingId," +
|
|
|
|
|
"CASE WHEN COUNT(NULLIF(o.container_no,''))=COUNT(*) AND COUNT(DISTINCT NULLIF(o.container_no,''))=1 " +
|
|
|
|
|
"THEN MAX(NULLIF(o.container_no,'')) ELSE NULL END AS containerNo," +
|
|
|
|
|
"COUNT(*) AS totalOrderCount,COUNT(DISTINCT NULLIF(TRIM(o.inbound_code),'')) AS inboundCodeCount," +
|
|
|
|
|
"SUM(CASE WHEN NULLIF(TRIM(o.inbound_code),'') IS NULL THEN 1 ELSE 0 END) AS missingInboundCodeCount," +
|
|
|
|
|
"COUNT(DISTINCT p.id) AS planCount," +
|
|
|
|
|
"COUNT(DISTINCT CASE WHEN p.id IS NOT NULL AND NULLIF(TRIM(p.plan_no),'') IS NOT NULL " +
|
|
|
|
|
"AND NULLIF(TRIM(p.status),'') IS NOT NULL THEN NULLIF(TRIM(o.inbound_code),'') END) AS plannedInboundCodeCount," +
|
|
|
|
|
"SUM(CASE WHEN p.id IS NULL OR NULLIF(TRIM(p.plan_no),'') IS NULL OR NULLIF(TRIM(p.status),'') IS NULL " +
|
|
|
|
|
"THEN 1 ELSE 0 END) AS pendingPlanCount," +
|
|
|
|
|
"CASE WHEN COUNT(o.estimated_warehouse_at)=COUNT(*) " +
|
|
|
|
|
"AND COUNT(DISTINCT o.estimated_warehouse_at)=1 THEN MAX(o.estimated_warehouse_at) ELSE NULL END AS plannedArrivalAt," +
|
|
|
|
|
"CASE WHEN SUM(CASE WHEN NULLIF(TRIM(o.inbound_code),'') IS NULL THEN 1 ELSE 0 END)=0 " +
|
|
|
|
|
"AND SUM(CASE WHEN p.id IS NULL OR NULLIF(TRIM(p.plan_no),'') IS NULL OR NULLIF(TRIM(p.status),'') IS NULL " +
|
|
|
|
|
"THEN 1 ELSE 0 END)=0 AND COUNT(DISTINCT p.id)=COUNT(*) " +
|
2026-08-27 17:16:33 +08:00
|
|
|
"AND COUNT(NULLIF(o.container_no,''))=COUNT(*) AND COUNT(DISTINCT NULLIF(o.container_no,''))=1 " +
|
2026-08-28 13:54:32 +08:00
|
|
|
"THEN TRUE ELSE FALSE END AS allPlansReady," +
|
2026-08-27 17:16:33 +08:00
|
|
|
"CASE WHEN COUNT(NULLIF(o.container_no,''))<>COUNT(*) " +
|
|
|
|
|
"OR COUNT(DISTINCT NULLIF(o.container_no,''))<>1 THEN '柜号缺失或不一致' " +
|
2026-08-28 13:54:32 +08:00
|
|
|
"WHEN SUM(CASE WHEN NULLIF(TRIM(o.inbound_code),'') IS NULL THEN 1 ELSE 0 END)>0 " +
|
|
|
|
|
"THEN CONCAT('存在',SUM(CASE WHEN NULLIF(TRIM(o.inbound_code),'') IS NULL THEN 1 ELSE 0 END),'票缺少入仓码') " +
|
|
|
|
|
"WHEN SUM(CASE WHEN p.id IS NULL OR NULLIF(TRIM(p.plan_no),'') IS NULL OR NULLIF(TRIM(p.status),'') IS NULL " +
|
|
|
|
|
"THEN 1 ELSE 0 END)>0 THEN CONCAT('存在',SUM(CASE WHEN p.id IS NULL OR NULLIF(TRIM(p.plan_no),'') IS NULL " +
|
|
|
|
|
"OR NULLIF(TRIM(p.status),'') IS NULL THEN 1 ELSE 0 END),'票尚未生成有效入库计划') " +
|
|
|
|
|
"WHEN COUNT(DISTINCT p.id)<>COUNT(*) THEN '入库计划与尾程订单关联不一致' ELSE NULL END AS blockingReason ";
|
|
|
|
|
|
|
|
|
|
@Select("<script>SELECT progress.* FROM (" + CONTAINER_PROGRESS_COLUMNS + CONTAINER_PROGRESS_FILTER +
|
|
|
|
|
") progress ORDER BY CASE WHEN progress.plannedArrivalAt IS NULL THEN 1 ELSE 0 END," +
|
|
|
|
|
"progress.plannedArrivalAt ASC,progress.sourceContainerBookingId ASC LIMIT #{limit} OFFSET #{offset}</script>")
|
|
|
|
|
List<ContainerPlanProgressSummary> pageContainerProgress(
|
|
|
|
|
@Param("q") LastlegOrderRequests.ContainerProgressQuery query,
|
|
|
|
|
@Param("offset") long offset,
|
|
|
|
|
@Param("limit") long limit);
|
2026-08-27 17:16:33 +08:00
|
|
|
|
|
|
|
|
@Select("<script>SELECT COUNT(*) FROM (SELECT o.source_container_booking_id" +
|
2026-08-28 13:54:32 +08:00
|
|
|
CONTAINER_PROGRESS_FILTER + ") container_progress</script>")
|
|
|
|
|
long countContainerProgress(@Param("q") LastlegOrderRequests.ContainerProgressQuery query);
|
|
|
|
|
|
|
|
|
|
@Select("<script>" + CONTAINER_PROGRESS_COLUMNS + " FROM ll_order o LEFT JOIN ll_inbound_plan p " +
|
|
|
|
|
"ON p.customer_id=o.customer_id AND p.source_order_id=o.id " +
|
|
|
|
|
"WHERE o.source_container_booking_id=#{sourceContainerBookingId} GROUP BY o.source_container_booking_id</script>")
|
|
|
|
|
ContainerPlanProgressSummary findContainerProgress(
|
|
|
|
|
@Param("sourceContainerBookingId") String sourceContainerBookingId);
|
|
|
|
|
|
|
|
|
|
@Select("SELECT o.id AS orderId,o.customer_id AS customerId,o.order_no AS orderNo,o.inbound_code AS inboundCode," +
|
|
|
|
|
"o.current_status AS orderStatus,p.id AS planId,p.plan_no AS planNo,p.status AS planStatus," +
|
|
|
|
|
"CASE WHEN p.id IS NOT NULL AND NULLIF(TRIM(p.plan_no),'') IS NOT NULL " +
|
|
|
|
|
"AND NULLIF(TRIM(p.status),'') IS NOT NULL THEN TRUE ELSE FALSE END AS planValid," +
|
|
|
|
|
"o.estimated_warehouse_at AS plannedArrivalAt FROM ll_order o LEFT JOIN ll_inbound_plan p " +
|
|
|
|
|
"ON p.customer_id=o.customer_id AND p.source_order_id=o.id " +
|
|
|
|
|
"WHERE o.source_container_booking_id=#{sourceContainerBookingId} " +
|
|
|
|
|
"ORDER BY CASE WHEN o.estimated_warehouse_at IS NULL THEN 1 ELSE 0 END," +
|
|
|
|
|
"o.estimated_warehouse_at ASC,o.customer_id ASC,o.id ASC")
|
|
|
|
|
List<ContainerPlanProgressDetail.Item> findContainerProgressItems(
|
|
|
|
|
@Param("sourceContainerBookingId") String sourceContainerBookingId);
|
2026-08-27 17:16:33 +08:00
|
|
|
|
2026-08-19 16:24:02 +08:00
|
|
|
@Select("SELECT * FROM ll_order WHERE customer_id=#{customerId} AND source_region=#{sourceRegion} " +
|
|
|
|
|
"AND source_inbound_id=#{sourceInboundId} LIMIT 1")
|
|
|
|
|
LastlegOrder findSource(@Param("customerId") String customerId,
|
|
|
|
|
@Param("sourceRegion") String sourceRegion,
|
|
|
|
|
@Param("sourceInboundId") String sourceInboundId);
|
|
|
|
|
|
2026-08-31 12:13:20 +08:00
|
|
|
@Select("SELECT container_no FROM ll_order WHERE source_container_booking_id=#{sourceContainerBookingId} " +
|
|
|
|
|
"ORDER BY customer_id,id FOR UPDATE")
|
|
|
|
|
List<String> lockContainerNumbers(
|
|
|
|
|
@Param("sourceContainerBookingId") String sourceContainerBookingId);
|
|
|
|
|
|
2026-08-19 16:24:02 +08:00
|
|
|
@Select("SELECT COUNT(*) FROM ll_order WHERE customer_id=#{customerId} AND container_no=#{containerNo}")
|
|
|
|
|
long countContainer(@Param("customerId") String customerId, @Param("containerNo") String containerNo);
|
|
|
|
|
|
|
|
|
|
@Select("SELECT * FROM ll_order WHERE customer_id=#{customerId} AND id=#{id} FOR UPDATE")
|
|
|
|
|
LastlegOrder lockById(@Param("customerId") String customerId, @Param("id") Long id);
|
|
|
|
|
|
|
|
|
|
@Update("UPDATE ll_order SET picked_package_count=picked_package_count+#{packages},updated_at=NOW() " +
|
|
|
|
|
"WHERE customer_id=#{customerId} AND id=#{id} " +
|
|
|
|
|
"AND package_count-shipped_package_count-picked_package_count >= #{packages}")
|
|
|
|
|
int increasePicked(@Param("customerId") String customerId, @Param("id") Long id,
|
|
|
|
|
@Param("packages") long packages);
|
|
|
|
|
|
|
|
|
|
@Update("UPDATE ll_order SET current_status=CASE WHEN shipped_package_count+#{packages}=package_count " +
|
|
|
|
|
"THEN 'COMPLETED' ELSE 'PARTIALLY_SHIPPED' END," +
|
|
|
|
|
"picked_package_count=picked_package_count-#{packages}," +
|
|
|
|
|
"shipped_package_count=shipped_package_count+#{packages},outbound_order_no=#{outboundNo},updated_at=NOW() " +
|
|
|
|
|
"WHERE customer_id=#{customerId} AND id=#{id} AND picked_package_count >= #{packages} " +
|
|
|
|
|
"AND shipped_package_count+#{packages} <= package_count")
|
|
|
|
|
int transferPickedToShipped(@Param("customerId") String customerId, @Param("id") Long id,
|
|
|
|
|
@Param("packages") long packages, @Param("outboundNo") String outboundNo);
|
2026-08-24 21:46:19 +08:00
|
|
|
|
|
|
|
|
@Update("UPDATE ll_order SET overseas_warehouse_id=#{warehouseId},overseas_warehouse_name=#{warehouseName}," +
|
|
|
|
|
"updated_at=NOW(3) WHERE id=#{orderId} AND customer_id=#{customerId} " +
|
|
|
|
|
"AND (overseas_warehouse_id IS NULL OR overseas_warehouse_id=#{warehouseId})")
|
|
|
|
|
int claimReceivingWarehouse(@Param("customerId") String customerId, @Param("orderId") long orderId,
|
|
|
|
|
@Param("warehouseId") String warehouseId,
|
|
|
|
|
@Param("warehouseName") String warehouseName);
|
2026-08-19 16:24:02 +08:00
|
|
|
}
|