2026-08-06 15:48:21 +08:00
|
|
|
package com.baiyue.firstleg.mapper;
|
|
|
|
|
|
|
|
|
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
|
|
|
|
import com.baiyue.firstleg.entity.LoadingPickItemEntity;
|
|
|
|
|
import org.apache.ibatis.annotations.Mapper;
|
|
|
|
|
import org.apache.ibatis.annotations.Param;
|
2026-08-06 17:48:50 +08:00
|
|
|
import org.apache.ibatis.annotations.Select;
|
2026-08-06 15:48:21 +08:00
|
|
|
import org.apache.ibatis.annotations.Update;
|
|
|
|
|
|
2026-08-11 20:39:28 +08:00
|
|
|
import java.util.List;
|
|
|
|
|
|
2026-08-06 15:48:21 +08:00
|
|
|
@Mapper
|
|
|
|
|
public interface LoadingPickItemMapper extends BaseMapper<LoadingPickItemEntity> {
|
2026-08-11 20:39:28 +08:00
|
|
|
@Select("""
|
|
|
|
|
SELECT pick_item.id AS pickItemId, plan_item.order_no AS orderNo,
|
|
|
|
|
plan_item.inbound_code AS inboundCode, label.cargo_name AS cargoName,
|
|
|
|
|
label.box_code AS boxCode
|
|
|
|
|
FROM fl_loading_pick_item pick_item
|
|
|
|
|
JOIN fl_loading_plan_item plan_item ON plan_item.id = pick_item.loading_plan_item_id
|
|
|
|
|
JOIN fl_inbound_carton_label label ON label.tenant_id = plan_item.account_id
|
|
|
|
|
AND label.inbound_id = plan_item.inbound_id
|
|
|
|
|
AND label.inbound_detail_id = plan_item.inbound_detail_id
|
|
|
|
|
WHERE pick_item.pick_task_id = #{taskId} AND plan_item.deleted = 0
|
|
|
|
|
ORDER BY pick_item.id, label.carton_index
|
|
|
|
|
""")
|
|
|
|
|
List<CartonLabelRow> selectTaskCartonLabels(@Param("taskId") long taskId);
|
|
|
|
|
|
|
|
|
|
interface CartonLabelRow {
|
|
|
|
|
Long getPickItemId();
|
|
|
|
|
String getOrderNo();
|
|
|
|
|
String getInboundCode();
|
|
|
|
|
String getCargoName();
|
|
|
|
|
String getBoxCode();
|
|
|
|
|
}
|
|
|
|
|
|
2026-08-09 11:21:38 +08:00
|
|
|
@Update("UPDATE fl_loading_plan_item SET package_count=#{pickedCount},updated_by=#{operatorId},"
|
|
|
|
|
+ "updated_by_name=#{operatorName},version=version+1 WHERE id=#{planItemId} AND deleted=0 "
|
|
|
|
|
+ "AND package_count=#{plannedCount}")
|
|
|
|
|
int settlePartialPlanItem(@Param("planItemId") long planItemId,
|
|
|
|
|
@Param("pickedCount") int pickedCount,
|
|
|
|
|
@Param("plannedCount") int plannedCount,
|
|
|
|
|
@Param("operatorId") long operatorId,
|
|
|
|
|
@Param("operatorName") String operatorName);
|
|
|
|
|
|
|
|
|
|
@Update("UPDATE fl_loading_pick_item SET planned_package_count=picked_package_count,"
|
|
|
|
|
+ "item_status='PICKED',version=version+1 WHERE id=#{itemId} AND item_status='PARTIAL' "
|
|
|
|
|
+ "AND picked_package_count>0 AND picked_package_count<planned_package_count")
|
|
|
|
|
int settlePartialPickItem(@Param("itemId") long itemId);
|
|
|
|
|
|
|
|
|
|
@Update("UPDATE fl_loading_plan_item SET deleted=1,removed_by=#{operatorId},"
|
|
|
|
|
+ "removed_by_name=#{operatorName},removed_at=CURRENT_TIMESTAMP(3),updated_by=#{operatorId},"
|
|
|
|
|
+ "updated_by_name=#{operatorName},version=version+1 WHERE id=#{planItemId} AND deleted=0 "
|
|
|
|
|
+ "AND EXISTS (SELECT 1 FROM fl_loading_pick_item pick_item WHERE pick_item.loading_plan_item_id=#{planItemId} "
|
|
|
|
|
+ "AND pick_item.item_status='SKIPPED' AND pick_item.picked_package_count=0)")
|
|
|
|
|
int settleSkippedPlanItem(@Param("planItemId") long planItemId,
|
|
|
|
|
@Param("operatorId") long operatorId,
|
|
|
|
|
@Param("operatorName") String operatorName);
|
|
|
|
|
|
|
|
|
|
@Select("""
|
|
|
|
|
SELECT COALESCE(SUM(plan_item.package_count),0) expectedCount,
|
|
|
|
|
COALESCE(SUM(pick_item.picked_package_count),0) pickedCount,
|
|
|
|
|
COUNT(DISTINCT pick_task.id) taskCount,
|
|
|
|
|
COUNT(DISTINCT CASE WHEN pick_task.task_status='COMPLETED' THEN pick_task.id END) completedTaskCount,
|
|
|
|
|
SUM(CASE WHEN pick_item.id IS NULL OR pick_item.picked_package_count<>plan_item.package_count THEN 1 ELSE 0 END) unresolvedCount
|
|
|
|
|
FROM fl_loading_plan_item plan_item
|
|
|
|
|
JOIN fl_inbound_order inbound_order ON inbound_order.id=plan_item.inbound_id
|
|
|
|
|
AND inbound_order.tenant_id=#{tenantId} AND inbound_order.deleted=0
|
|
|
|
|
LEFT JOIN fl_loading_pick_item pick_item ON pick_item.loading_plan_item_id=plan_item.id
|
|
|
|
|
LEFT JOIN fl_loading_pick_task pick_task ON pick_task.id=pick_item.pick_task_id
|
|
|
|
|
WHERE plan_item.account_id=#{tenantId} AND plan_item.inbound_id=#{inboundId} AND plan_item.deleted=0
|
|
|
|
|
""")
|
|
|
|
|
InboundProgress selectInboundProgress(@Param("tenantId") long tenantId,
|
|
|
|
|
@Param("inboundId") long inboundId);
|
|
|
|
|
|
2026-08-10 14:31:03 +08:00
|
|
|
class InboundProgress {
|
|
|
|
|
private Integer expectedCount;
|
|
|
|
|
private Integer pickedCount;
|
|
|
|
|
private Integer taskCount;
|
|
|
|
|
private Integer completedTaskCount;
|
|
|
|
|
private Integer unresolvedCount;
|
|
|
|
|
|
|
|
|
|
public Integer getExpectedCount() { return expectedCount; }
|
|
|
|
|
public void setExpectedCount(Integer expectedCount) { this.expectedCount = expectedCount; }
|
|
|
|
|
public Integer getPickedCount() { return pickedCount; }
|
|
|
|
|
public void setPickedCount(Integer pickedCount) { this.pickedCount = pickedCount; }
|
|
|
|
|
public Integer getTaskCount() { return taskCount; }
|
|
|
|
|
public void setTaskCount(Integer taskCount) { this.taskCount = taskCount; }
|
|
|
|
|
public Integer getCompletedTaskCount() { return completedTaskCount; }
|
|
|
|
|
public void setCompletedTaskCount(Integer completedTaskCount) { this.completedTaskCount = completedTaskCount; }
|
|
|
|
|
public Integer getUnresolvedCount() { return unresolvedCount; }
|
|
|
|
|
public void setUnresolvedCount(Integer unresolvedCount) { this.unresolvedCount = unresolvedCount; }
|
2026-08-09 11:21:38 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Select("""
|
|
|
|
|
SELECT DISTINCT plan_item.account_id tenantId,plan_item.inbound_id inboundId
|
|
|
|
|
FROM fl_loading_pick_item pick_item
|
|
|
|
|
JOIN fl_loading_plan_item plan_item ON plan_item.id=pick_item.loading_plan_item_id
|
|
|
|
|
WHERE pick_item.pick_task_id=#{taskId}
|
|
|
|
|
""")
|
|
|
|
|
java.util.List<InboundOwner> selectInboundOwners(@Param("taskId") long taskId);
|
|
|
|
|
|
|
|
|
|
record InboundOwner(Long tenantId, Long inboundId) {}
|
|
|
|
|
|
2026-08-07 10:57:06 +08:00
|
|
|
@Select("""
|
|
|
|
|
SELECT pick_item.*
|
|
|
|
|
FROM fl_loading_pick_item pick_item
|
2026-08-11 11:24:59 +08:00
|
|
|
JOIN fl_loading_pick_task pick_task ON pick_task.id = pick_item.pick_task_id
|
2026-08-07 10:57:06 +08:00
|
|
|
JOIN fl_loading_plan_item plan_item ON plan_item.id = pick_item.loading_plan_item_id
|
|
|
|
|
JOIN fl_loading_plan plan ON plan.id = plan_item.loading_plan_id
|
2026-08-11 11:24:59 +08:00
|
|
|
AND plan.id = pick_task.loading_plan_id
|
2026-08-07 10:57:06 +08:00
|
|
|
JOIN fl_container_booking booking ON booking.id = plan.container_booking_id
|
2026-08-11 11:24:59 +08:00
|
|
|
JOIN fl_inbound_order inbound_order ON inbound_order.id = plan_item.inbound_id
|
|
|
|
|
AND inbound_order.tenant_id = plan_item.account_id AND inbound_order.deleted = 0
|
2026-08-07 10:57:06 +08:00
|
|
|
WHERE pick_item.pick_task_id = #{taskId} AND booking.warehouse_id = #{warehouseId}
|
|
|
|
|
AND plan_item.deleted = 0
|
|
|
|
|
ORDER BY pick_item.id ASC
|
|
|
|
|
""")
|
|
|
|
|
java.util.List<LoadingPickItemEntity> selectTaskItemsWithAccount(@Param("taskId") long taskId,
|
|
|
|
|
@Param("warehouseId") long warehouseId);
|
|
|
|
|
|
|
|
|
|
@Select("""
|
|
|
|
|
SELECT pick_item.*
|
|
|
|
|
FROM fl_loading_pick_item pick_item
|
2026-08-11 11:24:59 +08:00
|
|
|
JOIN fl_loading_pick_task pick_task ON pick_task.id = pick_item.pick_task_id
|
2026-08-07 10:57:06 +08:00
|
|
|
JOIN fl_loading_plan_item plan_item ON plan_item.id = pick_item.loading_plan_item_id
|
|
|
|
|
JOIN fl_loading_plan plan ON plan.id = plan_item.loading_plan_id
|
2026-08-11 11:24:59 +08:00
|
|
|
AND plan.id = pick_task.loading_plan_id
|
2026-08-07 10:57:06 +08:00
|
|
|
JOIN fl_container_booking booking ON booking.id = plan.container_booking_id
|
2026-08-11 11:24:59 +08:00
|
|
|
JOIN fl_inbound_order inbound_order ON inbound_order.id = plan_item.inbound_id
|
|
|
|
|
AND inbound_order.tenant_id = plan_item.account_id AND inbound_order.deleted = 0
|
2026-08-07 10:57:06 +08:00
|
|
|
WHERE pick_item.pick_task_id = #{taskId} AND pick_item.id = #{itemId}
|
|
|
|
|
AND booking.warehouse_id = #{warehouseId} AND plan_item.deleted = 0
|
|
|
|
|
""")
|
|
|
|
|
LoadingPickItemEntity selectTaskItemWithAccount(@Param("taskId") long taskId,
|
|
|
|
|
@Param("itemId") long itemId,
|
|
|
|
|
@Param("warehouseId") long warehouseId);
|
|
|
|
|
|
2026-08-06 15:48:21 +08:00
|
|
|
@Update("""
|
|
|
|
|
UPDATE fl_loading_pick_item
|
2026-08-07 19:40:42 +08:00
|
|
|
SET item_status = CASE WHEN picked_package_count + #{count} = planned_package_count
|
2026-08-06 15:48:21 +08:00
|
|
|
THEN 'PICKED' ELSE 'PICKING' END,
|
2026-08-07 19:40:42 +08:00
|
|
|
picked_package_count = picked_package_count + #{count},
|
2026-08-09 20:35:11 +08:00
|
|
|
release_mode = #{releaseMode}, release_location_ids = #{releaseLocationIds},
|
2026-08-06 15:48:21 +08:00
|
|
|
version = version + 1
|
|
|
|
|
WHERE id = #{id} AND version = #{version}
|
2026-08-07 10:57:06 +08:00
|
|
|
AND EXISTS (SELECT 1 FROM fl_loading_plan_item plan_item
|
|
|
|
|
JOIN fl_loading_plan plan ON plan.id = plan_item.loading_plan_id
|
|
|
|
|
JOIN fl_container_booking booking ON booking.id = plan.container_booking_id
|
|
|
|
|
WHERE plan_item.id = fl_loading_pick_item.loading_plan_item_id
|
|
|
|
|
AND booking.warehouse_id = #{warehouseId} AND plan_item.deleted = 0)
|
2026-08-06 15:48:21 +08:00
|
|
|
AND picked_package_count + #{count} <= planned_package_count
|
|
|
|
|
""")
|
2026-08-09 20:35:11 +08:00
|
|
|
int pick(@Param("id") long id, @Param("count") int count,
|
|
|
|
|
@Param("releaseMode") String releaseMode,
|
|
|
|
|
@Param("releaseLocationIds") String releaseLocationIds,
|
|
|
|
|
@Param("version") int version,
|
2026-08-07 10:57:06 +08:00
|
|
|
@Param("warehouseId") long warehouseId);
|
|
|
|
|
|
|
|
|
|
@Update("""
|
|
|
|
|
UPDATE fl_loading_pick_item
|
2026-08-09 20:35:11 +08:00
|
|
|
SET picked_package_count = #{finalCount}, item_status = 'PARTIAL',
|
|
|
|
|
release_mode = #{releaseMode}, release_location_ids = #{releaseLocationIds},
|
|
|
|
|
version = version + 1
|
2026-08-07 10:57:06 +08:00
|
|
|
WHERE id = #{id} AND version = #{version}
|
|
|
|
|
AND EXISTS (SELECT 1 FROM fl_loading_plan_item plan_item
|
|
|
|
|
JOIN fl_loading_plan plan ON plan.id = plan_item.loading_plan_id
|
|
|
|
|
JOIN fl_container_booking booking ON booking.id = plan.container_booking_id
|
|
|
|
|
WHERE plan_item.id = fl_loading_pick_item.loading_plan_item_id
|
|
|
|
|
AND booking.warehouse_id = #{warehouseId} AND plan_item.deleted = 0)
|
|
|
|
|
AND item_status IN ('PENDING', 'PICKING')
|
|
|
|
|
AND picked_package_count < #{finalCount}
|
|
|
|
|
AND #{finalCount} < planned_package_count
|
|
|
|
|
""")
|
2026-08-09 20:35:11 +08:00
|
|
|
int partial(@Param("id") long id, @Param("finalCount") int finalCount,
|
|
|
|
|
@Param("releaseMode") String releaseMode,
|
|
|
|
|
@Param("releaseLocationIds") String releaseLocationIds,
|
|
|
|
|
@Param("version") int version,
|
2026-08-07 10:57:06 +08:00
|
|
|
@Param("warehouseId") long warehouseId);
|
|
|
|
|
|
|
|
|
|
@Update("""
|
|
|
|
|
UPDATE fl_loading_pick_item
|
|
|
|
|
SET item_status = 'SKIPPED', version = version + 1
|
|
|
|
|
WHERE id = #{id} AND version = #{version}
|
|
|
|
|
AND EXISTS (SELECT 1 FROM fl_loading_plan_item plan_item
|
|
|
|
|
JOIN fl_loading_plan plan ON plan.id = plan_item.loading_plan_id
|
|
|
|
|
JOIN fl_container_booking booking ON booking.id = plan.container_booking_id
|
|
|
|
|
WHERE plan_item.id = fl_loading_pick_item.loading_plan_item_id
|
|
|
|
|
AND booking.warehouse_id = #{warehouseId} AND plan_item.deleted = 0)
|
|
|
|
|
AND item_status = 'PENDING' AND picked_package_count = 0
|
|
|
|
|
""")
|
|
|
|
|
int skip(@Param("id") long id, @Param("version") int version, @Param("warehouseId") long warehouseId);
|
|
|
|
|
|
|
|
|
|
@Select("""
|
|
|
|
|
SELECT COUNT(*)
|
|
|
|
|
FROM fl_loading_pick_item
|
|
|
|
|
WHERE pick_task_id = #{taskId}
|
|
|
|
|
AND item_status NOT IN ('PICKED', 'PARTIAL', 'SKIPPED')
|
|
|
|
|
""")
|
|
|
|
|
long unresolvedCount(@Param("taskId") long taskId);
|
2026-08-06 17:48:50 +08:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 以装柜计划的全部有效明细为完成口径,不能只检查当前 PDA 任务中的明细。
|
|
|
|
|
*/
|
|
|
|
|
@Select("""
|
|
|
|
|
SELECT COUNT(*)
|
|
|
|
|
FROM fl_loading_plan_item plan_item
|
|
|
|
|
WHERE plan_item.loading_plan_id = #{planId}
|
|
|
|
|
AND plan_item.deleted = 0
|
|
|
|
|
AND NOT EXISTS (
|
|
|
|
|
SELECT 1
|
|
|
|
|
FROM fl_loading_pick_item pick_item
|
|
|
|
|
JOIN fl_loading_pick_task pick_task ON pick_task.id = pick_item.pick_task_id
|
|
|
|
|
WHERE pick_item.loading_plan_item_id = plan_item.id
|
|
|
|
|
AND pick_task.loading_plan_id = #{planId}
|
|
|
|
|
AND pick_task.task_status = 'LOADING'
|
|
|
|
|
AND pick_item.picked_package_count = plan_item.package_count
|
|
|
|
|
)
|
|
|
|
|
""")
|
|
|
|
|
long unfinishedCount(@Param("planId") long planId);
|
2026-08-06 15:48:21 +08:00
|
|
|
}
|