| | |
| | | |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; |
| | | import com.zy.asrs.domain.enums.NotifyMsgType; |
| | | import com.zy.asrs.entity.BasCrnp; |
| | | import com.zy.asrs.entity.BasDevp; |
| | | import com.zy.asrs.entity.BasStation; |
| | | import com.zy.asrs.entity.WrkMast; |
| | | import com.zy.asrs.service.BasDevpService; |
| | | import com.zy.asrs.service.BasStationService; |
| | | import com.zy.asrs.service.WrkAnalysisService; |
| | | import com.zy.asrs.service.WrkMastService; |
| | | import com.zy.asrs.service.*; |
| | | import com.zy.asrs.utils.NotifyUtils; |
| | | import com.zy.common.entity.FindCrnNoResult; |
| | | import com.zy.common.service.CommonService; |
| | |
| | | import com.zy.core.enums.RedisKeyType; |
| | | import com.zy.core.enums.SlaveType; |
| | | import com.zy.core.enums.StationCommandType; |
| | | import com.zy.core.enums.WrkIoType; |
| | | import com.zy.core.enums.WrkStsType; |
| | | import com.zy.core.model.StationObjModel; |
| | | import com.zy.core.model.command.StationCommand; |
| | |
| | | private StationCommandDispatcher stationCommandDispatcher; |
| | | @Autowired |
| | | private StationDispatchLoadSupport stationDispatchLoadSupport; |
| | | |
| | | public void stationInExecute() { |
| | | try { |
| | | List<BasDevp> basDevps = basDevpService.list(new QueryWrapper<>()); |
| | | for (BasDevp basDevp : basDevps) { |
| | | List<StationObjModel> stationList = basDevp.getBarcodeStationList$(); |
| | | for (StationObjModel entity : stationList) { |
| | | stationInExecute(basDevp, entity); |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | @Autowired |
| | | private BasCrnpService basCrnpService; |
| | | |
| | | public void stationOutExecuteFinish(StationObjModel stationObjModel) { |
| | | try { |
| | | if (stationObjModel == null) { |
| | | return; |
| | | } |
| | | Integer stationId = stationObjModel.getStationId(); |
| | | if (stationId == null) { |
| | | return; |
| | | } |
| | | |
| | |
| | | return; |
| | | } |
| | | Map<Integer, StationProtocol> statusMap = stationThread.getStatusMap(); |
| | | StationProtocol stationProtocol = statusMap == null ? null : statusMap.get(stationObjModel.getStationId()); |
| | | if (stationProtocol == null) { |
| | | return; |
| | | StationProtocol stationProtocol = statusMap == null ? null : statusMap.get(stationId); |
| | | WrkMast wrkMast = findCurrentStationRunTask(stationProtocol); |
| | | boolean matchedByRecentArrival = false; |
| | | if (wrkMast == null) { |
| | | wrkMast = findRecentArrivalStationRunTask(stationThread, stationId); |
| | | matchedByRecentArrival = wrkMast != null; |
| | | } |
| | | if (stationProtocol.getTaskNo() <= 0) { |
| | | return; |
| | | } |
| | | WrkMast wrkMast = wrkMastService.selectByWorkNo(stationProtocol.getTaskNo()); |
| | | if (wrkMast == null) { |
| | | return; |
| | | } |
| | | |
| | | if (!wrkMast.getWrkSts().equals(WrkStsType.STATION_RUN.sts)) { |
| | | return; |
| | | } |
| | | Integer wrkNo = wrkMast.getWrkNo(); |
| | | |
| | | if (stationMoveCoordinator != null) { |
| | | stationMoveCoordinator.finishSession(wrkMast.getWrkNo()); |
| | | } |
| | | Date now = new Date(); |
| | | wrkMast.setWrkSts(WrkStsType.STATION_RUN_COMPLETE.sts); |
| | | wrkMast.setIoTime(now); |
| | | wrkMast.setModiTime(now); |
| | | wrkMastService.updateById(wrkMast); |
| | | wrkAnalysisService.markOutboundStationComplete(wrkMast, now); |
| | | notifyUtils.notify(String.valueOf(SlaveType.Devp), stationObjModel.getDeviceNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.STATION_OUT_TASK_RUN_COMPLETE, null); |
| | | redisUtil.set(RedisKeyType.STATION_OUT_EXECUTE_COMPLETE_LIMIT.key + wrkMast.getWrkNo(), "lock", 60); |
| | | clearOutboundDispatchCache(wrkMast); |
| | | attemptClearTaskPath(stationThread, wrkNo); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | |
| | | public void checkTaskToComplete() { |
| | | try { |
| | | List<WrkMast> wrkMasts = wrkMastService.list(new QueryWrapper<WrkMast>().eq("wrk_sts", WrkStsType.STATION_RUN_COMPLETE.sts)); |
| | | for (WrkMast wrkMast : wrkMasts) { |
| | | checkTaskToComplete(wrkMast); |
| | | } |
| | | completeOutboundStationRun(stationObjModel, stationThread, wrkMast, matchedByRecentArrival); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | |
| | | return; |
| | | } |
| | | redisUtil.del(RedisKeyType.DUAL_CRN_OUT_TASK_STATION_INFO.key + wrkMast.getWrkNo()); |
| | | } |
| | | |
| | | private WrkMast findCurrentStationRunTask(StationProtocol stationProtocol) { |
| | | if (stationProtocol == null || stationProtocol.getTaskNo() <= 0) { |
| | | return null; |
| | | } |
| | | WrkMast wrkMast = wrkMastService.selectByWorkNo(stationProtocol.getTaskNo()); |
| | | if (wrkMast == null || !Objects.equals(wrkMast.getWrkSts(), WrkStsType.STATION_RUN.sts)) { |
| | | return null; |
| | | } |
| | | return wrkMast; |
| | | } |
| | | |
| | | private WrkMast findRecentArrivalStationRunTask(StationThread stationThread, Integer stationId) { |
| | | if (stationThread == null || stationId == null || stationId <= 0) { |
| | | return null; |
| | | } |
| | | List<WrkMast> stationRunTasks = wrkMastService.list(new QueryWrapper<WrkMast>() |
| | | .eq("io_type", WrkIoType.OUT.id) |
| | | .eq("sta_no", stationId) |
| | | .eq("wrk_sts", WrkStsType.STATION_RUN.sts) |
| | | .orderByAsc("io_time", "wrk_no")); |
| | | for (WrkMast candidate : stationRunTasks) { |
| | | Integer wrkNo = candidate == null ? null : candidate.getWrkNo(); |
| | | if (wrkNo == null || wrkNo <= 0) { |
| | | continue; |
| | | } |
| | | if (stationThread.hasRecentArrival(stationId, wrkNo)) { |
| | | return candidate; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | private void completeOutboundStationRun(StationObjModel stationObjModel, |
| | | StationThread stationThread, |
| | | WrkMast wrkMast, |
| | | boolean matchedByRecentArrival) { |
| | | if (stationObjModel == null || stationThread == null || wrkMast == null || wrkMast.getWrkNo() == null) { |
| | | return; |
| | | } |
| | | Date now = new Date(); |
| | | boolean updated = wrkMastService.update(null, new UpdateWrapper<WrkMast>() |
| | | .set("wrk_sts", WrkStsType.STATION_RUN_COMPLETE.sts) |
| | | .set("io_time", now) |
| | | .set("modi_time", now) |
| | | .eq("wrk_no", wrkMast.getWrkNo()) |
| | | .eq("wrk_sts", WrkStsType.STATION_RUN.sts)); |
| | | if (!updated) { |
| | | return; |
| | | } |
| | | |
| | | wrkMast.setWrkSts(WrkStsType.STATION_RUN_COMPLETE.sts); |
| | | wrkMast.setIoTime(now); |
| | | wrkMast.setModiTime(now); |
| | | if (stationMoveCoordinator != null) { |
| | | stationMoveCoordinator.finishSession(wrkMast.getWrkNo()); |
| | | } |
| | | wrkAnalysisService.markOutboundStationComplete(wrkMast, now); |
| | | notifyUtils.notify(String.valueOf(SlaveType.Devp), stationObjModel.getDeviceNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.STATION_OUT_TASK_RUN_COMPLETE, null); |
| | | redisUtil.set(RedisKeyType.STATION_OUT_EXECUTE_COMPLETE_LIMIT.key + wrkMast.getWrkNo(), "lock", 60); |
| | | clearOutboundDispatchCache(wrkMast); |
| | | attemptClearTaskPath(stationThread, wrkMast.getWrkNo()); |
| | | if (matchedByRecentArrival) { |
| | | News.info("输送站出库完成补偿命中最近到站缓存,目标站={},工作号={}", stationObjModel.getStationId(), wrkMast.getWrkNo()); |
| | | } |
| | | } |
| | | |
| | | public void attemptClearTaskPath(StationThread stationThread, Integer taskNo) { |
| | |
| | | return; |
| | | } |
| | | |
| | | Integer crnNo = wrkMast.getCrnNo(); |
| | | BasCrnp basCrnp = basCrnpService.getOne(new QueryWrapper<BasCrnp>().eq("crn_no", crnNo)); |
| | | if (basCrnp == null) { |
| | | News.taskInfo(wrkMast.getWrkNo(), "{}工作,未找到堆垛机数据", wrkMast.getWrkNo()); |
| | | return; |
| | | } |
| | | |
| | | int maxInTask = 3; |
| | | if (basCrnp.getMaxInTask() != null) { |
| | | maxInTask = basCrnp.getMaxInTask(); |
| | | } |
| | | |
| | | long count = wrkMastService.count(new QueryWrapper<WrkMast>().eq("crn_no", crnNo).eq("wrk_sts", WrkStsType.INBOUND_STATION_RUN.sts)); |
| | | if(count >= maxInTask) { |
| | | News.taskInfo(wrkMast.getWrkNo(), "{}工作,堆垛机到达任务上限,稍后执行", wrkMast.getWrkNo()); |
| | | stationProtocol.setSystemWarning(wrkMast.getWrkNo() + "工作,堆垛机到达任务上限,稍后执行"); |
| | | return; |
| | | } |
| | | |
| | | String locNo = wrkMast.getLocNo(); |
| | | FindCrnNoResult findCrnNoResult = commonService.findCrnNoByLocNo(locNo); |
| | | if (findCrnNoResult == null) { |