|
|
@@ -324,55 +324,62 @@ public class RobotNodeServiceImpl implements NodeOperationService {
|
|
|
log.info("节点{}检查机器人资源{}点位返回{}",taskNode.getId(),po.getResourceId(),po.getPointId());
|
|
|
if (po != null) {
|
|
|
// 机器人可用,判断目标地址
|
|
|
- //目标库位,可能是
|
|
|
- Map returnMap = getTargetStorge(nextTaskNode,taskNode.getFindAgvFlag(),bomProcedure.getType());
|
|
|
|
|
|
- //目标地址和类型
|
|
|
- Storge targetStorge = returnMap.get("store")==null?null:(Storge)returnMap.get("store");
|
|
|
- log.info("节点{}检查目标库位是否满足返回{}",taskNode.getId(),targetStorge.getPointId());
|
|
|
- if(null != targetStorge){
|
|
|
-
|
|
|
- String targetxbk = returnMap.get("targetxbk")==null?null:(String)returnMap.get("targetxbk");
|
|
|
- jqrStorge = storgeService.getById(jqrMap.get(DemoLineConstant.DEMOLINE_RJQR_ZS).get(0).getStorgeId());
|
|
|
- jqrStorge.setCompleteBatchNo(task.getCompleteBatchNo());
|
|
|
- storgeService.lockStorge(jqrStorge, nextTaskNode.getId());
|
|
|
- //锁定一个缓存位
|
|
|
- List<ProductionresourcePosition> hcwList = jqrMap.get(jqrMap.keySet().stream().filter(p -> !DemoLineConstant.DEMOLINE_RJQR_ZS.equals(p)).findFirst().get());
|
|
|
- Storge hcwStorge = storgeService.getById(hcwList.get(0).getStorgeId());
|
|
|
- hcwStorge.setCompleteBatchNo(task.getCompleteBatchNo());
|
|
|
- storgeService.lockStorge(hcwStorge, nextTaskNode.getId());
|
|
|
-
|
|
|
- //锁定目标库位
|
|
|
- targetStorge.setCompleteBatchNo(task.getCompleteBatchNo());
|
|
|
- storgeService.lockStorge(targetStorge, nextTaskNode.getId());
|
|
|
- log.info("节点{}提前占用机器人抓手{},缓存位{},目标库位{}",taskNode.getId(),jqrStorge.getPointId(),hcwStorge.getPointId(),targetStorge.getPointId());
|
|
|
- //抓手缓存
|
|
|
- msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_JXS + nextTaskNode.getId(), jqrStorge, 1, TimeUnit.DAYS);
|
|
|
- msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_JXS + taskNode.getId(), jqrStorge, 1, TimeUnit.DAYS);
|
|
|
- //缓存位缓存
|
|
|
- msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_HCW + nextTaskNode.getId(), hcwStorge, 1, TimeUnit.DAYS);
|
|
|
- msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_HCW + taskNode.getId(), hcwStorge, 1, TimeUnit.DAYS);
|
|
|
- //目标缓存
|
|
|
- msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + DemoLineConstant.YUNJIAN_TARGET_STORE + nextTaskNode.getId(), targetStorge, 1, TimeUnit.DAYS);
|
|
|
-
|
|
|
- //目标是线边库
|
|
|
- msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + DemoLineConstant.YUNJIAN_TARGET_XBK_FLAG + nextTaskNode.getId(), targetxbk, 1, TimeUnit.DAYS);
|
|
|
-
|
|
|
- //满足条件--机器人空闲,设备或线边库有一个空闲
|
|
|
- Map locationMap = new HashMap();
|
|
|
- locationMap.put("location",startStore.getPointId());
|
|
|
- dataMap.put("data", locationMap);
|
|
|
- dataMap.put("method", "MoveRobotPosition");
|
|
|
- dataMap.put("result", true);
|
|
|
+ // 判断同一资源是否有优先级更高的任务需要执行,如果有重新进入队列
|
|
|
+ List<TaskNode> highLevelTaskNode = taskNodeService.list(Wraps.<TaskNode>lbQ().lt(TaskNode::getExpectStartTime,taskNode.getExpectStartTime()).eq(TaskNode::getExeStatus,"2").ne(TaskNode::getId,taskNode.getId()));
|
|
|
+ if(highLevelTaskNode.size() > 0){
|
|
|
+ dataMap.put("result", false);
|
|
|
+ }else{
|
|
|
+ //目标库位,可能是
|
|
|
+ Map returnMap = getTargetStorge(nextTaskNode,taskNode.getFindAgvFlag(),bomProcedure.getType());
|
|
|
+
|
|
|
+ //目标地址和类型
|
|
|
+ Storge targetStorge = returnMap.get("store")==null?null:(Storge)returnMap.get("store");
|
|
|
+ log.info("节点{}检查目标库位是否满足返回{}",taskNode.getId(),targetStorge.getPointId());
|
|
|
+ if(null != targetStorge){
|
|
|
+
|
|
|
+ String targetxbk = returnMap.get("targetxbk")==null?null:(String)returnMap.get("targetxbk");
|
|
|
+ jqrStorge = storgeService.getById(jqrMap.get(DemoLineConstant.DEMOLINE_RJQR_ZS).get(0).getStorgeId());
|
|
|
+ jqrStorge.setCompleteBatchNo(task.getCompleteBatchNo());
|
|
|
+ storgeService.lockStorge(jqrStorge, nextTaskNode.getId());
|
|
|
+ //锁定一个缓存位
|
|
|
+ List<ProductionresourcePosition> hcwList = jqrMap.get(jqrMap.keySet().stream().filter(p -> !DemoLineConstant.DEMOLINE_RJQR_ZS.equals(p)).findFirst().get());
|
|
|
+ Storge hcwStorge = storgeService.getById(hcwList.get(0).getStorgeId());
|
|
|
+ hcwStorge.setCompleteBatchNo(task.getCompleteBatchNo());
|
|
|
+ storgeService.lockStorge(hcwStorge, nextTaskNode.getId());
|
|
|
+
|
|
|
+ //锁定目标库位
|
|
|
+ targetStorge.setCompleteBatchNo(task.getCompleteBatchNo());
|
|
|
+ storgeService.lockStorge(targetStorge, nextTaskNode.getId());
|
|
|
+ log.info("节点{}提前占用机器人抓手{},缓存位{},目标库位{}",taskNode.getId(),jqrStorge.getPointId(),hcwStorge.getPointId(),targetStorge.getPointId());
|
|
|
+ //抓手缓存
|
|
|
+ msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_JXS + nextTaskNode.getId(), jqrStorge, 1, TimeUnit.DAYS);
|
|
|
+ msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_JXS + taskNode.getId(), jqrStorge, 1, TimeUnit.DAYS);
|
|
|
+ //缓存位缓存
|
|
|
+ msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_HCW + nextTaskNode.getId(), hcwStorge, 1, TimeUnit.DAYS);
|
|
|
+ msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_HCW + taskNode.getId(), hcwStorge, 1, TimeUnit.DAYS);
|
|
|
+ //目标缓存
|
|
|
+ msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + DemoLineConstant.YUNJIAN_TARGET_STORE + nextTaskNode.getId(), targetStorge, 1, TimeUnit.DAYS);
|
|
|
+
|
|
|
+ //目标是线边库
|
|
|
+ msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + DemoLineConstant.YUNJIAN_TARGET_XBK_FLAG + nextTaskNode.getId(), targetxbk, 1, TimeUnit.DAYS);
|
|
|
+
|
|
|
+ //满足条件--机器人空闲,设备或线边库有一个空闲
|
|
|
+ Map locationMap = new HashMap();
|
|
|
+ locationMap.put("location",startStore.getPointId());
|
|
|
+ dataMap.put("data", locationMap);
|
|
|
+ dataMap.put("method", "MoveRobotPosition");
|
|
|
+ dataMap.put("result", true);
|
|
|
// dataMap.put("bizType", targetxbk);
|
|
|
- // begin modify by yejian on 20220520 for 解决资源抢占时机器人是空闲状态但是实际上面有料不能操作的时候请求指令接口返回失败后进入死循环问题
|
|
|
- // TODO 后续可改成信号对接判断,先如果返回失败释放资源进去队列重新轮训
|
|
|
- // 返回内容中记录当前任务占用资源
|
|
|
+ // begin modify by yejian on 20220520 for 解决资源抢占时机器人是空闲状态但是实际上面有料不能操作的时候请求指令接口返回失败后进入死循环问题
|
|
|
+ // TODO 后续可改成信号对接判断,先如果返回失败释放资源进去队列重新轮训
|
|
|
+ // 返回内容中记录当前任务占用资源
|
|
|
// String occupyResources = jqrStorge.getId() + "," + hcwStorge.getId() + "," + targetStorge.getId();
|
|
|
// dataMap.put(DictionaryType.OCCUPY_RESOURCE+taskNode.getId(),occupyResources);
|
|
|
- // end modify by yejian on 20220520 for 解决资源抢占时机器人是空闲状态但是实际上面有料不能操作的时候请求指令接口返回失败后进入死循环问题
|
|
|
- }else{
|
|
|
- dataMap.put("result", false);
|
|
|
+ // end modify by yejian on 20220520 for 解决资源抢占时机器人是空闲状态但是实际上面有料不能操作的时候请求指令接口返回失败后进入死循环问题
|
|
|
+ }else{
|
|
|
+ dataMap.put("result", false);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
}else{
|
|
|
@@ -426,64 +433,70 @@ public class RobotNodeServiceImpl implements NodeOperationService {
|
|
|
ProductionresourcePosition po = logical(robotList,flikustockInfos,taskNode);
|
|
|
log.info("节点{}检查机器人资源条件返回{}",taskNode.getId(),po);
|
|
|
if (po!=null) {
|
|
|
- Map returnMap = getTargetStorge(nextTaskNode,taskNode.getFindAgvFlag(),bomProcedure.getType());
|
|
|
|
|
|
- //目标地址和类型
|
|
|
- Storge targetStorge = returnMap.get("store")==null?null:(Storge)returnMap.get("store");
|
|
|
- String targetxbk = returnMap.get("targetxbk")==null?null:(String)returnMap.get("targetxbk");
|
|
|
- log.info("节点{}检查目标库位是否满足返回{}",taskNode.getId(),targetStorge.getPointId());
|
|
|
-
|
|
|
- // 立库取子盘到人工上下料站资源不可用时不能进入线边库
|
|
|
- if(taskNode.getCompleteBatchSort()==1 && "1".equals(targetxbk)){
|
|
|
+ List<TaskNode> highLevelTaskNode = taskNodeService.list(Wraps.<TaskNode>lbQ().lt(TaskNode::getExpectStartTime,taskNode.getExpectStartTime()).eq(TaskNode::getExeStatus,"2").ne(TaskNode::getId,taskNode.getId()));
|
|
|
+ if(highLevelTaskNode.size() > 0){
|
|
|
dataMap.put("result", false);
|
|
|
}else{
|
|
|
- if(null != targetStorge){
|
|
|
- jqrStorge = storgeService.getById(robotList.get(0).getStorgeId());
|
|
|
-
|
|
|
- dataMap.put("fromStorge", startStore);
|
|
|
-
|
|
|
- Map locationMap = new HashMap();
|
|
|
- locationMap.put("location",startStore.getPointId());
|
|
|
- dataMap.put("data", locationMap);
|
|
|
- // TODO 有问题,需要区分是否是第一步上料
|
|
|
- //出入库类型
|
|
|
- if(taskNode.getCompleteBatchSort()==1){//TODO 条件后续再丰富
|
|
|
- dataMap.put(DemoLineConstant.DEMOLINE_STOCK_TYPE, DemoLineConstant.DEMOLINE_STOCK_TYPE_TRAY_CRK);
|
|
|
- }else {
|
|
|
- dataMap.put(DemoLineConstant.DEMOLINE_STOCK_TYPE, DemoLineConstant.DEMOLINE_STOCK_TYPE_ALL_CRK);
|
|
|
- }
|
|
|
+ Map returnMap = getTargetStorge(nextTaskNode,taskNode.getFindAgvFlag(),bomProcedure.getType());
|
|
|
|
|
|
- //目的地为机器人手臂
|
|
|
- dataMap.put("toStorge", jqrStorge);
|
|
|
+ //目标地址和类型
|
|
|
+ Storge targetStorge = returnMap.get("store")==null?null:(Storge)returnMap.get("store");
|
|
|
+ String targetxbk = returnMap.get("targetxbk")==null?null:(String)returnMap.get("targetxbk");
|
|
|
+ log.info("节点{}检查目标库位是否满足返回{}",taskNode.getId(),targetStorge.getPointId());
|
|
|
+
|
|
|
+ // 立库取子盘到人工上下料站资源不可用时不能进入线边库
|
|
|
+ if(taskNode.getCompleteBatchSort()==1 && "1".equals(targetxbk)){
|
|
|
+ dataMap.put("result", false);
|
|
|
+ }else{
|
|
|
+ if(null != targetStorge){
|
|
|
+ jqrStorge = storgeService.getById(robotList.get(0).getStorgeId());
|
|
|
+
|
|
|
+ dataMap.put("fromStorge", startStore);
|
|
|
+
|
|
|
+ Map locationMap = new HashMap();
|
|
|
+ locationMap.put("location",startStore.getPointId());
|
|
|
+ dataMap.put("data", locationMap);
|
|
|
+ // TODO 有问题,需要区分是否是第一步上料
|
|
|
+ //出入库类型
|
|
|
+ if(taskNode.getCompleteBatchSort()==1){//TODO 条件后续再丰富
|
|
|
+ dataMap.put(DemoLineConstant.DEMOLINE_STOCK_TYPE, DemoLineConstant.DEMOLINE_STOCK_TYPE_TRAY_CRK);
|
|
|
+ }else {
|
|
|
+ dataMap.put(DemoLineConstant.DEMOLINE_STOCK_TYPE, DemoLineConstant.DEMOLINE_STOCK_TYPE_ALL_CRK);
|
|
|
+ }
|
|
|
+
|
|
|
+ //目的地为机器人手臂
|
|
|
+ dataMap.put("toStorge", jqrStorge);
|
|
|
|
|
|
// dataMap.put("bizType", targetxbk);
|
|
|
- //锁定机器人
|
|
|
- jqrStorge.setCompleteBatchNo(task.getCompleteBatchNo());
|
|
|
- storgeService.lockStorge(jqrStorge, nextTaskNode.getId());
|
|
|
-
|
|
|
- //锁定目标库位
|
|
|
- targetStorge.setCompleteBatchNo(task.getCompleteBatchNo());
|
|
|
- storgeService.lockStorge(targetStorge, nextTaskNode.getId());
|
|
|
-
|
|
|
- //抓手缓存
|
|
|
- msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_JXS + nextTaskNode.getId(), jqrStorge, 1, TimeUnit.DAYS);
|
|
|
- msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_JXS + taskNode.getId(), jqrStorge, 1, TimeUnit.DAYS);
|
|
|
- //目标缓存
|
|
|
- msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + DemoLineConstant.YUNJIAN_TARGET_STORE + nextTaskNode.getId(), targetStorge, 1, TimeUnit.DAYS);
|
|
|
-
|
|
|
- //目标是线边库
|
|
|
- msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + DemoLineConstant.YUNJIAN_TARGET_XBK_FLAG + nextTaskNode.getId(), targetxbk, 1, TimeUnit.DAYS);
|
|
|
- dataMap.put("result", true);
|
|
|
-
|
|
|
- // begin modify by yejian on 20220520 for 解决资源抢占时机器人是空闲状态但是实际上面有料不能操作的时候请求指令接口返回失败后进入死循环问题
|
|
|
- // TODO 后续可改成信号对接判断,先如果返回失败释放资源进去队列重新轮训
|
|
|
- // 返回内容中记录当前任务占用资源
|
|
|
+ //锁定机器人
|
|
|
+ jqrStorge.setCompleteBatchNo(task.getCompleteBatchNo());
|
|
|
+ storgeService.lockStorge(jqrStorge, nextTaskNode.getId());
|
|
|
+
|
|
|
+ //锁定目标库位
|
|
|
+ targetStorge.setCompleteBatchNo(task.getCompleteBatchNo());
|
|
|
+ storgeService.lockStorge(targetStorge, nextTaskNode.getId());
|
|
|
+
|
|
|
+ //抓手缓存
|
|
|
+ msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_JXS + nextTaskNode.getId(), jqrStorge, 1, TimeUnit.DAYS);
|
|
|
+ msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_JXS + taskNode.getId(), jqrStorge, 1, TimeUnit.DAYS);
|
|
|
+ //目标缓存
|
|
|
+ msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + DemoLineConstant.YUNJIAN_TARGET_STORE + nextTaskNode.getId(), targetStorge, 1, TimeUnit.DAYS);
|
|
|
+
|
|
|
+ //目标是线边库
|
|
|
+ msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + DemoLineConstant.YUNJIAN_TARGET_XBK_FLAG + nextTaskNode.getId(), targetxbk, 1, TimeUnit.DAYS);
|
|
|
+ dataMap.put("result", true);
|
|
|
+
|
|
|
+ // begin modify by yejian on 20220520 for 解决资源抢占时机器人是空闲状态但是实际上面有料不能操作的时候请求指令接口返回失败后进入死循环问题
|
|
|
+ // TODO 后续可改成信号对接判断,先如果返回失败释放资源进去队列重新轮训
|
|
|
+ // 返回内容中记录当前任务占用资源
|
|
|
// String occupyResources = jqrStorge.getId() + "," + targetStorge.getId();
|
|
|
// dataMap.put(DictionaryType.OCCUPY_RESOURCE+taskNode.getId(),occupyResources);
|
|
|
- // end modify by yejian on 20220520 for 解决资源抢占时机器人是空闲状态但是实际上面有料不能操作的时候请求指令接口返回失败后进入死循环问题
|
|
|
+ // end modify by yejian on 20220520 for 解决资源抢占时机器人是空闲状态但是实际上面有料不能操作的时候请求指令接口返回失败后进入死循环问题
|
|
|
|
|
|
- }else{
|
|
|
- dataMap.put("result", false);
|
|
|
+ }else{
|
|
|
+ dataMap.put("result", false);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}else{
|