261 lines
14 KiB
Java
261 lines
14 KiB
Java
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;
|
|
import org.apache.ibatis.annotations.Select;
|
|
import org.apache.ibatis.annotations.Update;
|
|
|
|
import java.util.List;
|
|
|
|
@Mapper
|
|
public interface LoadingPickItemMapper extends BaseMapper<LoadingPickItemEntity> {
|
|
@Select("""
|
|
SELECT pick_item.id AS pickItemId, plan_item.account_id AS tenantId, 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
|
|
AND label.batch_status = 'ACTIVE'
|
|
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);
|
|
|
|
class CartonLabelRow {
|
|
private Long pickItemId;
|
|
private Long tenantId;
|
|
private String orderNo;
|
|
private String inboundCode;
|
|
private String cargoName;
|
|
private String boxCode;
|
|
|
|
public Long getPickItemId() { return pickItemId; }
|
|
public void setPickItemId(Long pickItemId) { this.pickItemId = pickItemId; }
|
|
public Long getTenantId() { return tenantId; }
|
|
public void setTenantId(Long tenantId) { this.tenantId = tenantId; }
|
|
public String getOrderNo() { return orderNo; }
|
|
public void setOrderNo(String orderNo) { this.orderNo = orderNo; }
|
|
public String getInboundCode() { return inboundCode; }
|
|
public void setInboundCode(String inboundCode) { this.inboundCode = inboundCode; }
|
|
public String getCargoName() { return cargoName; }
|
|
public void setCargoName(String cargoName) { this.cargoName = cargoName; }
|
|
public String getBoxCode() { return boxCode; }
|
|
public void setBoxCode(String boxCode) { this.boxCode = boxCode; }
|
|
}
|
|
|
|
@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(CASE
|
|
WHEN pick_item.item_status='SKIPPED' AND pick_item.picked_package_count=0 THEN 0
|
|
WHEN pick_item.item_status='PARTIAL' AND pick_item.picked_package_count>0
|
|
AND pick_item.picked_package_count<=plan_item.package_count
|
|
THEN pick_item.picked_package_count
|
|
ELSE plan_item.package_count
|
|
END),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 THEN 1
|
|
WHEN pick_item.item_status='PICKED'
|
|
AND pick_item.picked_package_count=plan_item.package_count THEN 0
|
|
WHEN pick_item.item_status='PARTIAL' AND pick_item.picked_package_count>0
|
|
AND pick_item.picked_package_count<=plan_item.package_count THEN 0
|
|
WHEN pick_item.item_status='SKIPPED' AND pick_item.picked_package_count=0 THEN 0
|
|
ELSE 1
|
|
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);
|
|
|
|
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; }
|
|
}
|
|
|
|
@Select("""
|
|
SELECT 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}
|
|
GROUP BY plan_item.account_id,plan_item.inbound_id
|
|
ORDER BY MIN(pick_item.id)
|
|
""")
|
|
java.util.List<InboundOwner> selectInboundOwners(@Param("taskId") long taskId);
|
|
|
|
record InboundOwner(Long tenantId, Long inboundId) {}
|
|
|
|
@Select("""
|
|
SELECT pick_item.*
|
|
FROM fl_loading_pick_item pick_item
|
|
JOIN fl_loading_pick_task pick_task ON pick_task.id = pick_item.pick_task_id
|
|
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
|
|
AND plan.id = pick_task.loading_plan_id
|
|
JOIN fl_container_booking booking ON booking.id = plan.container_booking_id
|
|
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
|
|
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
|
|
JOIN fl_loading_pick_task pick_task ON pick_task.id = pick_item.pick_task_id
|
|
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
|
|
AND plan.id = pick_task.loading_plan_id
|
|
JOIN fl_container_booking booking ON booking.id = plan.container_booking_id
|
|
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
|
|
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);
|
|
|
|
@Update("""
|
|
UPDATE fl_loading_pick_item
|
|
SET item_status = CASE WHEN picked_package_count + #{count} = planned_package_count
|
|
THEN 'PICKED' ELSE 'PICKING' END,
|
|
picked_package_count = picked_package_count + #{count},
|
|
release_mode = #{releaseMode}, release_location_ids = #{releaseLocationIds},
|
|
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 picked_package_count + #{count} <= planned_package_count
|
|
""")
|
|
int pick(@Param("id") long id, @Param("count") int count,
|
|
@Param("releaseMode") String releaseMode,
|
|
@Param("releaseLocationIds") String releaseLocationIds,
|
|
@Param("version") int version,
|
|
@Param("warehouseId") long warehouseId);
|
|
|
|
@Update("""
|
|
UPDATE fl_loading_pick_item
|
|
SET picked_package_count = #{finalCount}, item_status = 'PARTIAL',
|
|
release_mode = #{releaseMode}, release_location_ids = #{releaseLocationIds},
|
|
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 IN ('PENDING', 'PICKING')
|
|
AND picked_package_count < #{finalCount}
|
|
AND #{finalCount} < planned_package_count
|
|
""")
|
|
int partial(@Param("id") long id, @Param("finalCount") int finalCount,
|
|
@Param("releaseMode") String releaseMode,
|
|
@Param("releaseLocationIds") String releaseLocationIds,
|
|
@Param("version") int version,
|
|
@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);
|
|
|
|
/**
|
|
* 以结算后的装柜计划事实为完成口径,不能只检查当前 PDA 任务中的明细。
|
|
* PARTIAL 在本查询前已把计划箱数收敛为实际拣货箱数;收敛前的严格小于关系由结算计划校验。
|
|
* 异步完成期间任务会在 COMPLETING/COMPLETION_FAILED 间切换,不能把任务状态当成明细未完成事实。
|
|
*/
|
|
@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_item.item_status = 'PICKED'
|
|
AND pick_item.picked_package_count = plan_item.package_count)
|
|
OR (pick_item.item_status = 'PARTIAL'
|
|
AND pick_item.picked_package_count > 0
|
|
AND pick_item.picked_package_count = plan_item.package_count)
|
|
OR (pick_item.item_status = 'SKIPPED'
|
|
AND pick_item.picked_package_count = 0)
|
|
)
|
|
)
|
|
""")
|
|
long unfinishedCount(@Param("planId") long planId);
|
|
}
|