You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1014 lines
42 KiB

package com.gaotao.modules.automatedWarehouse.mapper;
import com.gaotao.modules.api.entity.TaskNote;
import com.gaotao.modules.automatedWarehouse.entity.*;
import com.gaotao.modules.base.entity.PalletType;
import com.gaotao.modules.warehouse.entity.Pallet;
import com.gaotao.modules.warehouse.entity.PalletData;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.hibernate.dialect.function.IntegralTimestampaddFunction;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Mapper
public interface WcsIntegrationMapper {
List<WmsLabelAndPalletData> palletListForPartNo(PartPalletData inData);
List<WmsTransportTask> checkPalletTask (@Param("site") String site, @Param("palletId") String palletId);
void batchSaveTransportTask(@Param("list") List<WmsTransportTask> transportTaskList);
void batchSaveOrderTask(@Param("list") List<WmsOrderTask> transportTaskList);
void batchSaveOrderTaskDetail(@Param("list") List<WmsOrderTaskDetail> inList);
// ==================== 打托相关方法 - AI制作 ====================
/**
* 检查栈板是否存在 - AI制作
*/
Map<String, Object> getPalletInfo(@Param("site") String site, @Param("palletId") String palletId);
/**
* 获取栈板明细数量 - rqrq
* @param site 工厂编码
* @param palletId 栈板编码
* @return 明细数量
*/
int getPalletDetailCount(@Param("site") String site, @Param("palletId") String palletId);
/**
* 获取栈板类型的位置信息 - AI制作
*/
List<String> getPalletTypePositions(@Param("site") String site, @Param("palletType") String palletType);
/**
* 获取栈板明细 - AI制作
*/
List<Map<String, Object>> getPalletDetails(@Param("site") String site, @Param("palletId") String palletId,
@Param("position") String position, @Param("layer") Integer layer);
List<PalletDetailData> getPalletDetailsData(@Param("site") String site, @Param("palletId") String palletId);
PalletType getPalletTypeInfoByPallet(@Param("site") String site,@Param("palletId") String palletId);
/**
* 根据位置获取层数 - AI制作
*/
List<Integer> getLayersByPosition(@Param("site") String site, @Param("palletId") String palletId,
@Param("position") String position);
/**
* 验证标签 - AI制作
*/
Map<String, Object> validateLabel(@Param("site") String site, @Param("serialNo") String serialNo);
/**
* 获取栈板类型区域信息(用于校验层级规则) - AI制作
*/
List<Map<String, Object>> getPalletTypeAreaInfo(@Param("site") String site, @Param("palletType") String palletType);
/**
* 获取栈板指定层的明细统计 - AI制作
*/
List<Map<String, Object>> getPalletLayerStatistics(@Param("site") String site, @Param("palletId") String palletId,
@Param("layer") Integer layer);
/**
* 保存栈板明细 - AI制作
*/
void savePalletDetail(@Param("site") String site, @Param("palletId") String palletId,
@Param("position") String position, @Param("layer") Integer layer,
@Param("serialNo") String serialNo, @Param("partNo") String partNo,
@Param("createBy") String createBy);
/**
* @Description 保存栈板明细(无校验,用于自动拣选)- rqrq
* @param site 工厂编码
* @param palletId 栈板编码
* @param position 位置
* @param layer 层数
* @param serialNo 标签编码
* @param partNo 物料编号
* @param createBy 创建人
* @param wcsFlag WCS标记(1=待推送,0=已推送)
* @author rqrq
* @date 2025/10/09
*/
void savePalletDetailNoValidation(@Param("site") String site, @Param("palletId") String palletId,
@Param("position") String position, @Param("layer") Integer layer,
@Param("serialNo") String serialNo, @Param("partNo") String partNo,
@Param("createBy") String createBy, @Param("wcsFlag") Integer wcsFlag);
/**
* 根据标签查找栈板信息 - AI制作
*/
Map<String, Object> findPalletByLabel(@Param("site") String site, @Param("serialNo") String serialNo);
AgvStation getNowStation(@Param("site") String site, @Param("palletId") String palletId);
/**
* 获取指定位置已占用的层数(排除指定标签) - AI制作
*/
List<Integer> getOccupiedLayersExcludeSerial(@Param("site") String site, @Param("palletId") String palletId,
@Param("position") String position, @Param("excludeSerialNo") String excludeSerialNo);
void updatePalletLocationCode(@Param("site") String site, @Param("palletId") String palletId, @Param("newLocationCode") String newLocationCode);
/**
* 更新栈板明细位置 - AI制作
*/
void updatePalletDetailPosition(@Param("site") String site, @Param("palletId") String palletId,
@Param("serialNo") String serialNo, @Param("newPosition") String newPosition,
@Param("newLayer") Integer newLayer, @Param("updatedBy") String updatedBy);
/**
* 删除栈板明细 - AI制作
*/
void deletePalletDetail(@Param("site") String site, @Param("palletId") String palletId,
@Param("serialNo") String serialNo);
/**
* @Description 检查上层是否有标签 - rqrq
* @param site 工厂编码
* @param palletId 栈板编码
* @param position 位置
* @param layer 当前层数
* @return 上层标签数量
* @author rqrq
* @date 2025/11/22
*/
Integer checkUpperLayerLabels(@Param("site") String site, @Param("palletId") String palletId,
@Param("position") String position, @Param("layer") Integer layer);
/**
* 根据条码删除栈板明细(不指定栈板ID,用于从任何栈板中移除条码) - AI制作
*/
void deletePalletDetailBySerialNo(@Param("site") String site, @Param("serialNo") String serialNo);
/**
* 恢复标签到原栈板(分拣撤回,保留所有原始字段包括wcs_flag) - rqrq
*/
void restorePalletDetail(@Param("site") String site, @Param("serialNo") String serialNo,
@Param("originalPalletId") String originalPalletId,
@Param("originalPosition") String originalPosition,
@Param("originalLayer") Integer originalLayer,
@Param("partNo") String partNo,
@Param("createDate") Date createDate,
@Param("createBy") String createBy,
@Param("wcsFlag") Integer wcsFlag);
/**
* 更新栈板调用状态 - AI制作
*/
void updatePalletCallingFlag(@Param("site") String site, @Param("palletId") String palletId,
@Param("callingFlag") String callingFlag, @Param("updatedBy") String updatedBy);
/**
* 检查栈板是否正在被调用 - AI制作
*/
String checkPalletCallingFlag(@Param("site") String site, @Param("palletId") String palletId);
/**
* @Description 查询栈板的运输任务(检查是否有进行中的AGV任务)- rqrq
* @param site 工厂编码
* @param palletId 栈板编码
* @return 运输任务(如果存在状态为"已预约"、"已创建"或"已下达"的任务)
* @author rqrq
* @date 2025/11/01
*/
WmsTransportTask getActivePalletTransportTask(@Param("site") String site, @Param("palletId") String palletId);
/**
* 统计栈板明细数量 - AI制作
*/
int countPalletDetails(@Param("site") String site, @Param("palletId") String palletId);
/**
* 更新栈板空栈板标记 - AI制作
*/
void updatePalletEmptyFlag(@Param("site") String site, @Param("palletId") String palletId,
@Param("emptyFlag") String emptyFlag, @Param("updatedBy") String updatedBy);
// ==================== 运输任务相关方法 - AI制作 ====================
/**
* 获取AGV站点列表 - AI制作
*/
List<Map<String, Object>> getAgvStations();
/**
* 获取可用的AGV站点列表(按状态和类型过滤)- AI制作
* @param statusDb 站点状态(0-空闲,1-有货),null则不过滤
* @return 符合条件的正式站点列表
*/
List<AgvStation> getAvailableAgvStations(@Param("statusDb") Integer statusDb);
/**
* 根据目标区域查找第一个空闲站点 - AI制作
* @param stationArea 目标区域(station_area)
* @return 第一个空闲站点的station_code,如果没有返回null
*/
String findFirstFreeStationByArea(@Param("stationArea") String stationArea);
/**
* 根据起点站点获取可达目标站点 - AI制作
*/
List<Map<String, Object>> getTargetStationsByStart(@Param("startStation") String startStation);
/**
* 插入单个运输任务 - AI制作
*/
void insertTransportTask(WmsTransportTask task);
void insertOrderTask(WmsOrderTask task);
/**
* @Description 删除运输任务(根据taskNo)- rqrq
* @param taskNo 任务编号
* @author rqrq
* @date 2025/11/17
*/
void deleteTransportTask(@Param("taskNo") String taskNo);
/**
* 检查站点是否有栈板 - AI制作
*/
int checkStationHasPallet(@Param("site") String site, @Param("stationCode") String stationCode);
PalletData getPalletDataByStation(@Param("site") String site, @Param("stationCode") String stationCode);
/**
* 获取站点的栈板ID - AI制作
*/
String getPalletIdByStation(@Param("site") String site, @Param("stationCode") String stationCode);
/**
* 根据ID查询运输任务 - AI制作
*/
WmsTransportTask getTransportTaskById(@Param("id") Long id);
/**
* 根据taskNo查询运输任务 - AI制作
*/
WmsTransportTask getTransportTaskByTaskNo(@Param("taskNo") String taskNo);
/**
* 更新运输任务状态 - AI制作
*/
void updateTransportTaskStatus(@Param("id") Long id, @Param("status") String status);
/**
* 根据taskNo更新运输任务状态 - AI制作
*/
void updateTransportTaskStatusByTaskNo(@Param("taskNo") String taskNo, @Param("status") String status);
/**
* @Description 统计指定区域未完成的立库取货call料任务数量 - rqrq
* @param site 工厂编码
* @param areaType 区域类型
* @return 未完成的call料任务数量
* @author rqrq
* @date 2025/11/22
*/
Integer countUnfinishedCallTasksByArea(@Param("site") String site, @Param("areaType") String areaType);
/**
* 根据站点代码获取站点信息 - AI制作
*/
Map<String, Object> getStationInfoByCode(@Param("stationCode") String stationCode);
AgvStation getStationDataByCode(@Param("stationCode") String stationCode);
/**
* 更新栈板明细的wcs_flag为1 - AI制作
*/
void updatePalletDetailWcsFlag(@Param("site") String site, @Param("palletId") String palletId);
void reUpdatePalletDetailWcsFlag(@Param("site") String site, @Param("palletId") String palletId);
List<PalletDetailData> getPalletDetailsNewDetail(@Param("site") String site, @Param("palletId") String palletId);
void updateSOIssueNotifyOrderMaterialListDetailOutWcsFlag(@Param("site") String site, @Param("serialNo") String serialNo);
/**
* @Description 根据序列号列表查询SOIssueNotifyOrderMaterialList_detail明细 - rqrq
* @param site 工厂编码
* @param serialNos 序列号列表
* @return 明细列表
* @author rqrq
* @date 2025/01/XX
*/
List<com.gaotao.modules.notify.entity.SOIssueNotifyOrderMaterialListDetail> getSOIssueNotifyDetailsBySerialNos(
@Param("site") String site, @Param("serialNos") List<String> serialNos);
/**
* @Description 根据序列号列表查询handling_unit的reserve_order_ref信息 - rqrq
* @param site 工厂编码
* @param serialNos 序列号列表
* @return reserve信息列表
* @author rqrq
* @date 2025/10/30
*/
List<HandlingUnitReserveInfo> getReserveOrderRefsBySerialNos(@Param("site") String site, @Param("serialNos") List<String> serialNos);
/**
* @Description 根据task_no+item_no+seq_no更新wms_order_task_detail状态为已完成已分拣 - rqrq
* @param site 工厂编码
* @param taskNo 任务编号
* @param itemNo 任务行号
* @param seqNo 序号
* @author rqrq
* @date 2025/01/XX
*/
void updateWmsOrderTaskDetailStatusForSorting(@Param("site") String site, @Param("taskNo") String taskNo,
@Param("itemNo") Integer itemNo, @Param("seqNo") Integer seqNo);
void updateWmsOrderTaskDetailStatusForAllOuting(@Param("site") String site, @Param("taskNo") String taskNo,
@Param("itemNo") Integer itemNo, @Param("seqNo") Integer seqNo);
/**
* @Description 批量更新wms_order_task_detail状态为已完成/已分拣(优化版,避免N+1查询)- rqrq
* @param site 工厂编码
* @param taskDetails 任务明细列表(包含taskNo, itemNo, seqNo)
* @author rqrq
* @date 2025/10/31
*/
void batchUpdateWmsOrderTaskDetailStatusForSorting(@Param("site") String site, @Param("taskDetails") List<TaskDetailKey> taskDetails);
/**
* @Description 批量查找序列号所在的托盘信息(优化版,避免N+1查询)- rqrq
* @param site 工厂编码
* @param serialNos 序列号列表
* @return Map<序列号, 托盘信息>,key为serialNo,value包含palletId等信息
* @author rqrq
* @date 2025/10/31
*/
List<Map<String, Object>> batchFindPalletsByLabels(@Param("site") String site, @Param("serialNos") List<String> serialNos);
/**
* @Description 批量删除指定序列号的托盘明细(优化版,避免N+1查询)- rqrq
* @param site 工厂编码
* @param serialNos 序列号列表
* @author rqrq
* @date 2025/10/31
*/
void batchDeletePalletDetailsBySerialNos(@Param("site") String site, @Param("serialNos") List<String> serialNos);
/**
* @Description 批量插入托盘明细(无校验,用于自动拣选,优化版)- rqrq
* @param detailList 明细列表
* @author rqrq
* @date 2025/10/31
*/
void batchSavePalletDetailNoValidation(@Param("detailList") List<PalletDetailInsert> detailList);
/**
* @Description 检查某个任务的所有明细是否都已完成 - rqrq
* @param site 工厂编码
* @param taskNo 任务编号
* @param itemNo 任务行号
* @return 未完成的明细数量
* @author rqrq
* @date 2025/01/XX
*/
int checkAllTaskDetailCompleted(@Param("site") String site, @Param("taskNo") String taskNo,
@Param("itemNo") Integer itemNo);
/**
* @Description 更新wms_order_task主表状态为已完成 - rqrq
* @param site 工厂编码
* @param taskNo 任务编号
* @param itemNo 任务行号
* @author rqrq
* @date 2025/01/XX
*/
void updateWmsOrderTaskStatusCompleted(@Param("site") String site, @Param("taskNo") String taskNo,
@Param("itemNo") Integer itemNo);
/**
* @Description 根据task_ref+task_item+serialNo更新SOIssueNotifyOrderMaterialList_detail的out_wcs_flag为Y - rqrq
* @param site 工厂编码
* @param serialNo 序列号
* @author rqrq
* @date 2025/10/09
*/
void updateSOIssueNotifyDetailOutWcsFlagBySerialNo(@Param("site") String site, @Param("serialNo") String serialNo);
/**
* @Description 批量更新多个序列号的out_wcs_flag为Y(优化版,避免N+1查询)- rqrq
* @param site 工厂编码
* @param serialNos 序列号列表
* @author rqrq
* @date 2025/10/31
*/
void batchUpdateSOIssueNotifyDetailOutWcsFlag(@Param("site") String site, @Param("serialNos") List<String> serialNos);
/**
* @Description 批量更新wms_order_task_detail状态为已完成/直接出库(优化版,避免N+1查询)- rqrq
* @param site 工厂编码
* @param taskDetails 任务明细列表(包含taskNo, itemNo, seqNo)
* @author rqrq
* @date 2025/10/31
*/
void batchUpdateWmsOrderTaskDetailStatus(@Param("site") String site, @Param("taskDetails") List<TaskDetailKey> taskDetails);
/**
* @Description 一次性更新所有已完成任务的主表状态(优化版,避免循环查询)- rqrq
* @param site 工厂编码
* @param taskKeys 任务主键列表(包含taskNo, itemNo)
* @author rqrq
* @date 2025/10/31
*/
void batchUpdateCompletedTaskStatus(@Param("site") String site, @Param("taskKeys") List<TaskDetailKey> taskKeys);
void insertWmsTransportTaskDetail(WmsTransportTaskDetail inData);
void insertWmsOrderTaskDetail(WmsOrderTaskDetail inData);
Integer getMaxSeqNoForTaskDetail(@Param("site") String site, @Param("taskNo") String taskNo);
void updateTransportTaskStatusForSiteAndNo(@Param("site") String site, @Param("taskNo") String taskNo,@Param("status") String status);
/**
* @Description 锁定任务明细进行处理(使用status状态控制并发) - rqrq
* @param id 明细ID
* @return 更新的行数(0表示锁定失败,已被其他线程处理)
* @author rqrq
* @date 2025/10/18
*/
int lockTaskDetailForProcessing(@Param("id") Long id);
/**
* @Description 更新运输任务明细状态为最终状态 - rqrq
* @param id 明细ID
* @param status 新状态
* @author rqrq
* @date 2025/10/18
*/
void updateTransportTaskDetailStatusForId(@Param("id") Long id, @Param("status") String status);
/**
* @Description 更新运输任务明细为失败状态(包含错误信息) - rqrq
* @param id 明细ID
* @param errorCode 错误码(处理失败=500)
* @param errorMsg 错误信息
* @author rqrq
* @date 2025/10/31
*/
void updateTransportTaskDetailWithError(@Param("id") Long id, @Param("errorCode") String errorCode, @Param("errorMsg") String errorMsg);
/**
* @Description 清除运输任务明细的错误信息(处理成功) - rqrq
* @param id 明细ID
* @author rqrq
* @date 2025/10/31
*/
void clearTransportTaskDetailError(@Param("id") Long id);
List<WmsTransportTaskDetail> getTransportTaskDetailListWithStatus(@Param("site") String site);
/**
* 查询指定状态的订单任务明细列表 - AI制作
*/
List<WmsOrderTaskDetail> getOrderTaskDetailListWithStatus(@Param("site") String site);
/**
* 根据ID更新订单任务明细状态 - AI制作
*/
void updateOrderTaskDetailStatusForId(@Param("id") Long id, @Param("status") String status);
/**
* 根据任务号获取栈板ID - AI制作
*/
String getPalletIdByOrderTaskNo(@Param("taskNo") String taskNo);
/**
* 根据栈板号和任务类型查找订单任务 - AI制作
*/
WmsOrderTask findOrderTaskByPalletAndType(@Param("site") String site, @Param("palletId") String palletId, @Param("sourceType") String sourceType);
/**
* 获取订单任务明细的最大序号 - AI制作
*/
Integer getMaxSeqNoForOrderTaskDetail(@Param("site") String site, @Param("taskNo") String taskNo);
/**
* 插入WCS回调任务 - AI制作
*/
void insertWcsCallbackTask(WcsCallbackTask callbackTask);
/**
* 查询指定状态的WCS回调任务列表 - AI制作
*/
List<WcsCallbackTask> getWcsCallbackTaskListWithStatus(@Param("site") String site);
/**
* 更新WCS回调任务状态 - AI制作
*/
void updateWcsCallbackTaskStatus(@Param("id") Long id, @Param("status") String status,
@Param("processStartTime") Date processStartTime,
@Param("processEndTime") Date processEndTime,
@Param("errorMsg") String errorMsg);
/**
* 原子性更新WCS回调任务状态(乐观锁,防止重复处理) - AI制作
* @param id 任务ID
* @param oldStatus 原状态(必须匹配才能更新)
* @param newStatus 新状态
* @param processStartTime 处理开始时间
* @return 影响的行数(0=更新失败,1=更新成功)
*/
int updateWcsCallbackTaskStatusWithLock(@Param("id") Long id,
@Param("oldStatus") String oldStatus,
@Param("newStatus") String newStatus,
@Param("processStartTime") Date processStartTime);
void updatePalletWcsLocation(@Param("site") String site, @Param("palletId") String palletId, @Param("location") String location);
/**
* 更新WCS回调任务重试次数 - AI制作
*/
void updateWcsCallbackTaskRetryCount(@Param("id") Long id, @Param("retryCount") Integer retryCount);
/**
* 根据栈板ID和动作类型查找订单任务 - AI制作
*/
List<WmsOrderTask> findOrderTasksByPalletAndActionType(@Param("site") String site,
@Param("palletId") String palletId,
@Param("sourceType") String sourceType,
@Param("status") String status);
List<WmsOrderTask> findOrderTasksByTaskNo(@Param("site") String site,
@Param("taskNo") String taskNo);
WmsOrderTask findOrderTasksByTaskNoItem(@Param("site") String site,
@Param("taskNo") String taskNo,
@Param("itemNo") Integer itemNo);
/**
* 更新订单任务状态和WMS状态 - AI制作
*/
void updateOrderTaskStatusAndWmsStatus(@Param("id") Long id,
@Param("status") String status,
@Param("wmsStatus") String wmsStatus);
/**
* 根据任务号更新订单任务明细状态 - AI制作
*/
void updateOrderTaskDetailStatusByTaskNo(@Param("taskNo") String taskNo, @Param("status") String status, @Param("wmsStatus") String wmsStatus);
void updateOrderTaskDetailStatusByTaskNoPalletId(@Param("site") String site,@Param("taskNo") String taskNo, @Param("status") String status, @Param("wmsStatus") String wmsStatus, @Param("palletId") String palletId);
/**
* 查询立库调栈板出库的订单任务列表 - AI制作
*/
List<WmsOrderTask> getWcsOrderTaskListForPalletOut(@Param("site") String site);
/**
* 更新订单任务错误信息 - AI制作
*/
void updateOrderTaskErrorInfo(@Param("id") Long id, @Param("errorCode") String errorCode, @Param("errorMsg") String errorMsg);
/**
* 更新AGV站点状态 - AI制作
*/
void updateAgvStationStatus(@Param("stationCode") String stationCode, @Param("statusDb") Integer statusDb, @Param("status") String status);
void updateAgvStationAutoFlag(@Param("stationCode") String stationCode, @Param("flag") String flag);
void updateWTTToLocationForId(@Param("site") String site,@Param("taskNo") String taskNo, @Param("toLocation") String toLocation);
/**
* @Description 更新运输任务的目标区域 - rqrq
* @param taskNo 任务编号
* @param toArea 目标区域
* @author rqrq
* @date 2025/11/17
*/
void updateTransportTaskToArea(@Param("site") String site,@Param("taskNo") String taskNo, @Param("toArea") String toArea);
/**
* 获取AGV站点状态 - AI制作
*/
Integer getAgvStationStatus(@Param("stationCode") String stationCode);
String getAgvStationType(@Param("stationCode") String stationCode);
/**
* 获取栈板详细信息(包含palletType和autoSort以及托盘类型详情) - AI制作
*/
/**
* 获取栈板详细信息(包含类型关联数据) - AI制作
* @param site 工厂编码
* @param palletId 栈板编码
* @return 栈板详细信息实体类
*/
com.gaotao.modules.warehouse.entity.PalletData getPalletInfoWithTypeDetails(@Param("site") String site, @Param("palletId") String palletId);
/**
* 更新栈板类型、自动分拣标志和存储类型 - AI制作/rqrq
*/
void updatePalletTypeAndAutoSort(@Param("site") String site, @Param("palletId") String palletId,
@Param("palletType") String palletType, @Param("autoSort") String autoSort,
@Param("soreType") Integer soreType);
/**
* 获取指定层已占用的位置列表 - rqrq
*/
List<String> getOccupiedPositionsByLayer(@Param("site") String site, @Param("palletId") String palletId,
@Param("layer") Integer layer);
/**
* @Description 插入WCS回调栈板扫描记录 - rqrq
* @param callback 回调记录
* @author rqrq
* @date 2025/10/07
*/
void insertCallbackPalletScan(@Param("callback") WcsCallbackPalletScan callback);
PalletType getPalletType(@Param("site") String site, @Param("palletType") String palletType);
AgvStation getAgvStation( @Param("stationCode") String stationCode);
// ==================== 栈板换站相关方法 - rqrq ====================
/**
* @Description 检查栈板calling_flag并获取当前站点信息 - rqrq
* @param site 工厂编码
* @param palletId 栈板编码
* @return 栈板信息(包含calling_flag和当前站点ID、站点编码)
* @author rqrq
* @date 2025/10/16
*/
CheckPalletResult checkPalletForChangeStation(@Param("site") String site, @Param("palletId") String palletId);
/**
* @Description 获取可选择的区域列表(choose_able为Y) - rqrq
* @return 区域列表
* @author rqrq
* @date 2025/10/16
*/
List<Area> getAreaOptionsForChange();
/**
* @Description 根据区域获取可用站点列表 - rqrq
* @param areaId 区域ID
* @return 站点列表(active=Y, station_type=正式站点, status_db=0)
* @author rqrq
* @date 2025/10/16
*/
List<AgvStation> getStationsByArea(@Param("areaId") String areaId);
/**
* @Description 根据区域查找第一个空闲站点(用于自动分配)- rqrq
* @param areaId 区域ID
* @return 第一个空闲站点的station_code,如果没有返回null
* @author rqrq
* @date 2025/10/16
*/
String findFirstFreeStationByAreaId(@Param("areaId") String areaId);
// ==================== 手工移动托盘相关方法 - rqrq ====================
/**
* @Description 检查托盘是否可以手工移动(判断calling_flag、当前站点和站点类型)- rqrq
* @param site 工厂编码
* @param palletId 托盘编码
* @return 托盘信息(包含calling_flag、当前站点编码、站点类型、是否可操作)
* @author rqrq
* @date 2025/10/16
*/
CheckPalletResult checkPalletForManualMove(@Param("site") String site, @Param("palletId") String palletId);
/**
* @Description 更新托盘location_code为null(移出站点)- rqrq
* @param site 工厂编码
* @param palletId 托盘编码
* @author rqrq
* @date 2025/10/16
*/
void updatePalletRemoveStation(@Param("site") String site, @Param("palletId") String palletId);
/**
* @Description 更新站点状态为空闲 - rqrq
* @param stationCode 站点编码
* @author rqrq
* @date 2025/10/16
*/
void updateStationToFree(@Param("stationCode") String stationCode);
/**
* @Description 更新托盘location_code(绑定站点)- rqrq
* @param site 工厂编码
* @param palletId 托盘编码
* @param stationCode 站点编码
* @author rqrq
* @date 2025/10/16
*/
void updatePalletBindStation(@Param("site") String site, @Param("palletId") String palletId, @Param("stationCode") String stationCode);
/**
* @Description 更新站点状态为有货 - rqrq
* @param stationCode 站点编码
* @author rqrq
* @date 2025/10/16
*/
void updateStationToOccupied(@Param("stationCode") String stationCode);
// ==================== 空托盘组盘相关方法 - rqrq ====================
/**
* @Description 检查托盘是否为空托盘(pallet_detail表无数据)- rqrq
* @param site 工厂编码
* @param palletId 托盘编码
* @return 托盘信息(包含当前站点ID、站点编码、托盘类型)
* @author rqrq
* @date 2025/10/16
*/
CheckPalletResult checkEmptyPallet(@Param("site") String site, @Param("palletId") String palletId);
/**
* @Description 获取托盘类型列表(根据pallet_family过滤)- rqrq
* @param site 工厂编码
* @param palletFamily 托盘族(可为空)
* @return 托盘类型列表
* @author rqrq
* @date 2025/10/16
*/
List<PalletType> getPalletTypes(@Param("site") String site, @Param("palletFamily") String palletFamily);
/**
* @Description 获取需要自动续盘的站点列表 - rqrq
* @return 符合自动续盘条件的站点列表(auto_call_blank_pallet='Y', auto_call_blank_pallet_type有值, station_type='正式站点', status_db=0)
* @author rqrq
* @date 2025/10/19
*/
List<AgvStation> getAutoCallBlankPalletStations();
// ==================== 取消WCS组盘相关方法 - rqrq ====================
/**
* @Description 检查栈板WCS组盘状态(是否被调用、是否发送组盘任务、是否有明细)- rqrq
* @param site 工厂编码
* @param palletId 栈板编码
* @return 栈板信息(包含callingFlag、hasSentWcsTask、hasDetail)
* @author rqrq
* @date 2025/10/16
*/
CheckPalletResult checkPalletWcsStatus(@Param("site") String site, @Param("palletId") String palletId);
/**
* @Description 检查栈板是否有wcs_flag=0的明细(已发送组盘任务)- rqrq
* @param site 工厂编码
* @param palletId 栈板编码
* @return wcs_flag=0的明细数量
* @author rqrq
* @date 2025/10/16
*/
int countPalletDetailWithWcsFlagZero(@Param("site") String site, @Param("palletId") String palletId);
int countPalletDetailWithWcsFlagOne(@Param("site") String site, @Param("palletId") String palletId);
/**
* @Description 更新栈板所有明细的wcs_flag为1(取消组盘)- rqrq
* @param site 工厂编码
* @param palletId 栈板编码
* @author rqrq
* @date 2025/10/16
*/
void updateAllPalletDetailWcsFlagToOne(@Param("site") String site, @Param("palletId") String palletId);
/**
* @Description 删除栈板所有明细(移出全部物料)- rqrq
* @param site 工厂编码
* @param palletId 栈板编码
* @author rqrq
* @date 2025/10/16
*/
void deleteAllPalletDetail(@Param("site") String site, @Param("palletId") String palletId);
// ==================== 预约取托盘相关方法 - rqrq ====================
/**
* @Description 查询空托盘区可用的空托盘(area_type=Z101, calling_flag=N, 托盘类型匹配, 站点空闲)- rqrq
* @param site 工厂编码
* @param palletType 托盘类型
* @param stationCode 目标站点编码
* @return 可用的空托盘信息
* @author rqrq
* @date 2025/10/17
*/
Pallet findAvailableEmptyPallet(@Param("site") String site, @Param("palletType") String palletType, @Param("stationCode") String stationCode);
AgvStation getStationByCode(@Param("stationCode") String stationCode);
/**
* @Description 检查指定托盘是否就绪(area_type在Z101/Z103/Z104, calling_flag=N, 站点空闲)- rqrq
* @param site 工厂编码
* @param palletId 托盘编码
* @param stationCode 目标站点编码
* @return 托盘信息(如果就绪)
* @author rqrq
* @date 2025/10/17
*/
Pallet checkPalletReady(@Param("site") String site, @Param("palletId") String palletId, @Param("stationCode") String stationCode);
/**
* @Description 使用乐观锁更新运输任务状态(基于wms_status字段防止重复处理)- rqrq
* @param taskNo 任务编号
* @param newStatus 新状态
* @param palletId 托盘编码
* @param fromLocation 起始位置(栈板所在位置)
* @param toLocation 目标位置
* @param oldWmsStatus 旧的wms_status(乐观锁)
* @param newWmsStatus 新的wms_status
* @return 影响的行数(0=更新失败,1=更新成功)
* @author rqrq
* @date 2025/10/17
*/
int updateTransportTaskWithLock(@Param("taskNo") String taskNo, @Param("newStatus") String newStatus,
@Param("palletId") String palletId, @Param("fromLocation") String fromLocation,
@Param("toLocation") String toLocation,
@Param("oldWmsStatus") String oldWmsStatus, @Param("newWmsStatus") String newWmsStatus);
/**
* @Description 使用乐观锁更新AGV站点状态(检查期望状态,防止并发覆盖)- rqrq
* @param stationCode 站点编码
* @param expectedStatusDb 期望的当前状态(乐观锁)
* @param newStatusDb 新状态代码
* @param newStatus 新状态描述
* @return 影响的行数(0=更新失败,1=更新成功)
* @author rqrq
* @date 2025/11/04
*/
int updateAgvStationStatusWithLock(@Param("stationCode") String stationCode,
@Param("expectedStatusDb") Integer expectedStatusDb,
@Param("newStatusDb") Integer newStatusDb,
@Param("newStatus") String newStatus);
/**
* @Description 根据栈板ID和sourceType查询最新的OrderTask(按创建时间倒序)- rqrq
* @param site 工厂编码
* @param palletId 栈板编码
* @param sourceType 来源类型(如:手工Call料)
* @return 最新的OrderTask
* @author rqrq
* @date 2025/10/17
*/
WmsOrderTask findLatestOrderTaskByPallet(@Param("site") String site, @Param("palletId") String palletId, @Param("sourceType") String sourceType);
/**
* @Description 根据栈板ID更新最新的TransportTask的source_bill_no和source_line_id - rqrq
* @param site 工厂编码
* @param palletId 栈板编码
* @param sourceBillNo 来源单据号
* @param sourceLineId 来源单据行号
* @author rqrq
* @date 2025/10/17
*/
void updateTransportTaskSourceInfo(@Param("site") String site, @Param("palletId") String palletId,
@Param("sourceBillNo") String sourceBillNo, @Param("sourceLineId") Integer sourceLineId);
/**
* @Description 根据任务编号更新运输任务的来源单据信息(优化版本)- rqrq
* @param taskNo 运输任务编号
* @param sourceBillNo 来源单号
* @param sourceLineId 来源行号
* @author rqrq
* @date 2025/11/22
*/
void updateTransportTaskSourceInfoByTaskNo(@Param("taskNo") String taskNo,
@Param("sourceBillNo") String sourceBillNo,
@Param("sourceLineId") Integer sourceLineId);
// ==================== 调度发货任务相关方法 - rqrq ====================
/**
* @Description 根据栈板编码获取栈板信息 - rqrq
* @param site 工厂编码
* @param palletId 栈板编码
* @return 栈板信息
* @author rqrq
* @date 2025/10/18
*/
Pallet getPalletByCode(@Param("site") String site, @Param("palletId") String palletId);
// ==================== 人工分拣补盘相关方法 - rqrq ====================
/**
* @Description 根据任务号和行号成对匹配查询发料明细的序列号列表 - rqrq
* @param site 工厂编码
* @param taskNotes 任务明细列表(taskNo和itemNo成对匹配)
* @return 序列号列表
* @author rqrq
* @date 2025/10/19
*/
List<String> getSerialNosByTaskRefAndItem(@Param("site") String site, @Param("taskNotes") List<TaskNote> taskNotes);
/**
* @Description 根据序列号列表查询栈板ID列表(去重) - rqrq
* @param site 工厂编码
* @param serialNoList 序列号列表
* @return 栈板ID列表
* @author rqrq
* @date 2025/10/19
*/
List<String> getPalletIdsBySerialNos(@Param("site") String site, @Param("serialNoList") List<String> serialNoList);
/**
* @Description 检查栈板是否在指定wcsTaskID和站点生成过运输任务 - rqrq
* @param site 工厂编码
* @param palletId 栈板编码
* @param sourceBillNo 来源单号(wcsTaskID)
* @param stationCode 站点编码
* @return 任务数量(>0表示已存在)
* @author rqrq
* @date 2025/10/19
*/
int checkPalletTaskExists(@Param("site") String site, @Param("palletId") String palletId, @Param("sourceBillNo") String sourceBillNo, @Param("stationCode") String stationCode);
/**
* @Description 查询栈板是否存在未完成的运输任务 - rqrq
* @param site 工厂编码
* @param palletId 栈板编码
* @return 未完成任务的任务编号(如果存在),不存在则返回null
* @author rqrq
* @date 2025/10/31
*/
String getUnfinishedTaskByPalletId(@Param("site") String site, @Param("palletId") String palletId);
/**
* @Description 检查栈板是否放满(根据pallet_type_area的点位数和max_layer判断) - rqrq
* @param site 工厂编码
* @param palletId 栈板编码
* @return 是否已满(1=已满,0=未满)
* @author rqrq
* @date 2025/10/19
*/
int checkPalletIsFull(@Param("site") String site, @Param("palletId") String palletId);
WmsTransportTask checkIfHasNeedTask(@Param("site") String site, @Param("palletId") String palletId);
/**
* @Description 查询最新的一条等待通道机复核的任务明细 - rqrq
* @return 任务明细(action_type='等待通道机复核' 且 status='等待中')
* @author rqrq
* @date 2025/11/11
*/
WmsTransportTaskDetail getLatestWaitingRfidReviewTaskDetail();
/**
* @Description 更新任务明细的RFID复核结果 - rqrq
* @param id 任务明细ID
* @param agvCode AGV代码(复核结果:1=成功,2=失败)
* @param comment 备注(RFID列表JSON字符串)
* @param status 状态(已录入)
* @author rqrq
* @date 2025/11/11
*/
void updateTaskDetailWithRfidReviewResult(@Param("id") Long id,
@Param("agvCode") String agvCode,
@Param("comment") String comment,
@Param("status") String status);
/**
* @Description 批量更新任务明细状态为已取消 - rqrq
* @param site 站点
* @param taskNo 任务号
* @param status 状态(已取消)
* @author rqrq
* @date 2025/11/11
*/
void updateTaskDetailStatusByTaskNo(@Param("site") String site,
@Param("taskNo") String taskNo,
@Param("status") String status);
// ==================== 配送任务创建相关方法 - rqrq ====================
/**
* @Description 查询栈板物料的预约信息(关联pallet_detail和handling_unit)- rqrq
* @param site 工厂编码
* @param palletId 栈板编码
* @return 物料预约信息列表(包含serialNo、reserveFlag、reserveOrderRef1/2/3)
* @author rqrq
* @date 2025/11/14
*/
List<Map<String, Object>> getPalletMaterialReserveInfo(@Param("site") String site, @Param("palletId") String palletId);
/**
* @Description 根据notify_no和item_no查询申请单信息 - rqrq
* @param site 工厂编码
* @param notifyNo 申请单号
* @param itemNo 行号
* @return 订单信息(包含productionArea、orderType)
* @author rqrq
* @date 2025/11/14
*/
Map<String, Object> getOrderInfoByNotifyAndItem(@Param("site") String site,
@Param("notifyNo") String notifyNo,
@Param("itemNo") String itemNo);
/**
* @Description 根据site、taskNo、itemNo查询运输任务 - rqrq
* @param site 工厂编码
* @param taskNo 任务编号
* @param itemNo 任务行号
* @return 运输任务信息
* @author rqrq
* @date 2025/11/25
*/
WmsTransportTask getTransportTaskByTaskNoAndItem(@Param("site") String site,
@Param("taskNo") String taskNo,
@Param("itemNo") Integer itemNo);
/**
* @Description 更新运输任务的托盘ID - rqrq
* @param site 工厂编码
* @param taskNo 任务编号
* @param itemNo 任务行号
* @param palletId 新的托盘ID
* @author rqrq
* @date 2025/11/25
*/
void updateTransportTaskPalletId(@Param("site") String site,
@Param("taskNo") String taskNo,
@Param("itemNo") Integer itemNo,
@Param("palletId") String palletId);
}