package com.zy.core.utils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.zy.asrs.domain.param.CreateInTaskParam; import com.zy.asrs.entity.BasCrnp; import com.zy.asrs.entity.BasDevp; import com.zy.asrs.entity.HttpRequestLog; import com.zy.asrs.entity.WrkMast; import com.zy.asrs.service.BasCrnpService; import com.zy.asrs.service.BasDevpService; import com.zy.asrs.service.HttpRequestLogService; import com.zy.asrs.service.WrkMastService; import com.zy.asrs.utils.Utils; import com.zy.common.model.StartupDto; import com.zy.common.service.CommonService; import com.zy.common.utils.HttpHandler; import com.zy.common.utils.RedisUtil; import com.zy.core.News; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.SlaveConnection; import com.zy.core.enums.RedisKeyType; import com.zy.core.enums.SlaveType; import com.zy.core.enums.WrkStsType; import com.zy.core.model.StationObjModel; import com.zy.core.model.Task; import com.zy.core.model.command.StationCommand; import com.zy.core.model.protocol.StationProtocol; import com.zy.core.thread.StationThread; import com.zy.system.entity.Config; import com.zy.system.service.ConfigService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.*; @Component public class StationOperateProcessUtils { @Autowired private BasDevpService basDevpService; @Autowired private WrkMastService wrkMastService; @Autowired private CommonService commonService; @Autowired private BasCrnpService basCrnpService; @Autowired private RedisUtil redisUtil; @Autowired private ConfigService configService; @Autowired private HttpRequestLogService httpRequestLogService; //执行输送站点入库任务 public synchronized void stationInExecute() { List basDevps = basDevpService.selectList(new EntityWrapper<>()); for (BasDevp basDevp : basDevps) { StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basDevp.getDevpNo()); if(stationThread == null){ continue; } Map stationMap = stationThread.getStatusMap(); List list = basDevp.getBarcodeStationList$(); for (StationObjModel entity : list) { Integer stationId = entity.getStationId(); if(!stationMap.containsKey(stationId)){ continue; } StationProtocol stationProtocol = stationMap.get(stationId); if (stationProtocol == null) { continue; } Object lock = redisUtil.get(RedisKeyType.STATION_IN_EXECUTE_LIMIT.key + stationId); if(lock != null){ continue; } //满足自动、有物、有工作号 if (stationProtocol.isAutoing() && stationProtocol.isLoading() && stationProtocol.getTaskNo() > 0 ) { //检测任务是否生成 WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper().eq("barcode", stationProtocol.getBarcode())); if (wrkMast == null) { continue; } if (wrkMast.getWrkSts() == WrkStsType.INBOUND_DEVICE_RUN.sts) { continue; } if (!wrkMast.getWrkNo().equals(stationProtocol.getTaskNo())) { News.taskInfo(stationProtocol.getStationId(), "输送站点工作号:{}与条码搜索到的任务工作号:{}不一致", stationProtocol.getTaskNo(), wrkMast.getWrkNo()); continue; } String locNo = wrkMast.getLocNo(); Integer crnNo = commonService.findCrnNoByLocNo(locNo); if (crnNo == null) { News.taskInfo(wrkMast.getWrkNo(), "未匹配到堆垛机"); continue; } Integer targetStationId = commonService.findInStationId(crnNo, stationId); if (targetStationId == null) { News.taskInfo(wrkMast.getWrkNo(), "搜索入库站点失败"); continue; } StationCommand command = stationThread.getMoveCommand(wrkMast.getWrkNo(), stationId, targetStationId, 0); if(command == null){ News.taskInfo(wrkMast.getWrkNo(), "获取输送线命令失败"); continue; } wrkMast.setWrkSts(WrkStsType.INBOUND_DEVICE_RUN.sts); wrkMast.setSourceStaNo(stationProtocol.getStationId()); wrkMast.setStaNo(targetStationId); wrkMast.setSystemMsg(""); wrkMast.setIoTime(new Date()); if (wrkMastService.updateById(wrkMast)) { MessageQueue.offer(SlaveType.Devp, basDevp.getDevpNo(), new Task(2, command)); News.info("输送站点入库命令下发成功,站点号={},工作号={},命令数据={}", stationId, wrkMast.getWrkNo(), JSON.toJSONString(command)); redisUtil.set(RedisKeyType.STATION_IN_EXECUTE_LIMIT.key + stationId, "lock", 5); } } } } } //执行输送站点出库任务 public synchronized void stationOutExecute() { List wrkMasts = wrkMastService.selectList(new EntityWrapper().eq("wrk_sts", WrkStsType.OUTBOUND_RUN_COMPLETE.sts)); for (WrkMast wrkMast : wrkMasts) { BasCrnp basCrnp = basCrnpService.selectOne(new EntityWrapper().eq("crn_no", wrkMast.getCrnNo())); if (basCrnp == null) { continue; } List outStationList = basCrnp.getOutStationList$(); if(outStationList.isEmpty()){ News.info("堆垛机:{} 出库站点未设置", basCrnp.getCrnNo()); continue; } for (StationObjModel stationObjModel : outStationList) { StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, stationObjModel.getDeviceNo()); if(stationThread == null){ continue; } Map stationMap = stationThread.getStatusMap(); StationProtocol stationProtocol = stationMap.get(stationObjModel.getStationId()); if (stationProtocol == null) { continue; } Object lock = redisUtil.get(RedisKeyType.STATION_OUT_EXECUTE_LIMIT.key + stationProtocol.getStationId()); if (lock != null) { continue; } //满足自动、有物、工作号0 if (stationProtocol.isAutoing() && stationProtocol.isLoading() && stationProtocol.getTaskNo() == 0 ) { StationCommand command = stationThread.getMoveCommand(wrkMast.getWrkNo(), stationProtocol.getStationId(), wrkMast.getStaNo(), 0); if(command == null){ News.taskInfo(wrkMast.getWrkNo(), "获取输送线命令失败"); continue; } wrkMast.setWrkSts(WrkStsType.STATION_RUN.sts); wrkMast.setSystemMsg(""); wrkMast.setIoTime(new Date()); if (wrkMastService.updateById(wrkMast)) { MessageQueue.offer(SlaveType.Devp, stationObjModel.getDeviceNo(), new Task(2, command)); News.info("输送站点出库命令下发成功,站点号={},工作号={},命令数据={}", stationProtocol.getStationId(), wrkMast.getWrkNo(), JSON.toJSONString(command)); redisUtil.set(RedisKeyType.STATION_OUT_EXECUTE_LIMIT.key + stationProtocol.getStationId(), "lock", 5); } } } } } //检测输送站点出库任务执行完成 public synchronized void stationOutExecuteFinish() { List wrkMasts = wrkMastService.selectList(new EntityWrapper().eq("wrk_sts", WrkStsType.STATION_RUN.sts)); for (WrkMast wrkMast : wrkMasts) { Integer wrkNo = wrkMast.getWrkNo(); boolean complete = true; List basDevps = basDevpService.selectList(new EntityWrapper<>()); for (BasDevp basDevp : basDevps) { StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basDevp.getDevpNo()); if (stationThread == null) { continue; } List list = stationThread.getStatus(); for (StationProtocol stationProtocol : list) { if (stationProtocol.getTaskNo().equals(wrkNo)) { complete = false; } } } if (complete) { wrkMast.setWrkSts(WrkStsType.COMPLETE_OUTBOUND.sts); wrkMast.setIoTime(new Date()); wrkMastService.updateById(wrkMast); } } } //检测输送站点是否运行堵塞 public synchronized void checkStationRunBlock() { String wmsUrl = null; Config wmsSystemUriConfig = configService.selectOne(new EntityWrapper().eq("code", "wmsSystemUri")); if (wmsSystemUriConfig != null) { wmsUrl = wmsSystemUriConfig.getValue(); } if(wmsUrl == null){ News.error("未配置WMS系统URI,配置文件Code编码:wmsSystemUri"); return; } String wmsSystemReassignInTaskUrl = null; Config wmsSystemReassignInTaskUrlConfig = configService.selectOne(new EntityWrapper().eq("code", "wmsSystemReassignInTaskUrl")); if (wmsSystemReassignInTaskUrlConfig != null) { wmsSystemReassignInTaskUrl = wmsSystemReassignInTaskUrlConfig.getValue(); } if(wmsSystemReassignInTaskUrl == null){ News.error("未配置WMS任务重新分配入库库位接口地址,配置文件Code编码:wmsSystemReassignInTaskUrl"); return; } List basDevps = basDevpService.selectList(new EntityWrapper<>()); for (BasDevp basDevp : basDevps) { StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basDevp.getDevpNo()); if(stationThread == null){ continue; } List list = stationThread.getStatus(); for (StationProtocol stationProtocol : list) { if(stationProtocol.isAutoing() && stationProtocol.isLoading() && stationProtocol.getTaskNo() > 0 && stationProtocol.isRunBlock() ) { //运行堵塞,重新申请任务 WrkMast wrkMast = wrkMastService.selectByWorkNo(stationProtocol.getTaskNo()); if (wrkMast == null) { News.info("输送站点号={} 运行阻塞,但无法找到对应任务,工作号={}", stationProtocol.getStationId(), stationProtocol.getTaskNo()); continue; } Object lock = redisUtil.get(RedisKeyType.CHECK_STATION_RUN_BLOCK_LIMIT_.key + stationProtocol.getTaskNo()); if (lock != null) { continue; } redisUtil.set(RedisKeyType.CHECK_STATION_RUN_BLOCK_LIMIT_.key + stationProtocol.getTaskNo(), "lock", 15); HashMap requestParam = new HashMap<>(); String response = null; try { requestParam.put("taskNo", wrkMast.getWmsWrkNo()); requestParam.put("row", Utils.getInTaskEnableRow(new ArrayList<>(basDevp.getDevpNo()))); response = new HttpHandler.Builder() .setUri(wmsUrl) .setPath(wmsSystemReassignInTaskUrl) .setJson(JSON.toJSONString(requestParam)) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); if (jsonObject.getInteger("code").equals(200)) { StartupDto dto = jsonObject.getObject("data", StartupDto.class); String locNo = dto.getLocNo(); //更新数据 wrkMast.setLocNo(locNo); wrkMastService.updateById(wrkMast); Integer crnNo = commonService.findCrnNoByLocNo(locNo); if (crnNo == null) { News.taskInfo(wrkMast.getWrkNo(), "未匹配到堆垛机"); continue; } Integer targetStationId = commonService.findInStationId(crnNo, stationProtocol.getStationId()); if (targetStationId == null) { News.taskInfo(wrkMast.getWrkNo(), "搜索入库站点失败"); continue; } StationCommand command = stationThread.getMoveCommand(wrkMast.getWrkNo(), stationProtocol.getStationId(), targetStationId, 0); if(command == null){ News.taskInfo(wrkMast.getWrkNo(), "获取输送线命令失败"); continue; } MessageQueue.offer(SlaveType.Devp, basDevp.getDevpNo(), new Task(2, command)); News.info("请求WMS接口成功!!!url:{};request:{};response:{}", wmsUrl + wmsSystemReassignInTaskUrl, JSON.toJSONString(requestParam), response); } else { News.error("请求WMS接口失败!!!url:{};request:{};response:{}", wmsUrl + wmsSystemReassignInTaskUrl, JSON.toJSONString(requestParam), response); } } catch (Exception e) { News.error("请求WMS接口异常!!!url:{};request:{}; response:{}", wmsUrl + wmsSystemReassignInTaskUrl, JSON.toJSONString(requestParam), response, e); } finally { HttpRequestLog httpRequestLog = new HttpRequestLog(); httpRequestLog.setName(wmsUrl + wmsSystemReassignInTaskUrl); httpRequestLog.setRequest(JSON.toJSONString(requestParam)); httpRequestLog.setResponse(response); httpRequestLog.setCreateTime(new Date()); httpRequestLogService.insert(httpRequestLog); } } } } } }