233 lines
19 KiB
Java
233 lines
19 KiB
Java
package com.baiyue.firstleg.mapper;
|
|
|
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
import com.baiyue.firstleg.dto.ContainerDtos.Query;
|
|
import com.baiyue.firstleg.entity.ContainerBookingEntity;
|
|
import org.apache.ibatis.annotations.Mapper;
|
|
import org.apache.ibatis.annotations.Param;
|
|
import org.apache.ibatis.annotations.Select;
|
|
import org.apache.ibatis.annotations.Update;
|
|
|
|
@Mapper
|
|
public interface ContainerBookingMapper extends BaseMapper<ContainerBookingEntity> {
|
|
@Update("UPDATE fl_container_booking SET container_no=#{containerNo},ocean_booking_id=#{oceanBookingId},ocean_booking_requirement_id=#{requirementId},record_status='ACTIVE',bill_of_lading_no=#{billOfLadingNo},vessel_name=#{vesselName},voyage_no=#{voyageNo},shipping_company_id=#{shippingCompanyId},shipping_company_name=#{shippingCompanyName},departure_port_code=#{departurePortCode},departure_port_name=#{departurePortName},destination_port_code=#{destinationPortCode},destination_port_name=#{destinationPortName},customer_id=#{customerId},customer_name=#{customerName},estimated_sailing_at=#{estimatedSailingAt},estimated_port_arrival_at=#{estimatedPortArrivalAt},updated_by=#{operatorId},updated_by_name=#{operatorName},updated_at=NOW(),version=version+1 WHERE id=#{id} AND version=#{version} AND source_type='SIMULATION' AND record_status='ACTIVE' AND ocean_booking_id IS NULL")
|
|
int linkReleasedBooking(@Param("id") long id, @Param("oceanBookingId") long oceanBookingId, @Param("requirementId") long requirementId, @Param("containerNo") String containerNo, @Param("billOfLadingNo") String billOfLadingNo, @Param("vesselName") String vesselName, @Param("voyageNo") String voyageNo, @Param("shippingCompanyId") Long shippingCompanyId, @Param("shippingCompanyName") String shippingCompanyName, @Param("departurePortCode") String departurePortCode, @Param("departurePortName") String departurePortName, @Param("destinationPortCode") String destinationPortCode, @Param("destinationPortName") String destinationPortName, @Param("customerId") Long customerId, @Param("customerName") String customerName, @Param("estimatedSailingAt") java.time.LocalDateTime estimatedSailingAt, @Param("estimatedPortArrivalAt") java.time.LocalDateTime estimatedPortArrivalAt, @Param("version") int version, @Param("operatorId") long operatorId, @Param("operatorName") String operatorName);
|
|
@Update("""
|
|
UPDATE fl_container_booking SET container_no=#{containerNo},updated_by=#{operatorId},
|
|
updated_by_name=#{operatorName},updated_at=CURRENT_TIMESTAMP(3),version=version+1
|
|
WHERE id=#{id} AND version=#{version} AND source_type='SIMULATION' AND record_status='ACTIVE'
|
|
AND container_no IS NULL AND ocean_booking_id IS NOT NULL AND ocean_booking_requirement_id IS NOT NULL
|
|
AND NOT EXISTS (SELECT 1 FROM fl_loading_plan p WHERE p.container_booking_id=fl_container_booking.id
|
|
AND p.plan_status NOT IN ('EDITING'))
|
|
AND NOT EXISTS (SELECT 1 FROM fl_loading_pick_task t WHERE t.container_booking_id=fl_container_booking.id)
|
|
AND NOT EXISTS (SELECT 1 FROM fl_loading_cabinet_evidence e WHERE e.container_booking_id=fl_container_booking.id)
|
|
AND NOT EXISTS (SELECT 1 FROM fl_container_document d WHERE d.container_booking_id=fl_container_booking.id)
|
|
""")
|
|
int assignRealContainerNo(@Param("id") long id, @Param("containerNo") String containerNo,
|
|
@Param("version") int version, @Param("operatorId") long operatorId,
|
|
@Param("operatorName") String operatorName);
|
|
@Select("""
|
|
<script>
|
|
SELECT b.*, p.id AS plan_id, p.plan_no AS plan_no,
|
|
CASE WHEN p.plan_status = 'COMPLETED' THEN COALESCE(p.confirmed_at, p.updated_at) END AS completed_loading_at,
|
|
CASE WHEN (SELECT eh.action FROM fl_container_exception_history eh
|
|
WHERE eh.container_booking_id=b.id ORDER BY eh.occurred_at DESC,eh.id DESC LIMIT 1)='MARK'
|
|
THEN TRUE ELSE FALSE END AS exception_active,
|
|
COALESCE((SELECT CASE WHEN d.completed_at IS NOT NULL THEN 'COMPLETED' ELSE 'UPLOADED' END
|
|
FROM fl_container_document d WHERE d.container_booking_id=b.id
|
|
AND d.document_type='DESTINATION_CLEARANCE' LIMIT 1),'MISSING') AS destination_clearance_document_status,
|
|
COALESCE((SELECT c.status FROM fl_customs_container c WHERE c.container_booking_id=b.id LIMIT 1),'MISSING') AS customs_declaration_document_status,
|
|
COALESCE((SELECT 'UPLOADED' FROM fl_container_document d WHERE d.container_booking_id=b.id
|
|
AND d.document_type='DELIVERY_ORDER' LIMIT 1),'MISSING') AS delivery_order_document_status,
|
|
COALESCE((SELECT CASE WHEN MIN(d.confirmed_at) IS NOT NULL
|
|
AND MAX(d.reversed_at) IS NULL THEN 'DEPARTED'
|
|
ELSE MIN(d.status) END
|
|
FROM fl_outbound_dispatch d WHERE d.container_booking_id=b.id),'NOT_CREATED')
|
|
AS outbound_dispatch_status,
|
|
(SELECT MIN(d.confirmed_at) FROM fl_outbound_dispatch d
|
|
WHERE d.container_booking_id=b.id AND d.confirmed_at IS NOT NULL
|
|
AND d.reversed_at IS NULL AND d.status='WAITING_FOR_LOADING') AS outbound_confirmed_at,
|
|
CASE WHEN p.id IS NULL THEN 'WAIT_LOADING'
|
|
WHEN p.plan_status != 'COMPLETED' AND NOT EXISTS (
|
|
SELECT 1 FROM fl_loading_plan_item active_item
|
|
WHERE active_item.loading_plan_id = p.id AND active_item.deleted = 0
|
|
) THEN 'WAIT_LOADING'
|
|
ELSE p.plan_status END AS plan_status
|
|
FROM fl_container_booking b LEFT JOIN fl_loading_plan p ON p.container_booking_id = b.id
|
|
WHERE b.record_status = 'ACTIVE'
|
|
AND (#{query.containerNo} IS NULL OR b.container_no = #{query.containerNo})
|
|
AND (#{query.cabinetNo} IS NULL OR b.cabinet_no = #{query.cabinetNo})
|
|
AND (#{query.billOfLadingNo} IS NULL OR b.bill_of_lading_no = #{query.billOfLadingNo})
|
|
AND (#{query.customerId} IS NULL OR b.customer_id = #{query.customerId} OR EXISTS (
|
|
SELECT 1 FROM fl_ocean_booking_container_allocation customer_allocation
|
|
JOIN fl_ocean_booking customer_booking ON customer_booking.id = customer_allocation.ocean_booking_id
|
|
WHERE customer_allocation.container_booking_id = b.id
|
|
AND customer_booking.customer_id = #{query.customerId}
|
|
) OR EXISTS (
|
|
SELECT 1 FROM fl_loading_plan_item customer_item
|
|
WHERE customer_item.loading_plan_id = p.id
|
|
AND customer_item.deleted = 0
|
|
AND customer_item.account_id = #{query.customerId}
|
|
))
|
|
AND (#{query.warehouseId} IS NULL OR b.warehouse_id = #{query.warehouseId})
|
|
AND (#{query.containerType} IS NULL OR b.container_type = #{query.containerType})
|
|
AND (#{query.shippingCompanyId} IS NULL OR b.shipping_company_id = #{query.shippingCompanyId})
|
|
AND (#{query.departurePortCode} IS NULL OR b.departure_port_code = #{query.departurePortCode})
|
|
AND (#{query.destinationPortCode} IS NULL OR b.destination_port_code = #{query.destinationPortCode})
|
|
AND (#{query.destinationWarehouseCode} IS NULL OR b.destination_warehouse_code = #{query.destinationWarehouseCode})
|
|
AND (#{query.status} IS NULL OR CASE WHEN p.id IS NULL THEN 'WAIT_LOADING'
|
|
WHEN p.plan_status != 'COMPLETED' AND NOT EXISTS (
|
|
SELECT 1 FROM fl_loading_plan_item active_item
|
|
WHERE active_item.loading_plan_id = p.id AND active_item.deleted = 0
|
|
) THEN 'WAIT_LOADING'
|
|
ELSE p.plan_status END = #{query.status})
|
|
AND (#{query.estimatedSailingFrom} IS NULL OR b.estimated_sailing_at >= #{query.estimatedSailingFrom})
|
|
AND (#{query.estimatedSailingTo} IS NULL OR b.estimated_sailing_at <= #{query.estimatedSailingTo})
|
|
AND ((#{workbench}='DOMESTIC' AND (
|
|
(#{query.scope}='ACTIVE' AND NOT EXISTS (
|
|
SELECT 1 FROM fl_outbound_dispatch departure
|
|
WHERE departure.container_booking_id=b.id
|
|
AND departure.confirmed_at IS NOT NULL AND departure.reversed_at IS NULL
|
|
AND departure.status='WAITING_FOR_LOADING'))
|
|
OR (#{query.scope}='HISTORY' AND EXISTS (
|
|
SELECT 1 FROM fl_outbound_dispatch departure
|
|
WHERE departure.container_booking_id=b.id
|
|
AND departure.confirmed_at IS NOT NULL AND departure.reversed_at IS NULL
|
|
AND departure.status='WAITING_FOR_LOADING'))))
|
|
OR (#{workbench}='OVERSEAS' AND EXISTS (
|
|
SELECT 1 FROM fl_outbound_dispatch departure
|
|
WHERE departure.container_booking_id=b.id
|
|
AND departure.confirmed_at IS NOT NULL AND departure.reversed_at IS NULL
|
|
AND departure.status='WAITING_FOR_LOADING')
|
|
AND ((#{query.scope}='ACTIVE' AND b.actual_empty_reported_at IS NULL)
|
|
OR (#{query.scope}='HISTORY' AND b.actual_empty_reported_at IS NOT NULL))))
|
|
AND (#{query.keyword} IS NULL OR b.container_no LIKE CONCAT('%', #{query.keyword}, '%')
|
|
OR b.cabinet_no LIKE CONCAT('%', #{query.keyword}, '%')
|
|
OR b.bill_of_lading_no LIKE CONCAT('%', #{query.keyword}, '%')
|
|
OR b.vessel_name LIKE CONCAT('%', #{query.keyword}, '%')
|
|
OR b.voyage_no LIKE CONCAT('%', #{query.keyword}, '%'))
|
|
ORDER BY b.updated_at DESC, b.id DESC
|
|
</script>
|
|
""")
|
|
Page<ContainerBookingEntity> selectBookingPage(Page<ContainerBookingEntity> page,
|
|
@Param("query") Query query,
|
|
@Param("workbench") String workbench);
|
|
|
|
@Select("""
|
|
SELECT b.*, p.id AS plan_id, p.plan_no AS plan_no,
|
|
CASE WHEN p.plan_status = 'COMPLETED' THEN COALESCE(p.confirmed_at, p.updated_at) END AS completed_loading_at,
|
|
CASE WHEN (SELECT eh.action FROM fl_container_exception_history eh
|
|
WHERE eh.container_booking_id=b.id ORDER BY eh.occurred_at DESC,eh.id DESC LIMIT 1)='MARK'
|
|
THEN TRUE ELSE FALSE END AS exception_active,
|
|
COALESCE((SELECT CASE WHEN d.completed_at IS NOT NULL THEN 'COMPLETED' ELSE 'UPLOADED' END
|
|
FROM fl_container_document d WHERE d.container_booking_id=b.id
|
|
AND d.document_type='DESTINATION_CLEARANCE' LIMIT 1),'MISSING') AS destination_clearance_document_status,
|
|
COALESCE((SELECT c.status FROM fl_customs_container c WHERE c.container_booking_id=b.id LIMIT 1),'MISSING') AS customs_declaration_document_status,
|
|
COALESCE((SELECT 'UPLOADED' FROM fl_container_document d WHERE d.container_booking_id=b.id
|
|
AND d.document_type='DELIVERY_ORDER' LIMIT 1),'MISSING') AS delivery_order_document_status,
|
|
COALESCE((SELECT CASE WHEN MIN(d.confirmed_at) IS NOT NULL
|
|
AND MAX(d.reversed_at) IS NULL THEN 'DEPARTED'
|
|
ELSE MIN(d.status) END
|
|
FROM fl_outbound_dispatch d WHERE d.container_booking_id=b.id),'NOT_CREATED')
|
|
AS outbound_dispatch_status,
|
|
(SELECT MIN(d.confirmed_at) FROM fl_outbound_dispatch d
|
|
WHERE d.container_booking_id=b.id AND d.confirmed_at IS NOT NULL
|
|
AND d.reversed_at IS NULL AND d.status='WAITING_FOR_LOADING') AS outbound_confirmed_at,
|
|
CASE WHEN p.id IS NULL THEN 'WAIT_LOADING'
|
|
WHEN p.plan_status != 'COMPLETED' AND NOT EXISTS (
|
|
SELECT 1 FROM fl_loading_plan_item active_item
|
|
WHERE active_item.loading_plan_id = p.id AND active_item.deleted = 0
|
|
) THEN 'WAIT_LOADING'
|
|
ELSE p.plan_status END AS plan_status
|
|
FROM fl_container_booking b LEFT JOIN fl_loading_plan p ON p.container_booking_id = b.id
|
|
WHERE b.id = #{id} AND b.record_status = 'ACTIVE'
|
|
""")
|
|
ContainerBookingEntity selectBooking(@Param("id") long id);
|
|
|
|
@Select("SELECT * FROM fl_container_booking WHERE id=#{id} FOR UPDATE")
|
|
ContainerBookingEntity selectBookingForUpdate(@Param("id") long id);
|
|
|
|
@Select("SELECT * FROM fl_container_booking WHERE id=#{id} AND record_status='ACTIVE' FOR UPDATE")
|
|
ContainerBookingEntity selectActiveBookingForUpdate(@Param("id") long id);
|
|
|
|
@Select("""
|
|
SELECT COUNT(1) FROM fl_outbound_dispatch
|
|
WHERE container_booking_id=#{id} AND confirmed_at IS NOT NULL AND reversed_at IS NULL
|
|
AND status='WAITING_FOR_LOADING'
|
|
""")
|
|
int hasActiveOutboundDeparture(@Param("id") long id);
|
|
|
|
/** 手动或拉取的实际开船节点均可作为清关资料入口依据。 */
|
|
@Select("""
|
|
SELECT COUNT(1) FROM fl_carrier_schedule_node_fact
|
|
WHERE container_booking_id=#{id} AND standard_node='DEPARTED_ORIGIN_PORT'
|
|
AND actual_at IS NOT NULL
|
|
""")
|
|
int hasActualVesselDeparture(@Param("id") long id);
|
|
|
|
@Update("""
|
|
UPDATE fl_container_booking SET pickup_code=#{pickupCode},pickup_code_updated_by=#{operatorId},
|
|
pickup_code_updated_by_name=#{operatorName},pickup_code_updated_at=CURRENT_TIMESTAMP(3),
|
|
updated_by=#{operatorId},updated_by_name=#{operatorName},updated_at=CURRENT_TIMESTAMP(3),version=version+1
|
|
WHERE id=#{id} AND record_status='ACTIVE' AND version=#{version}
|
|
""")
|
|
int updatePickupCode(@Param("id") long id, @Param("pickupCode") String pickupCode,
|
|
@Param("version") int version, @Param("operatorId") long operatorId,
|
|
@Param("operatorName") String operatorName);
|
|
|
|
@Update("""
|
|
UPDATE fl_container_booking SET unloading_completed_at=#{unloadingCompletedAt},
|
|
unloading_photo_uploaded_at=#{photoUploadedAt}, estimated_empty_reported_at=#{estimatedEmptyReportedAt},
|
|
actual_empty_reported_at=#{actualEmptyReportedAt}, empty_report_source_version=#{sourceVersion},
|
|
updated_by=0, updated_by_name='OVERSEAS_EVENT', updated_at=CURRENT_TIMESTAMP(3), version=version+1
|
|
WHERE id=#{id} AND record_status='ACTIVE'
|
|
AND (empty_report_source_version IS NULL OR empty_report_source_version < #{sourceVersion})
|
|
""")
|
|
int applyEmptyReport(@Param("id") long id,
|
|
@Param("unloadingCompletedAt") java.time.LocalDateTime unloadingCompletedAt,
|
|
@Param("photoUploadedAt") java.time.LocalDateTime photoUploadedAt,
|
|
@Param("estimatedEmptyReportedAt") java.time.LocalDateTime estimatedEmptyReportedAt,
|
|
@Param("actualEmptyReportedAt") java.time.LocalDateTime actualEmptyReportedAt,
|
|
@Param("sourceVersion") long sourceVersion);
|
|
|
|
@Update("""
|
|
UPDATE fl_container_booking SET
|
|
warehouse_id=#{value.warehouseId}, warehouse_name=#{value.warehouseName},
|
|
bill_of_lading_no=#{value.billOfLadingNo}, vessel_name=#{value.vesselName}, voyage_no=#{value.voyageNo},
|
|
container_type=#{value.containerType}, shipping_company_id=#{value.shippingCompanyId},
|
|
shipping_company_name=#{value.shippingCompanyName}, departure_port_code=#{value.departurePortCode},
|
|
departure_port_name=#{value.departurePortName}, destination_port_code=#{value.destinationPortCode},
|
|
destination_port_name=#{value.destinationPortName}, destination_warehouse_code=#{value.destinationWarehouseCode},
|
|
destination_warehouse_name=#{value.destinationWarehouseName}, capacity_cbm=#{value.capacityCbm},
|
|
max_weight_kg=#{value.maxWeightKg}, terminal_trucking_company_id=#{value.terminalTruckingCompanyId},
|
|
terminal_trucking_company=#{value.terminalTruckingCompany},
|
|
loading_at=#{value.loadingAt}, estimated_sailing_at=#{value.estimatedSailingAt},
|
|
actual_sailing_at=#{value.actualSailingAt}, estimated_port_arrival_at=#{value.estimatedPortArrivalAt},
|
|
actual_port_arrival_at=#{value.actualPortArrivalAt},
|
|
estimated_warehouse_arrival_at=#{value.estimatedWarehouseArrivalAt},
|
|
actual_warehouse_arrival_at=#{value.actualWarehouseArrivalAt}, updated_by=#{operatorId},
|
|
updated_by_name=#{operatorName}, updated_at=CURRENT_TIMESTAMP(3), version=version+1
|
|
WHERE id=#{value.id} AND version=#{expectedVersion}
|
|
AND NOT EXISTS (SELECT 1 FROM fl_loading_plan p
|
|
WHERE p.container_booking_id=fl_container_booking.id AND p.plan_status!='EDITING')
|
|
""")
|
|
int updateDraft(@Param("value") ContainerBookingEntity value, @Param("expectedVersion") int expectedVersion,
|
|
@Param("operatorId") long operatorId, @Param("operatorName") String operatorName);
|
|
@Select("SELECT COUNT(*) FROM fl_loading_plan WHERE container_booking_id=#{id}") int hasLoadingPlan(@Param("id") long id);
|
|
@Select("SELECT COUNT(*) FROM fl_loading_plan_item i JOIN fl_loading_plan p ON p.id=i.loading_plan_id WHERE p.container_booking_id=#{id} AND i.deleted=0") int hasActiveLoadingItems(@Param("id") long id);
|
|
@Select("SELECT COUNT(*) FROM fl_loading_pick_task t JOIN fl_loading_plan p ON p.id=t.loading_plan_id WHERE p.container_booking_id=#{id}") int hasPickTask(@Param("id") long id);
|
|
@Select("SELECT COUNT(*) FROM fl_loading_cabinet_evidence e WHERE e.container_booking_id=#{id} AND e.status='ACTIVE'") int hasEvidence(@Param("id") long id);
|
|
@Select("SELECT COUNT(*) FROM fl_container_document WHERE container_booking_id=#{id}") int hasDocuments(@Param("id") long id);
|
|
@Update("""
|
|
UPDATE fl_container_booking SET bill_of_lading_no=#{billOfLadingNo},vessel_name=#{vesselName},
|
|
voyage_no=#{voyageNo},estimated_sailing_at=#{estimatedSailingAt},updated_by=#{operatorId},
|
|
updated_by_name=#{operatorName},updated_at=CURRENT_TIMESTAMP(3),version=version+1
|
|
WHERE ocean_booking_id=#{oceanBookingId}
|
|
""")
|
|
int syncReleasedTransport(@Param("oceanBookingId") long oceanBookingId,
|
|
@Param("billOfLadingNo") String billOfLadingNo, @Param("vesselName") String vesselName,
|
|
@Param("voyageNo") String voyageNo, @Param("estimatedSailingAt") java.time.LocalDateTime estimatedSailingAt,
|
|
@Param("operatorId") long operatorId, @Param("operatorName") String operatorName);
|
|
}
|