| | |
| | | import com.zy.asrs.wcs.core.model.MapNode; |
| | | import com.zy.asrs.wcs.core.model.enums.DeviceCtgType; |
| | | import com.zy.asrs.wcs.core.model.enums.MotionStsType; |
| | | import com.zy.asrs.wcs.core.model.enums.TaskCtgType; |
| | | import com.zy.asrs.wcs.core.model.enums.TaskStsType; |
| | | import com.zy.asrs.wcs.core.service.*; |
| | | import com.zy.asrs.wcs.core.utils.RedisUtil; |
| | |
| | | private RedisUtil redisUtil; |
| | | @Autowired |
| | | private BasConveyorService basConveyorService; |
| | | @Autowired |
| | | private BasConveyorStaService basConveyorStaService; |
| | | @Autowired |
| | | private BasConveyorPathService basConveyorPathService; |
| | | @Autowired |
| | | private BasLedService basLedService; |
| | | |
| | |
| | | |
| | | //获取入库任务类型 |
| | | TaskCtg taskCtg = taskCtgService.getOne(new LambdaQueryWrapper<TaskCtg>() |
| | | .eq(TaskCtg::getFlag, "IN") |
| | | .eq(TaskCtg::getFlag, String.valueOf(TaskCtgType.IN)) |
| | | .eq(TaskCtg::getStatus, 1)); |
| | | |
| | | // 判断重复工作档 |
| | |
| | | Integer code = jsonObject.getInteger("code"); |
| | | if (code.equals(200)) { |
| | | StartupDto dto = jsonObject.getObject("data", StartupDto.class); |
| | | devpThread.writeWorkSta(staProtocol.getSiteId(), dto.getWorkNo().shortValue(), dto.getStaNo().shortValue()); |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | |
| | | } else if (code == 500) { |
| | | //获取输送路径 |
| | | BasConveyorPath conveyorPath = basConveyorPathService.getOne(new LambdaQueryWrapper<BasConveyorPath>() |
| | | .eq(BasConveyorPath::getTypeNo, TaskCtgType.IN.val()) |
| | | .eq(BasConveyorPath::getDeviceId, devp.getId()) |
| | | .eq(BasConveyorPath::getStnNo, staProtocol.getSiteId())); |
| | | if (conveyorPath == null) { |
| | | News.error("输送路径不存在"); |
| | | }else { |
| | | devpThread.writeWorkSta(staProtocol.getSiteId(), dto.getWorkNo().shortValue(), conveyorPath.getDeviceStn().shortValue()); |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | } |
| | | }else { |
| | | if (ledThread != null) { |
| | | String errorMsg = jsonObject.getString("msg"); |
| | | if (!Cools.isEmpty(errorMsg)) { |
| | |
| | | } |
| | | } |
| | | News.error("请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v2", JSON.toJSONString(param), response); |
| | | } else if (code == 700) { |
| | | // staProtocol.setWorkNo((short) 32002); |
| | | // staProtocol.setRollback102(1);//102站回退信号 |
| | | // devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | // MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(5, staProtocol)); |
| | | |
| | | // led 异常显示 |
| | | if (ledThread != null) { |
| | | String errorMsg = barcode + "托盘识别异常,请先进行组托!"; |
| | | ledThread.error(errorMsg); |
| | | ledThread.setLedMk(false); |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | |
| | | for (Dict dict : dicts) { |
| | | String[] split = dict.getFlag().split("-"); |
| | | int lev = Integer.parseInt(split[1]); |
| | | |
| | | Object data = redisUtil.get(DeviceRedisConstant.MAP + lev); |
| | | if (data != null) { |
| | | continue; |
| | | } |
| | | |
| | | TreeMap<Integer, List<JSONObject>> rows = new TreeMap<>(); |
| | | //排序Row |
| | |
| | | list.add(mapNode.clone()); |
| | | } |
| | | |
| | | //最后一次检测地图节点是否完整,地图矩阵row均要达到最长row |
| | | for (ArrayList<MapNode> list : lists) { |
| | | int len = (row + 2);//row+2是因为头节点和尾节点存在人为添加的-1节点 |
| | | if (list.size() == len) { |
| | | continue; |
| | | } |
| | | //节点长度不满足,进行补足 |
| | | for (int i = list.size(); i < len; i++) { |
| | | list.add(mapNode.clone()); |
| | | } |
| | | } |
| | | |
| | | |
| | | ArrayList<MapNode> headNodes = new ArrayList<>(); |
| | | ArrayList<MapNode> footerNodes = new ArrayList<>(); |
| | | for (int i = 0; i < row+2; i++) { |
| | |
| | | map.setUpdateTime(now); |
| | | map.setLev(lev); |
| | | |
| | | Object data = redisUtil.get(DeviceRedisConstant.MAP + lev); |
| | | if (data == null) { |
| | | //将地图数据存入redis |
| | | redisUtil.set(DeviceRedisConstant.MAP + lev, JSON.toJSONString(map)); |
| | | } |
| | | //将地图数据存入redis |
| | | redisUtil.set(DeviceRedisConstant.MAP + lev, JSON.toJSONString(map)); |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | |
| | | // 解析入库工作档 |
| | | public synchronized void analyzeInBoundTask() { |
| | | for (Task task : taskService.selectWaitAnalyzeInBoundTask()) { |
| | | if (Cools.isEmpty(task.getShuttleNo())) { |
| | | //分配小车 |
| | | //搜索空闲车 |
| | | ShuttleThread shuttleThread = shuttleDispatcher.searchIdleShuttle(task); |
| | | if (shuttleThread == null) { |
| | | News.info("{}任务未找到空闲穿梭车", task.getTaskNo()); |
| | | continue; |
| | | } |
| | | |
| | | task.setShuttleNo(Integer.valueOf(shuttleThread.getDevice().getDeviceNo()));//保存穿梭车号 |
| | | task.setUpdateTime(new Date()); |
| | | if (!taskService.updateById(task)) { |
| | | News.info("{}任务更新穿梭车号失败", task.getTaskNo()); |
| | | } |
| | | continue; |
| | | } |
| | | |
| | | // generate motion list |
| | | List<Motion> motionList = analyzeService.generateMotion(task); |
| | | if (motionList.isEmpty()) { |
| | |
| | | /** |
| | | * 出库 ====>> 同一时间一台穿梭车只能有一个出库任务 |
| | | */ |
| | | public synchronized void generateOutboundWrkMast() { |
| | | public synchronized void analyzeOutBoundTask() { |
| | | List<Task> tasks = taskService.selectPakOut(); |
| | | if (tasks.isEmpty()) { |
| | | return; |
| | | } |
| | | |
| | | for (Task task : tasks) { |
| | | DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, 1); |
| | | BasConveyorSta originStaObj = basConveyorStaService.selectBySiteNo(task.getOriginSite());//获取源站 |
| | | if (originStaObj == null) { |
| | | continue; |
| | | } |
| | | |
| | | DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, originStaObj.getConveyorId().intValue()); |
| | | StaProtocol staProtocol = devpThread.getStation().get(Integer.parseInt(task.getOriginSite()));//源站 |
| | | StaProtocol staProtocol1 = devpThread.getStation().get(Integer.parseInt(task.getDestSite()));//目标站 |
| | | if (staProtocol == null || staProtocol1 == null) { |
| | |
| | | staProtocol1 = staProtocol1.clone(); |
| | | } |
| | | |
| | | // // 查询站点详细信息 |
| | | // BasDevp staDetl = basDevpService.selectById(outSta.getStaNo()); |
| | | // if (staDetl == null) { |
| | | // log.error("出库 ===>> 站点在数据库不存在, 站点编号={}", outSta.getStaNo()); |
| | | // continue; |
| | | // } |
| | | // 判断堆垛机出库站状态 |
| | | if (staProtocol.isAutoing() && !staProtocol.isLoading() && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) { |
| | | |
| | | if (!(staProtocol1.isAutoing() && !staProtocol1.isLoading() && staProtocol1.getWorkNo() == 0 && staProtocol1.isOutEnable())) { |
| | | continue; |
| | | } |
| | |
| | | // News.info("{}任务,浅库位存在货物,系统等待中", wrkMast.getWrkNo()); |
| | | // continue;//浅库位存在未执行任务 |
| | | // } |
| | | |
| | | if (Cools.isEmpty(task.getShuttleNo())) { |
| | | //分配小车 |
| | | //搜索空闲车 |
| | | ShuttleThread shuttleThread = shuttleDispatcher.searchIdleShuttle(task); |
| | | if (shuttleThread == null) { |
| | | News.info("{}任务未找到空闲穿梭车", task.getTaskNo()); |
| | | continue; |
| | | } |
| | | |
| | | task.setShuttleNo(Integer.valueOf(shuttleThread.getDevice().getDeviceNo()));//保存穿梭车号 |
| | | task.setUpdateTime(new Date()); |
| | | if (!taskService.updateById(task)) { |
| | | News.info("{}任务更新穿梭车号失败", task.getTaskNo()); |
| | | } |
| | | continue; |
| | | } |
| | | |
| | | // generate motion list |
| | | List<Motion> motionList = analyzeService.generateMotion(task); |
| | |
| | | } |
| | | } |
| | | |
| | | // 解析小车移动工作档 |
| | | public synchronized void analyzeMoveTask() { |
| | | for (Task task : taskService.selectWaitAnalyzeMoveTask()) { |
| | | if (Cools.isEmpty(task.getShuttleNo())) { |
| | | //分配小车 |
| | | //搜索空闲车 |
| | | ShuttleThread shuttleThread = shuttleDispatcher.searchIdleShuttle(task); |
| | | if (shuttleThread == null) { |
| | | News.info("{}任务未找到空闲穿梭车", task.getTaskNo()); |
| | | continue; |
| | | } |
| | | |
| | | task.setShuttleNo(Integer.valueOf(shuttleThread.getDevice().getDeviceNo()));//保存穿梭车号 |
| | | task.setUpdateTime(new Date()); |
| | | if (!taskService.updateById(task)) { |
| | | News.info("{}任务更新穿梭车号失败", task.getTaskNo()); |
| | | } |
| | | continue; |
| | | } |
| | | |
| | | // generate motion list |
| | | List<Motion> motionList = analyzeService.generateMotion(task); |
| | | if (motionList.isEmpty()) { |
| | | continue; |
| | | } |
| | | motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo())); |
| | | |
| | | // 更新工作主档 |
| | | task.setTaskSts(TaskStsType.ANALYZE_MOVE.sts); // 工作状态 |
| | | task.setUpdateTime(new Date()); |
| | | if (!taskService.updateById(task)) { |
| | | News.error("更新工作档失败!!! [工作号:{}]", task.getTaskNo()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 四向穿梭车电量检测 ===>> 发起充电 |
| | | */ |
| | |
| | | |
| | | //获取充电任务类型 |
| | | TaskCtg taskCtg = taskCtgService.getOne(new LambdaQueryWrapper<TaskCtg>() |
| | | .eq(TaskCtg::getFlag, "CHARGE") |
| | | .eq(TaskCtg::getFlag, String.valueOf(TaskCtgType.CHARGE)) |
| | | .eq(TaskCtg::getStatus, 1)); |
| | | if (taskCtg == null) { |
| | | return; |
| | |
| | | |
| | | //获取迁移任务类型 |
| | | TaskCtg taskCtg = taskCtgService.getOne(new LambdaQueryWrapper<TaskCtg>() |
| | | .eq(TaskCtg::getFlag, "MOVE") |
| | | .eq(TaskCtg::getFlag, String.valueOf(TaskCtgType.MOVE)) |
| | | .eq(TaskCtg::getStatus, 1)); |
| | | if (taskCtg == null) { |
| | | return; |