package com.ruoyi.schedule.scheduleTask; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.lang.UUID; import com.ruoyi.api.domain.wcs2wms.exception.TaskExceptionReceive; import com.ruoyi.api.domain.wcs2wms.exception.TaskExceptionRequest; import com.ruoyi.api.service.IApiService; import com.ruoyi.bas.cargospace.domain.BasCargoSpace; import com.ruoyi.bas.cargospace.service.IBasCargoSpaceService; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.job.domain.MydoJob; import com.ruoyi.job.service.IJobCallBackService; import com.ruoyi.job.service.IMydoJobService; import com.ruoyi.queue.ddj.domain.DdjDeviceExecutionQueue; import com.ruoyi.queue.ddj.service.IDdjDeviceExecutionQueueService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.List; import static com.ruoyi.common.TaskExceptionType.TASK_EXCEPTION_STOCKIN_OCCUPIED; import static com.ruoyi.common.TaskStatusCode.*; import static com.ruoyi.common.WmsTaskTypeCode.WMS_TASK_TYPE_EXCEPTION; /** * 处理wcs执行作业的定时任务类 */ @Component @Slf4j public class TaskHandler { @Autowired private IMydoJobService mydoJobService; @Autowired private IJobCallBackService jobCallBackService; @Autowired private IBasCargoSpaceService basCargoSpaceService; @Autowired private IApiService apiService; @Autowired private IDdjDeviceExecutionQueueService ddjDeviceExecutionQueueService; private static final int DEFAULTTIMEINTERVAL = 2000; /** * 处理未正常移除的【堆垛机执行完成】或【出库到位】的遗留任务 */ // @Scheduled(fixedDelay = 3000) public void mydoJobHandler() { //查询所有标记为【已完成】的任务 List jobs = mydoJobService.selectMydoJobList( new MydoJob().builder().executionPhase(TASK_EP_FINISH).build() ); if (!jobs.isEmpty()) { for (MydoJob job : jobs) { mydoJobService.taskFinish(Long.valueOf(job.getTaskNo())); } } } /** * 【手动作废】 - 查询并处理标记为已经作废的任务 */ //@Scheduled(fixedDelay = 3000) public void cancelMydoJob(){ List jobs = mydoJobService.selectInOrOutMydoJobList( new MydoJob().builder().status(TASK_STATUS_INVALID).build() ); if (!jobs.isEmpty()) { for (MydoJob job : jobs) { mydoJobService.ManuelTaskFinish(job.getTaskNo()); } } } /** * 【手动完成】 - 查询并处理标记为已经手动完成的任务 */ //@Scheduled(fixedDelay = 3000) public void finishMydoJob(){ List jobs = mydoJobService.selectInOrOutMydoJobList( new MydoJob().builder().status(TASK_STATUS_FINISH_MANUAL).build() ); if (!jobs.isEmpty()) { for (MydoJob job : jobs) { mydoJobService.ManuelTaskFinish(job.getTaskNo()); } } } /** * 定时扫描未回传或回传异常的任务记录 */ @Scheduled(fixedDelay = 3000) public void jobCallBack() { jobCallBackService.jobCallBack(); } /** * 【入库异常-请求重分】 - 【放货有货】处理方法 */ @Scheduled(fixedDelay = DEFAULTTIMEINTERVAL) public void stockinExceptionHandler() { List jobs = mydoJobService.selectInOrOutMydoJobList( new MydoJob().builder().executionPhase(TASK_EXCEPTION_PUT).build() ); String oldCargo = jobs.get(0).getCargoSpaceId(); if (!jobs.isEmpty()) { for (MydoJob job : jobs) { //上报异常 - 向wms请求重分接口 TaskExceptionRequest taskExceptionRequest = new TaskExceptionRequest(); taskExceptionRequest.setTaskClass(job.getInOrOut().substring(0, 1)); taskExceptionRequest.setType(String.valueOf(TASK_EXCEPTION_STOCKIN_OCCUPIED)); taskExceptionRequest.setTaskCode(job.getWmsTaskNo()); taskExceptionRequest.setTaskTypeCode(WMS_TASK_TYPE_EXCEPTION);//wms自定义文本 taskExceptionRequest.setReqCode(UUID.randomUUID().toString().replace("-", "")); taskExceptionRequest.setAdverseCauses("当前位置已有货物,盘点后重新分配货位"); AjaxResult ajaxResult = apiService.reAssign(taskExceptionRequest); if (ajaxResult.isSuccess()){ //获取返回的任务号和新分配的货位 TaskExceptionReceive mydoJobReAssign = BeanUtil.toBean(ajaxResult.get("data"), TaskExceptionReceive.class); MydoJob wmsJob = new MydoJob(); wmsJob.setWmsTaskNo(mydoJobReAssign.getTaskCode()); if (mydoJobService.selectMydoJobList(wmsJob).size() == 0) { log.warn("【响应异常】该任务不存在,任务号:{}", mydoJobReAssign.getTaskCode()); return; } //更新任务参数 job = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(job.getTaskNo())); job.setCargoSpaceId(mydoJobReAssign.getSiteCode()); job.setExecutionPhase(TASK_EXCEPTION_PUT_REASSIGN); job.setFaultFlag("2"); mydoJobService.updateMydoJob(job); log.info("【入库异常】请求wms重分货位成功,异常货位:{},新货位:{},任务号:{}", oldCargo, mydoJobReAssign.getSiteCode(), job.getTaskNo()); }else{ log.info("【入库异常】请求wms重分货位异常,异常上报请求失败,请咨询操作管理员,异常货位:{},当前任务号:{}", oldCargo, job.getTaskNo()); } } } } /** * 【出库异常】 - 【取货无货】处理方法 */ @Scheduled(fixedDelay = DEFAULTTIMEINTERVAL) public void stockoutExceptionHandler() { List jobs = mydoJobService.selectInOrOutMydoJobList( new MydoJob().builder().executionPhase(TASK_EXCEPTION_PICK).build() ); if (!jobs.isEmpty()) { for (MydoJob job : jobs) { //向wms返回异常信息 TaskExceptionRequest taskExceptionRequest = new TaskExceptionRequest(); taskExceptionRequest.setTaskClass(job.getInOrOut().substring(0, 1)); taskExceptionRequest.setType(String.valueOf(TASK_EXCEPTION_STOCKIN_OCCUPIED)); taskExceptionRequest.setTaskCode(String.valueOf(job.getWmsTaskNo())); taskExceptionRequest.setTaskTypeCode(WMS_TASK_TYPE_EXCEPTION);//todo 不知道填什么 taskExceptionRequest.setReqCode(UUID.randomUUID().toString().replace("-", "")); taskExceptionRequest.setAdverseCauses("取货位置空,盘点后作废该任务"); AjaxResult ajaxResult = apiService.reMaterial(taskExceptionRequest); if (ajaxResult.isSuccess()){ mydoJobService.InvalidMydoJob(Long.valueOf(job.getTaskNo()), Integer.valueOf(job.getRoadwayId())); //清空/重置【取货无货】的出库异常货位库存信息 basCargoSpaceService.resetCargoSpaceByStockoutException(job.getCargoSpaceId()); log.info("【出库异常】堆垛机取货时目标位置无货,当前任务已作废,异常货位:{},任务号:{}", job.getCargoSpaceId(), job.getRoadwayId()); }else{ log.info("【出库异常】堆垛机取货时目标位置无货,异常上报请求失败,请咨询操作管理员,异常货位:{},任务号:{}", job.getCargoSpaceId(), job.getRoadwayId()); } } } } /** * 【入库异常-重分完成】 - 堆垛机重新下发 */ @Scheduled(fixedDelay = DEFAULTTIMEINTERVAL) public void sendTaskForStacker(){ List jobs = mydoJobService.selectInOrOutMydoJobList( new MydoJob().builder().executionPhase(TASK_EXCEPTION_PUT_REASSIGN).build() ); if (!jobs.isEmpty()) { for (MydoJob job : jobs) { //获取重分的货位重新向堆垛机下发任务 BasCargoSpace basCargoSpace = basCargoSpaceService.selectBasCargoSpaceByWmsCargoSpaceId(job.getCargoSpaceId()); DdjDeviceExecutionQueue ddjDeviceExecutionQueue = ddjDeviceExecutionQueueService.selectDdjDeviceExecutionQueueByRwh(Long.valueOf(job.getTaskNo()), Integer.valueOf(job.getRoadwayId())); ddjDeviceExecutionQueue.setMbph(basCargoSpace.getThePlatoon()); ddjDeviceExecutionQueue.setMblh(basCargoSpace.getTheColumn()); ddjDeviceExecutionQueue.setMbch(basCargoSpace.getTheFloor()); ddjDeviceExecutionQueue.setDdjxf("0"); ddjDeviceExecutionQueueService.updateDdjDeviceExecutionQueue(ddjDeviceExecutionQueue); } } } }