52 lines
4.0 KiB
Java
52 lines
4.0 KiB
Java
package com.baiyue.lastleg.appointmentplanning;
|
|
|
|
import org.apache.ibatis.annotations.Mapper;
|
|
import org.apache.ibatis.annotations.Param;
|
|
import org.apache.ibatis.annotations.Select;
|
|
import java.util.List;
|
|
|
|
@Mapper
|
|
public interface AppointmentContainerMapper {
|
|
String FILTER = """
|
|
FROM ll_order o JOIN ll_container_shipping_gate g ON g.container_booking_id=o.source_container_booking_id
|
|
WHERE o.order_type='FIRST_LEG' AND o.current_status NOT IN ('CANCELLED','COMPLETED') AND g.node_sequence >=40
|
|
AND o.overseas_warehouse_id IN <foreach collection='origins' item='id' open='(' separator=',' close=')'>#{id}</foreach>
|
|
<if test='containerId != null'>AND o.source_container_booking_id=#{containerId}</if>
|
|
<if test='keyword != null'>AND EXISTS(SELECT 1 FROM ll_order search_o
|
|
WHERE search_o.source_container_booking_id=o.source_container_booking_id AND search_o.order_type='FIRST_LEG'
|
|
AND search_o.current_status NOT IN ('CANCELLED','COMPLETED') AND search_o.overseas_warehouse_id IN
|
|
<foreach collection='origins' item='id' open='(' separator=',' close=')'>#{id}</foreach>
|
|
AND (search_o.container_no LIKE CONCAT('%',#{keyword},'%') OR search_o.inbound_code LIKE CONCAT('%',#{keyword},'%')))</if>
|
|
""";
|
|
String GROUP = " GROUP BY o.source_container_booking_id,g.container_no,g.standard_node,g.aggregate_version ";
|
|
@Select("<script>SELECT COUNT(*) FROM (SELECT o.source_container_booking_id " + FILTER + GROUP + ") counted</script>")
|
|
long count(@Param("origins") List<String> origins, @Param("keyword") String keyword, @Param("containerId") String containerId);
|
|
|
|
@Select("<script>" + """
|
|
SELECT o.source_container_booking_id AS container_booking_id,g.container_no,
|
|
COUNT(*) AS order_count,COUNT(DISTINCT o.customer_id) AS customer_count,
|
|
SUM(CASE WHEN o.package_count IS NULL OR o.package_count<=0 THEN 1 ELSE 0 END) AS unknown_package_orders,
|
|
CASE WHEN SUM(CASE WHEN o.package_count IS NULL OR o.package_count<=0 THEN 1 ELSE 0 END)>0
|
|
THEN NULL ELSE SUM(o.package_count) END AS packages,
|
|
MIN(o.estimated_arrival_at) AS earliest_arrival_at,MAX(o.estimated_arrival_at) AS latest_arrival_at,
|
|
g.standard_node,g.aggregate_version AS source_version,
|
|
EXISTS(SELECT 1 FROM ll_order other_o WHERE other_o.source_container_booking_id=o.source_container_booking_id
|
|
AND other_o.order_type='FIRST_LEG' AND other_o.current_status NOT IN ('CANCELLED','COMPLETED')
|
|
AND (other_o.overseas_warehouse_id IS NULL OR other_o.overseas_warehouse_id NOT IN
|
|
<foreach collection='origins' item='id' open='(' separator=',' close=')'>#{id}</foreach>)) AS incomplete_scope
|
|
""" + FILTER + GROUP + " ORDER BY MAX(o.created_at) DESC,o.source_container_booking_id LIMIT #{size} OFFSET #{offset}</script>")
|
|
List<AppointmentContainer> page(@Param("origins") List<String> origins, @Param("keyword") String keyword,
|
|
@Param("containerId") String containerId, @Param("size") int size, @Param("offset") long offset);
|
|
|
|
@Select("<script>" + """
|
|
SELECT o.source_container_booking_id AS containerBookingId,o.overseas_warehouse_id AS warehouseId,
|
|
COUNT(*) AS orderCount,COUNT(DISTINCT o.customer_id) AS customerCount
|
|
FROM ll_order o WHERE o.order_type='FIRST_LEG' AND o.current_status NOT IN ('CANCELLED','COMPLETED')
|
|
AND o.source_container_booking_id IN <foreach collection='containers' item='id' open='(' separator=',' close=')'>#{id}</foreach>
|
|
AND o.overseas_warehouse_id IN <foreach collection='origins' item='id' open='(' separator=',' close=')'>#{id}</foreach>
|
|
GROUP BY o.source_container_booking_id,o.overseas_warehouse_id ORDER BY o.source_container_booking_id,o.overseas_warehouse_id
|
|
""" + "</script>")
|
|
List<WarehouseCount> warehouses(@Param("origins") List<String> origins, @Param("containers") List<String> containers);
|
|
record WarehouseCount(String containerBookingId, String warehouseId, long orderCount, long customerCount) { }
|
|
}
|