|  |  |  | 
|---|
|  |  |  | private TransferOrderService transferOrderService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private TransferService transferService; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private RestTemplate restTemplate; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private RemotesInfoProperties.RcsApi rcsApi; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private BasStationService basStationService; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * @param | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 任务自动下发 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @throws Exception | 
|---|
|  |  |  | * 非光电站点任务下发 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @Scheduled(cron = "0/5 * * * * ?  ") | 
|---|
|  |  |  | @Transactional(rollbackFor = Exception.class) | 
|---|
|  |  |  | public void pubTaskToWcs() { | 
|---|
|  |  |  | Long loginUserId = SystemAuthUtils.getLoginUserId(); | 
|---|
|  |  |  | List<Integer> list = Arrays.asList(TaskType.TASK_TYPE_IN.type, TaskType.TASK_TYPE_OUT.type, TaskType.TASK_TYPE_LOC_MOVE.type, TaskType.TASK_TYPE_EMPITY_IN.type | 
|---|
|  |  |  | , TaskType.TASK_TYPE_CHECK_IN.type, TaskType.TASK_TYPE_MERGE_IN.type, TaskType.TASK_TYPE_EMPITY_OUT.type, TaskType.TASK_TYPE_PICK_IN.type, | 
|---|
|  |  |  | TaskType.TASK_TYPE_PICK_AGAIN_OUT.type, TaskType.TASK_TYPE_CHECK_OUT.type, TaskType.TASK_TYPE_MERGE_OUT.type); | 
|---|
|  |  |  | List<Integer> integers = Arrays.asList(TaskStsType.GENERATE_IN.id, TaskStsType.GENERATE_OUT.id); | 
|---|
|  |  |  | List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>() | 
|---|
|  |  |  | .in(Task::getTaskType, list) | 
|---|
|  |  |  | .in(Task::getTaskStatus, integers).last("limit 1") | 
|---|
|  |  |  | .orderByDesc(Task::getSort)); | 
|---|
|  |  |  | for (Task task : tasks) { | 
|---|
|  |  |  | /**移库不做站点操作*/ | 
|---|
|  |  |  | if (!task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { | 
|---|
|  |  |  | BasStation station = basStationService.getOne(new LambdaQueryWrapper<BasStation>() | 
|---|
|  |  |  | .eq(BasStation::getStationName, | 
|---|
|  |  |  | task.getTaskStatus().equals(TaskStsType.GENERATE_IN.id) ? task.getOrgSite() : task.getTargSite())); | 
|---|
|  |  |  | if (station.getType().equals(StationTypeEnum.STATION_TYPE_MUTI.type)) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | /**下发普通站点任务,报错回滚,不再往下执行*/ | 
|---|
|  |  |  | pubTaskToWcs(task); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public void taskToWCS() { | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * @author Ryan | 
|---|
|  |  |  | * @date 2025/9/4 | 
|---|
|  |  |  | * @description: 光电站点任务下发 | 
|---|
|  |  |  | * @version 1.0 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | //    @Scheduled(cron = "0/5 * * * * ?  ") | 
|---|
|  |  |  | @Transactional(rollbackFor = Exception.class) | 
|---|
|  |  |  | public void taskToWCS() throws Exception { | 
|---|
|  |  |  | Long loginUserId = SystemAuthUtils.getLoginUserId(); | 
|---|
|  |  |  | List<Integer> list = Arrays.asList(TaskType.TASK_TYPE_IN.type, TaskType.TASK_TYPE_OUT.type, TaskType.TASK_TYPE_LOC_MOVE.type, TaskType.TASK_TYPE_EMPITY_IN.type | 
|---|
|  |  |  | , TaskType.TASK_TYPE_CHECK_IN.type, TaskType.TASK_TYPE_MERGE_IN.type, TaskType.TASK_TYPE_EMPITY_OUT.type, | 
|---|
|  |  |  | 
|---|
|  |  |  | .in(Task::getTaskStatus, integers) | 
|---|
|  |  |  | .orderByDesc(Task::getSort)); | 
|---|
|  |  |  | for (Task task : tasks) { | 
|---|
|  |  |  | //            Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getBarcode, task.getBarcode())); | 
|---|
|  |  |  | //            if (Objects.isNull(loc)) { | 
|---|
|  |  |  | //                continue; | 
|---|
|  |  |  | //            } | 
|---|
|  |  |  | //            //判断是否深库位 | 
|---|
|  |  |  | //            if (!LocUtils.isShallowLoc(loc.getCode())) { | 
|---|
|  |  |  | //                //获取深库位对应的浅库位 | 
|---|
|  |  |  | //                String shallowLoc = LocUtils.getShallowLoc(loc.getCode()); | 
|---|
|  |  |  | //                if (StringUtils.isBlank(shallowLoc)) { | 
|---|
|  |  |  | //                    continue; | 
|---|
|  |  |  | //                } | 
|---|
|  |  |  | //                Loc shalloc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, shallowLoc)); | 
|---|
|  |  |  | //                if (Objects.isNull(shalloc) || !shalloc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_F.type)) { | 
|---|
|  |  |  | //                    //如果浅库位不在库跳出循环 | 
|---|
|  |  |  | //                    continue; | 
|---|
|  |  |  | //                } | 
|---|
|  |  |  | //                LocToTaskParams params = new LocToTaskParams(); | 
|---|
|  |  |  | //                params.setOrgLoc(shallowLoc).setType(TaskType.TASK_TYPE_LOC_MOVE.type + ""); | 
|---|
|  |  |  | //                //生成移库任务 | 
|---|
|  |  |  | //                Task moveTask = locItemService.genMoveTask(params, loginUserId); | 
|---|
|  |  |  | //                moveTask.setSort(!Objects.isNull(task.getSort()) ? task.getSort() + 1 : Constants.TASK_SORT_DEFAULT_VALUE + 1); | 
|---|
|  |  |  | //                if (!taskService.updateById(moveTask)) { | 
|---|
|  |  |  | //                    throw new Exception("任务优先级更新失败!!"); | 
|---|
|  |  |  | //                } | 
|---|
|  |  |  | //            } | 
|---|
|  |  |  | //TODO 调用下发任务接口 | 
|---|
|  |  |  | /**移库不做站点操作*/ | 
|---|
|  |  |  | if (!task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { | 
|---|
|  |  |  | BasStation station = basStationService.getOne(new LambdaQueryWrapper<BasStation>().eq(BasStation::getStationName, | 
|---|
|  |  |  | task.getTaskStatus().equals(TaskStsType.GENERATE_IN.id) ? task.getOrgSite() : task.getTargSite())); | 
|---|
|  |  |  | /**过滤掉普通站点任务*/ | 
|---|
|  |  |  | if (station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getBarcode, task.getBarcode())); | 
|---|
|  |  |  | if (Objects.isNull(loc)) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //判断是否深库位 | 
|---|
|  |  |  | if (!LocUtils.isShallowLoc(loc.getCode())) { | 
|---|
|  |  |  | //获取深库位对应的浅库位 | 
|---|
|  |  |  | String shallowLoc = LocUtils.getShallowLoc(loc.getCode()); | 
|---|
|  |  |  | if (StringUtils.isBlank(shallowLoc)) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | Loc shalloc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, shallowLoc)); | 
|---|
|  |  |  | if (Objects.isNull(shalloc) || !shalloc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_F.type)) { | 
|---|
|  |  |  | //如果浅库位不在库跳出循环 | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | LocToTaskParams params = new LocToTaskParams(); | 
|---|
|  |  |  | params.setOrgLoc(shallowLoc).setType(TaskType.TASK_TYPE_LOC_MOVE.type + ""); | 
|---|
|  |  |  | //生成移库任务 | 
|---|
|  |  |  | Task moveTask = locItemService.genMoveTask(params, loginUserId); | 
|---|
|  |  |  | moveTask.setSort(!Objects.isNull(task.getSort()) ? task.getSort() + 1 : Constants.TASK_SORT_DEFAULT_VALUE + 1); | 
|---|
|  |  |  | if (!taskService.updateById(moveTask)) { | 
|---|
|  |  |  | throw new Exception("任务优先级更新失败!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | /**下发任务*/ | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | pubTaskToWcs(task); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | log.error(e.getMessage()); | 
|---|
|  |  |  | log.error("任务下发失败!!", e); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | //任务类型,任务编码 | 
|---|
|  |  |  | itemParam.setTaskType(RcsTaskType.getTypeDesc(task.getTaskType())) | 
|---|
|  |  |  | .setSeqNum(task.getTaskCode()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //主参数 | 
|---|
|  |  |  | taskParams.setBatch(task.getBarcode()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | BasStation station = null; | 
|---|
|  |  |  | if (!task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { | 
|---|
|  |  |  | station = basStationService.getOne(new LambdaQueryWrapper<BasStation>().eq(BasStation::getStationName, task.getTargSite())); | 
|---|
|  |  |  | if (Objects.isNull(station)) { | 
|---|
|  |  |  | throw new CoolException("站点不存在!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /**判断是否光电站点,非光店站点需管控站点状态*/ | 
|---|
|  |  |  | if (!Objects.isNull(station) && station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) { | 
|---|
|  |  |  | if (task.getTaskType() <= TaskType.TASK_TYPE_CHECK_IN.type && !task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { | 
|---|
|  |  |  | //                if (!station.getUseStatus().equals(LocStsType.LOC_STS_TYPE_F.type)) { | 
|---|
|  |  |  | //                    throw new CoolException( "当前站点不是F.在库状态状态!!"); | 
|---|
|  |  |  | //                } | 
|---|
|  |  |  | station.setUseStatus(LocStsType.LOC_STS_TYPE_R.type); | 
|---|
|  |  |  | if (!basStationService.updateById(station)) { | 
|---|
|  |  |  | throw new CoolException("站点状态更新失败!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else if (task.getTaskType() >= TaskType.TASK_TYPE_OUT.type) { | 
|---|
|  |  |  | if (!station.getUseStatus().equals(LocStsType.LOC_STS_TYPE_O.type)) { | 
|---|
|  |  |  | throw new CoolException("目标站点不处O.空闲状态,无法预约出库。"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | station.setUseStatus(LocStsType.LOC_STS_TYPE_S.type); | 
|---|
|  |  |  | if (!basStationService.updateById(station)) { | 
|---|
|  |  |  | throw new CoolException("站点状态更新失败!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /**移库参数*/ | 
|---|
|  |  |  | if (task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { | 
|---|
|  |  |  | itemParam.setOriLoc(task.getOrgLoc()).setDestLoc(task.getTargLoc()); | 
|---|
|  |  |  | } else if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type) | 
|---|
|  |  |  | || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_IN.type) | 
|---|
|  |  |  | || task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_IN.type)) { | 
|---|
|  |  |  | /**全板入库参数*/ | 
|---|
|  |  |  | itemParam.setDestLoc(task.getTargLoc()) | 
|---|
|  |  |  | .setOriSta(task.getOrgSite()); | 
|---|
|  |  |  | } else if (task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type) || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_IN.type)) { | 
|---|
|  |  |  | /**拣料/盘点入库参数*/ | 
|---|
|  |  |  | itemParam.setDestLoc(task.getTargLoc()) | 
|---|
|  |  |  | .setOriSta(task.getTargSite()); | 
|---|
|  |  |  | } else if (task.getTaskType().equals(TaskType.TASK_TYPE_OUT.type) | 
|---|
|  |  |  | 
|---|
|  |  |  | || task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_OUT.type) | 
|---|
|  |  |  | || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_OUT.type) | 
|---|
|  |  |  | || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_OUT.type)) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /**出库参数*/ | 
|---|
|  |  |  | itemParam.setOriLoc(task.getOrgLoc()) | 
|---|
|  |  |  | .setDestSta(task.getTargSite()); | 
|---|
|  |  |  | } else if (task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { | 
|---|
|  |  |  | itemParam.setOriLoc(task.getOrgLoc()).setDestLoc(task.getTargLoc()); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | /**站点间移库参数*/ | 
|---|
|  |  |  | itemParam.setOriSta(task.getOrgSite()).setDestSta(task.getTargSite()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | BasStation curSta = basStationService.getOne(new LambdaQueryWrapper<BasStation>().eq(BasStation::getStationName, task.getOrgSite())); | 
|---|
|  |  |  | if (Objects.isNull(curSta)) { | 
|---|
|  |  |  | throw new CoolException("站点不存在!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (curSta.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) { | 
|---|
|  |  |  | if (!curSta.getUseStatus().equals(LocStsType.LOC_STS_TYPE_F.type)) { | 
|---|
|  |  |  | throw new CoolException("当前站点不是F.在库状态!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) { | 
|---|
|  |  |  | if (!station.getUseStatus().equals(LocStsType.LOC_STS_TYPE_O.type)) { | 
|---|
|  |  |  | throw new CoolException("目标站点不是O.空闲状态!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<TaskItemParam> items = Arrays.asList(itemParam); | 
|---|
|  |  |  | 
|---|
|  |  |  | .set(Task::getTaskStatus, TaskStsType.WCS_EXECUTE_IN.id))) { | 
|---|
|  |  |  | throw new CoolException("任务状态修改失败!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | /**排除移库功能*/ | 
|---|
|  |  |  | if (!task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { | 
|---|
|  |  |  | /**如果是普通站点,修改站点状态为出库预约*/ | 
|---|
|  |  |  | if (station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) { | 
|---|
|  |  |  | station.setUseStatus(LocStsType.LOC_STS_TYPE_R.type); | 
|---|
|  |  |  | if (!basStationService.updateById(station)) { | 
|---|
|  |  |  | throw new CoolException("站点预约失败!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else if (task.getTaskType().equals(TaskType.TASK_TYPE_OUT.type) | 
|---|
|  |  |  | || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_OUT.type) | 
|---|
|  |  |  | || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_OUT.type) | 
|---|
|  |  |  | || task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_OUT.type) | 
|---|
|  |  |  | || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_OUT.type) | 
|---|
|  |  |  | ) { | 
|---|
|  |  |  | || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_OUT.type)) { | 
|---|
|  |  |  | if (!taskService.update(new LambdaUpdateWrapper<Task>().eq(Task::getTaskCode, task.getTaskCode()) | 
|---|
|  |  |  | .set(Task::getTaskStatus, TaskStsType.WCS_EXECUTE_OUT.id))) { | 
|---|
|  |  |  | throw new CoolException("任务状态修改失败!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | /**如果是普通站点,修改站点状态为入库预约*/ | 
|---|
|  |  |  | if (station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) { | 
|---|
|  |  |  | station.setUseStatus(LocStsType.LOC_STS_TYPE_S.type); | 
|---|
|  |  |  | if (!basStationService.updateById(station)) { | 
|---|
|  |  |  | throw new CoolException("站点预约失败!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | throw new CoolException("任务下发失败!!"); | 
|---|