|
|
@@ -375,7 +375,6 @@ public class RobotNodeServiceImpl implements NodeOperationService {
|
|
|
log.info("节点{}查找物料所在位子{}",taskNode.getId(),startStore.getPointId());
|
|
|
// begin modify by yejian on 20220510 for 条件检验先检查机器人,在检查目标库位
|
|
|
ProductionresourcePosition po = logical(robotList,flikustockInfos,taskNode);
|
|
|
- log.info("节点{}检查机器人资源{}点位返回{}",taskNode.getId(),po.getResourceId(),po.getPointId());
|
|
|
if (po != null) {
|
|
|
// 机器人可用,判断目标地址
|
|
|
// 判断同一资源是否有优先级更高的任务需要执行,如果有重新进入队列
|
|
|
@@ -396,6 +395,7 @@ public class RobotNodeServiceImpl implements NodeOperationService {
|
|
|
|
|
|
//目标地址和类型
|
|
|
Storge targetStorge = returnMap.get("store")==null?null:(Storge)returnMap.get("store");
|
|
|
+ Long targetStorgeResourceId= returnMap.get("storeResourceId")==null?null:Long.valueOf(returnMap.get("storeResourceId").toString());
|
|
|
log.info("节点{}检查目标库位是否满足返回{}",taskNode.getId(),targetStorge.getPointId());
|
|
|
if(null != targetStorge){
|
|
|
|
|
|
@@ -409,9 +409,20 @@ public class RobotNodeServiceImpl implements NodeOperationService {
|
|
|
hcwStorge.setCompleteBatchNo(task.getCompleteBatchNo());
|
|
|
storgeService.lockStorge(hcwStorge, nextTaskNode.getId());
|
|
|
|
|
|
- //锁定目标库位
|
|
|
- targetStorge.setCompleteBatchNo(task.getCompleteBatchNo());
|
|
|
- storgeService.lockStorge(targetStorge, nextTaskNode.getId());
|
|
|
+ // add by yejian on 20220819 for 将机器人上的缓存位利用历来:如果缓存位数量n-1 >= 1,则可以将工件不放到线边库,直接放在缓存位上暂存后轮训线边库逻辑
|
|
|
+ List<ProductionresourcePosition> robotHcwList = robotList.stream().filter(p -> !p.getPointId().equals(DemoLineConstant.DEMOLINE_RJQR_ZS)).collect(Collectors.toList());
|
|
|
+
|
|
|
+ log.info("节点{}检查机器人缓存位库位数{}",taskNode.getId(),robotHcwList.size());
|
|
|
+ nextTaskNode = taskNodeService.getNextNTaskNode(taskNode,1);
|
|
|
+ if (!"1".equals(taskNode.getFindAgvFlag()) && !targetStorgeResourceId.equals(nextTaskNode.getTargetResourceId()) && robotHcwList.size() > 1){
|
|
|
+ targetStorge = hcwStorge;
|
|
|
+ msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + DemoLineConstant.YUNJIAN_TARGET_HCW_XBK_FLAG + nextTaskNode.getId(), targetxbk, 1, TimeUnit.DAYS);
|
|
|
+ }else{
|
|
|
+ //锁定目标库位
|
|
|
+ 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);
|
|
|
@@ -432,13 +443,6 @@ public class RobotNodeServiceImpl implements NodeOperationService {
|
|
|
dataMap.put("data", locationMap);
|
|
|
dataMap.put("method", "MoveRobotPosition");
|
|
|
dataMap.put("result", true);
|
|
|
-// dataMap.put("bizType", targetxbk);
|
|
|
- // 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);
|
|
|
}
|
|
|
@@ -478,6 +482,7 @@ public class RobotNodeServiceImpl implements NodeOperationService {
|
|
|
|
|
|
dataMap.put("toStorge", hcwStorge);
|
|
|
dataMap.put("result", true);
|
|
|
+
|
|
|
}
|
|
|
}else if (BizConstant.ROBOT_TYPE_NOCACHE.equals(zoneService.getRobotTypebyZone(zoneName))) {
|
|
|
TaskNode nextTaskNode = taskNodeService.getNextNTaskNode(taskNode, 1);
|
|
|
@@ -486,7 +491,7 @@ public class RobotNodeServiceImpl implements NodeOperationService {
|
|
|
if(CollectionUtil.isNotEmpty(flikustockInfos)){//
|
|
|
startStore = storgeMapper.selectById(flikustockInfos.get(0).getStorgeId());
|
|
|
}
|
|
|
- if(zZone.getName().equals("质量中心")){
|
|
|
+ if("质量中心".equals(zZone.getName())){
|
|
|
dataMap.put("method", "GetQualityCenter");
|
|
|
}else{
|
|
|
dataMap.put("method", "GetServoStacker");
|
|
|
@@ -556,15 +561,8 @@ public class RobotNodeServiceImpl implements NodeOperationService {
|
|
|
//目标是线边库
|
|
|
msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + DemoLineConstant.YUNJIAN_TARGET_XBK_FLAG + taskNode.getId(), targetxbk, 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 解决资源抢占时机器人是空闲状态但是实际上面有料不能操作的时候请求指令接口返回失败后进入死循环问题
|
|
|
|
|
|
+ dataMap.put("result", true);
|
|
|
}else{
|
|
|
dataMap.put("result", false);
|
|
|
}
|
|
|
@@ -579,51 +577,62 @@ public class RobotNodeServiceImpl implements NodeOperationService {
|
|
|
//执行到第几步
|
|
|
dataMap.put(taskNode.getId().toString()+"count",count);
|
|
|
if(BizConstant.ROBOT_TYPE_CACHE.equals(zoneService.getRobotTypebyZone(zoneName))){
|
|
|
- dataMap.put(YunjianConstant.YUNJIAN_ROBORT_CACHE_FLAG, "1");
|
|
|
- if(count==0) {
|
|
|
- Map locationMap = new HashMap();
|
|
|
- locationMap.put("location",targetStorge.getPointId());
|
|
|
- dataMap.put("data", locationMap);
|
|
|
-
|
|
|
-
|
|
|
- dataMap.put("method", "MoveRobotPosition");
|
|
|
- }else if(count == 1){//从缓存位拿出来
|
|
|
- dataMap.put("method", "GetFlexibleWire");
|
|
|
- Storge hcwStorge = (Storge)msgUtil.redis_get(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_HCW + taskNode.getId());
|
|
|
-
|
|
|
- Map locationMap = new HashMap();
|
|
|
- locationMap.put("location",hcwStorge.getPointId());
|
|
|
- dataMap.put("data", locationMap);
|
|
|
-
|
|
|
- dataMap.put("fromStorge", hcwStorge);
|
|
|
- Storge handStorge = (Storge)msgUtil.redis_get(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_JXS + taskNode.getId());
|
|
|
- dataMap.put("toStorge", handStorge);
|
|
|
- //出入库类型
|
|
|
- dataMap.put(DemoLineConstant.DEMOLINE_STOCK_TYPE,DemoLineConstant.DEMOLINE_STOCK_TYPE_ALL_CRK);
|
|
|
- }else if(count == 2){
|
|
|
- dataMap.put("method", "SendFlexibleWire");
|
|
|
- //出入库类型
|
|
|
- dataMap.put(DemoLineConstant.DEMOLINE_STOCK_TYPE,DemoLineConstant.DEMOLINE_STOCK_TYPE_ALL_CRK);
|
|
|
-
|
|
|
- Map locationMap = new HashMap();
|
|
|
- locationMap.put("location",targetStorge.getPointId());
|
|
|
- dataMap.put("data", locationMap);
|
|
|
-
|
|
|
- dataMap.put("toStorge", targetStorge);
|
|
|
|
|
|
- Storge handStorge = (Storge)msgUtil.redis_get(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_JXS + taskNode.getId());
|
|
|
- dataMap.put("fromStorge", handStorge);
|
|
|
- String targetxbk =(String)msgUtil.redis_get(DemoCacheKey.YUNJIAN_CAMP + "_" + DemoLineConstant.YUNJIAN_TARGET_XBK_FLAG + taskNode.getId());
|
|
|
- if("1".equals(targetxbk)){
|
|
|
- dataMap.put(YunjianConstant.YUNJIAN_XBKFLAG, YunjianConstant.YUNJIAN_XBKFLAG);
|
|
|
- //把计数去掉,从线边库开始重新计数
|
|
|
- dataMap.remove(taskNode.getId().toString()+"count");
|
|
|
+ // begin add by yejian on 20220819 for 将机器人上的缓存位利用历来:如果缓存位数量n-1 >= 1,则可以将工件不放到线边库,直接放在缓存位上暂存后轮训线边库逻辑
|
|
|
+ String targetHcwXbk =(String)msgUtil.redis_get(DemoCacheKey.YUNJIAN_CAMP + "_" + DemoLineConstant.YUNJIAN_TARGET_HCW_XBK_FLAG + taskNode.getId());
|
|
|
+ log.info("节点{}放逻辑判断{}",taskNode.getId(),targetHcwXbk);
|
|
|
+ if("1".equals(targetHcwXbk)){
|
|
|
+ log.info("节点{}执行暂存缓存为线边库逻辑",taskNode.getId());
|
|
|
+ dataMap.put(YunjianConstant.YUNJIAN_XBKFLAG, targetHcwXbk);
|
|
|
+ dataMap.put(YunjianConstant.YUNJIAN_HCW_XBKFLAG, targetHcwXbk);
|
|
|
+ }else{
|
|
|
+ dataMap.put(YunjianConstant.YUNJIAN_ROBORT_CACHE_FLAG, "1");
|
|
|
+ if(count==0) {
|
|
|
+ Map locationMap = new HashMap();
|
|
|
+ locationMap.put("location",targetStorge.getPointId());
|
|
|
+ dataMap.put("data", locationMap);
|
|
|
+
|
|
|
+
|
|
|
+ dataMap.put("method", "MoveRobotPosition");
|
|
|
+ }else if(count == 1){//从缓存位拿出来
|
|
|
+ dataMap.put("method", "GetFlexibleWire");
|
|
|
+ Storge hcwStorge = (Storge)msgUtil.redis_get(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_HCW + taskNode.getId());
|
|
|
+
|
|
|
+ Map locationMap = new HashMap();
|
|
|
+ locationMap.put("location",hcwStorge.getPointId());
|
|
|
+ dataMap.put("data", locationMap);
|
|
|
+
|
|
|
+ dataMap.put("fromStorge", hcwStorge);
|
|
|
+ Storge handStorge = (Storge)msgUtil.redis_get(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_JXS + taskNode.getId());
|
|
|
+ dataMap.put("toStorge", handStorge);
|
|
|
+ //出入库类型
|
|
|
+ dataMap.put(DemoLineConstant.DEMOLINE_STOCK_TYPE,DemoLineConstant.DEMOLINE_STOCK_TYPE_ALL_CRK);
|
|
|
+ }else if(count == 2){
|
|
|
+ dataMap.put("method", "SendFlexibleWire");
|
|
|
+ //出入库类型
|
|
|
+ dataMap.put(DemoLineConstant.DEMOLINE_STOCK_TYPE,DemoLineConstant.DEMOLINE_STOCK_TYPE_ALL_CRK);
|
|
|
+
|
|
|
+ Map locationMap = new HashMap();
|
|
|
+ locationMap.put("location",targetStorge.getPointId());
|
|
|
+ dataMap.put("data", locationMap);
|
|
|
+
|
|
|
+ dataMap.put("toStorge", targetStorge);
|
|
|
+
|
|
|
+ Storge handStorge = (Storge)msgUtil.redis_get(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_JXS + taskNode.getId());
|
|
|
+ dataMap.put("fromStorge", handStorge);
|
|
|
+ String targetxbk =(String)msgUtil.redis_get(DemoCacheKey.YUNJIAN_CAMP + "_" + DemoLineConstant.YUNJIAN_TARGET_XBK_FLAG + taskNode.getId());
|
|
|
+ if("1".equals(targetxbk)){
|
|
|
+ dataMap.put(YunjianConstant.YUNJIAN_XBKFLAG, YunjianConstant.YUNJIAN_XBKFLAG);
|
|
|
+ //把计数去掉,从线边库开始重新计数
|
|
|
+ dataMap.remove(taskNode.getId().toString()+"count");
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
+ // end add by yejian on 20220819 for 将机器人上的缓存位利用历来:如果缓存位数量n-1 >= 1,则可以将工件不放到线边库,直接放在缓存位上暂存后轮训线边库逻辑
|
|
|
}else if (BizConstant.ROBOT_TYPE_NOCACHE.equals(zoneService.getRobotTypebyZone(zoneName))) {
|
|
|
Storge currentStore = workpieceService.getWorkPieceStock(taskNode.getCompleteBatchNo(), false);
|
|
|
|
|
|
- if(zZone.getName().equals("质量中心")){
|
|
|
+ if("质量中心".equals(zZone.getName())){
|
|
|
dataMap.put("method", "SendQualityCenter");
|
|
|
}else{
|
|
|
dataMap.put("method", "SendServoStacker");
|
|
|
@@ -730,13 +739,15 @@ public class RobotNodeServiceImpl implements NodeOperationService {
|
|
|
taskNodeService.updateById(lastAgvTaskNode);
|
|
|
// log.info("节点{},更新相应节点接驳位信息完成",taskNode.getId());
|
|
|
}
|
|
|
-
|
|
|
+ returnMap.put("storeResourceId",targetResourceId);
|
|
|
returnMap.put("store",targetStorge);
|
|
|
returnMap.put("targetxbk","0");
|
|
|
|
|
|
}else{
|
|
|
//需要放到线边库
|
|
|
// begin add by yejian on 20220802 for 调度空托盘流转
|
|
|
+ Long tempAgvTaskStartResourceId = map.get("tempAgvTaskStartResourceId")== null?null:Long.valueOf(map.get("tempAgvTaskStartResourceId").toString());
|
|
|
+ Long tempAgvTaskEndResourceId = map.get("tempAgvTaskEndResourceId")== null?null:Long.valueOf(map.get("tempAgvTaskEndResourceId").toString());
|
|
|
String tempAgvTaskStartPoint = map.get("tempAgvTaskStartPoint") == null?null:(String)map.get("tempAgvTaskStartPoint");
|
|
|
String tempAgvTaskEndPoint = map.get("tempAgvTaskEndPoint") == null?null:(String)map.get("tempAgvTaskEndPoint");
|
|
|
Storge tempAgvTaskStartPointStorge = map.get("tempAgvTaskStartPointStorge") == null?null:(Storge)map.get("tempAgvTaskStartPointStorge");
|
|
|
@@ -755,8 +766,19 @@ public class RobotNodeServiceImpl implements NodeOperationService {
|
|
|
JSONObject agvParam = new JSONObject();
|
|
|
agvParam.putAll(agvData);
|
|
|
String zoneType = (null == msgUtil.redis_get(ParameterKey.PARAMETERS)? "": ((Map<String,String>)msgUtil.redis_get(ParameterKey.PARAMETERS)).get(ParameterKey.ZONE_TYPE).toString());
|
|
|
+
|
|
|
+ // 锁定预占资源
|
|
|
storgeService.lockStorge(tempAgvTaskStartPointStorge, null);
|
|
|
storgeService.lockStorge(tempAgvTaskEndPointStorge, null);
|
|
|
+
|
|
|
+ // 更新接驳位信息
|
|
|
+ taskNode.setTargetResourceId(tempAgvTaskEndResourceId);
|
|
|
+ lastAgvTaskNode.setResourceId(tempAgvTaskEndResourceId);
|
|
|
+ lastAgvTaskNode.setTargetResourceId(tempAgvTaskStartResourceId);
|
|
|
+ taskNodeService.updateById(taskNode);
|
|
|
+ taskNodeService.updateById(lastAgvTaskNode);
|
|
|
+ log.info("节点{}更新调度agv任务起点{},终点{}",taskNode.getId(),tempAgvTaskEndResourceId,tempAgvTaskStartResourceId);
|
|
|
+
|
|
|
if(zoneType.equals(ParameterKey.ZONE_SFX)){
|
|
|
agvData.put("transferType","agv");
|
|
|
R addAgvTask = externalApiService.processTransferJob(agvData);
|
|
|
@@ -768,46 +790,12 @@ public class RobotNodeServiceImpl implements NodeOperationService {
|
|
|
|
|
|
xbkFlag = "1";
|
|
|
}
|
|
|
-
|
|
|
// end modify by yejian on 20220513 for agv动态查找满足抽检一个工序需多次调度agv问题
|
|
|
-// TaskNode lastOperationTaskNode = taskNodeService.getOne(Wraps.<TaskNode>lbQ().eq(TaskNode::getTaskId,taskNode.getTaskId()).orderByDesc(TaskNode::getCompleteBatchSort).last("limit 1"));
|
|
|
-
|
|
|
-// //获取接驳位。
|
|
|
-// Map map = storgeService.getPlateStorgeByNo(zZone);
|
|
|
-// targetStorge = map.get("storge") ==null?null:(Storge)map.get("storge");
|
|
|
-// String targetResourceId = map.get("resourceId") ==null?null:(String)map.get("resourceId");
|
|
|
-// //对面产线接驳位不为空
|
|
|
-// TaskNode nextOperationFirstTaskNode = taskNodeService.getNextNTaskNode(lastOperationTaskNode,1);
|
|
|
-// ZZoneProductionresource zoneProductionresource = zZoneProductionresourceMapper.selectOne(Wraps.<ZZoneProductionresource>lbQ().eq(ZZoneProductionresource::getResourceId,nextOperationFirstTaskNode.getResourceId()));
|
|
|
-// //获取产线ID
|
|
|
-// zoneId = zoneProductionresource.getZoneId();
|
|
|
-// zZone = zoneService.getById(zoneId);
|
|
|
-//
|
|
|
-// String[] jbwArr = DictionaryKey.YJ_ZONE_JBW.get(zZone.getName()).split(",");
|
|
|
-// List<ProductionresourcePosition> jbwBList = productionresourcePositionService.getFreeProductionresourcePositionByNos(jbwArr);
|
|
|
-//
|
|
|
-// if(targetStorge!=null&&CollectionUtil.isNotEmpty(jbwBList)){
|
|
|
-// ProductionresourcePosition position = jbwBList.get(0);
|
|
|
-// agvEndStationStorge =storgeService.getById(position.getStorgeId());
|
|
|
-//
|
|
|
-// returnMap.put("store",targetStorge);
|
|
|
-// returnMap.put("targetxbk","0");
|
|
|
-//
|
|
|
-// //更新到targetresourceid
|
|
|
-//// TaskNode nextTaskNode = taskNodeService.getNextNTaskNode(taskNode,1);
|
|
|
-// taskNode.setTargetResourceId(Long.parseLong(targetResourceId));
|
|
|
-// lastOperationTaskNode.setTargetResourceId(position.getResourceId());
|
|
|
-// lastOperationTaskNode.setResourceId(taskNode.getTargetResourceId());
|
|
|
-// taskNodeService.updateById(taskNode);
|
|
|
-// taskNodeService.updateById(lastOperationTaskNode);
|
|
|
-// }else{//需要放到线边库
|
|
|
-// xbkFlag = "1";
|
|
|
-// }
|
|
|
}else {
|
|
|
// begin modify by yejian on 20220515 for 下料库位问题修改
|
|
|
TaskNode beforTaskNode = taskNodeService.getNextNTaskNode(taskNode,-1);
|
|
|
TaskNode baitingTaskNode = taskNodeService.getNextNTaskNode(beforTaskNode,-1);
|
|
|
- if(bomProcedureType.equals("下料") && "04".equals(baitingTaskNode.getInterfaceType())){
|
|
|
+ if("下料".equals(bomProcedureType) && "04".equals(baitingTaskNode.getInterfaceType())){
|
|
|
// 下料特殊处理,动态查找可用立库位子存放下料后的子盘夹具
|
|
|
Long storgeId = getLikuStockInList();
|
|
|
targetStorge = storgeService.getById(storgeId);
|
|
|
@@ -819,6 +807,7 @@ public class RobotNodeServiceImpl implements NodeOperationService {
|
|
|
targetList = productionresourcePositionService.getFreeProductionresourcePositionByIds(new String[] {resourceId.toString()});
|
|
|
if(CollectionUtil.isNotEmpty(targetList)){
|
|
|
targetStorge = storgeService.getById(targetList.get(0).getStorgeId());
|
|
|
+ returnMap.put("storeResourceId",targetList.get(0).getResourceId());
|
|
|
returnMap.put("store",targetStorge);
|
|
|
returnMap.put("targetxbk","0");
|
|
|
|
|
|
@@ -851,6 +840,7 @@ public class RobotNodeServiceImpl implements NodeOperationService {
|
|
|
if(CollectionUtil.isNotEmpty(xbkList)){
|
|
|
ProductionresourcePosition position = xbkList.get(0);
|
|
|
targetStorge = storgeService.getById(position.getStorgeId());
|
|
|
+ returnMap.put("storeResourceId",position.getResourceId());
|
|
|
returnMap.put("store",targetStorge);
|
|
|
returnMap.put("targetxbk","1");
|
|
|
}
|