|
@@ -1538,177 +1538,199 @@ public class TaskNodeServiceImpl extends SuperServiceImpl<TaskNodeMapper, TaskNo
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
- public R taskNodeCallback(TaskNodeCallBackDTO bean) throws InterruptedException {
|
|
|
- log.info("[CCS指令回调]回调参数======================" + JSONObject.toJSONString(bean));
|
|
|
- //取出参数
|
|
|
- String code = bean.getCode();
|
|
|
- String msg = bean.getMsg() != null ? bean.getMsg() : "指令操作失败";
|
|
|
-
|
|
|
- BaseContextHandler.setTenant("0000");
|
|
|
- String taskId = bean.getTaskId() == null ? "" : bean.getTaskId().toString();
|
|
|
- String taskNodeId = bean.getTaskNodeId() == null ? "" : bean.getTaskNodeId().toString();
|
|
|
- if(taskId.equals("1") || taskNodeId.equals("1")){
|
|
|
- //测试数据默认通过处理
|
|
|
- return R.success("");
|
|
|
- }
|
|
|
+ public R taskNodeCallback(TaskNodeCallBackDTO bean) throws Exception {
|
|
|
+ // redis是否重复回调判断
|
|
|
+ String repeatKey = null;
|
|
|
+ // 节点日志记录
|
|
|
+ AAutoNodeLog lg = null;
|
|
|
+ // 当前任务节点
|
|
|
+ TaskNode taskNode = null;
|
|
|
|
|
|
- //验证是否重复回调
|
|
|
- String repeatKey = taskNodeId + taskId;
|
|
|
+ try {
|
|
|
+ log.info("[CCS指令回调]回调参数======================" + JSONObject.toJSONString(bean));
|
|
|
+ //取出参数
|
|
|
+ String code = bean.getCode();
|
|
|
+ String msg = bean.getMsg() != null ? bean.getMsg() : "指令操作失败";
|
|
|
+
|
|
|
+ BaseContextHandler.setTenant("0000");
|
|
|
+ String taskId = bean.getTaskId() == null ? "" : bean.getTaskId().toString();
|
|
|
+ String taskNodeId = bean.getTaskNodeId() == null ? "" : bean.getTaskNodeId().toString();
|
|
|
+ if(taskId.equals("1") || taskNodeId.equals("1")){
|
|
|
+ //测试数据默认通过处理
|
|
|
+ return R.success("");
|
|
|
+ }
|
|
|
|
|
|
- String cacheUid = msgUtil.redis_get(repeatKey) == null ? "" : msgUtil.redis_get(repeatKey).toString();
|
|
|
- if (StringUtil.isNotEmpty(cacheUid)) {//排除掉重复回调
|
|
|
- log.warn("回调重复了======================" + cacheUid);
|
|
|
- //回调重复去除
|
|
|
- msgUtil.redis_del(cacheUid);
|
|
|
- return R.fail(-5,"节点"+bean.getTaskNodeId()+"已有回调");
|
|
|
- }
|
|
|
+ //验证是否重复回调
|
|
|
+ repeatKey = taskNodeId + taskId;
|
|
|
|
|
|
- // begin add by yejian on 20220503 for yj on 如果排产中先等待排产完成后继续执行(防止重复发送回调)
|
|
|
- while (null != msgUtil.redis_get(YunjianConstant.YUNJIAN_SHEDULE_FLAG)) {
|
|
|
- try {
|
|
|
- Thread.sleep(3000);
|
|
|
- } catch (InterruptedException e) {
|
|
|
- e.printStackTrace();
|
|
|
+ String cacheUid = msgUtil.redis_get(repeatKey) == null ? "" : msgUtil.redis_get(repeatKey).toString();
|
|
|
+ if (StringUtil.isNotEmpty(cacheUid)) {//排除掉重复回调
|
|
|
+ log.warn("回调重复了======================" + cacheUid);
|
|
|
+ //回调重复去除
|
|
|
+ msgUtil.redis_del(cacheUid);
|
|
|
+ return R.fail(-5,"节点"+bean.getTaskNodeId()+"已有回调");
|
|
|
}
|
|
|
- }
|
|
|
- // end add by yejian on 20220503 for yj on 如果排产中先等待排产完成后继续执行
|
|
|
|
|
|
- //把当前id存放入缓存,为后续防止重复回调
|
|
|
- msgUtil.redis_set(String.valueOf(repeatKey), String.valueOf(bean.getTaskNodeId()), 1, TimeUnit.HOURS);
|
|
|
+ // begin add by yejian on 20220503 for yj on 如果排产中先等待排产完成后继续执行(防止重复发送回调)
|
|
|
+ while (null != msgUtil.redis_get(YunjianConstant.YUNJIAN_SHEDULE_FLAG)) {
|
|
|
+ try {
|
|
|
+ Thread.sleep(3000);
|
|
|
+ } catch (InterruptedException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // end add by yejian on 20220503 for yj on 如果排产中先等待排产完成后继续执行
|
|
|
|
|
|
+ //把当前id存放入缓存,为后续防止重复回调
|
|
|
+ msgUtil.redis_set(String.valueOf(repeatKey), String.valueOf(bean.getTaskNodeId()), 1, TimeUnit.HOURS);
|
|
|
|
|
|
- //接口不让传多余参数,只能从缓存传
|
|
|
- String jsonParam = msgUtil.redis_get(YunjianConstant.YUNJIAN_CALLBACK_PARAM + "_" + taskNodeId) == null ? ""
|
|
|
- : msgUtil.redis_get(YunjianConstant.YUNJIAN_CALLBACK_PARAM + "_" + taskNodeId).toString();
|
|
|
|
|
|
+ //接口不让传多余参数,只能从缓存传
|
|
|
+ String jsonParam = msgUtil.redis_get(YunjianConstant.YUNJIAN_CALLBACK_PARAM + "_" + taskNodeId) == null ? ""
|
|
|
+ : msgUtil.redis_get(YunjianConstant.YUNJIAN_CALLBACK_PARAM + "_" + taskNodeId).toString();
|
|
|
|
|
|
- if(StringUtils.isEmpty(jsonParam)){
|
|
|
- return R.fail("节点{}确认信息已丢失, 需要重发确认请求", taskNodeId);
|
|
|
- }
|
|
|
- JSONObject callBackJsonParam = JSONObject.parseObject(jsonParam);
|
|
|
|
|
|
- //String taskType = callBackJsonParam.get("taskType").toString();
|
|
|
+ if(StringUtils.isEmpty(jsonParam)){
|
|
|
+ return R.fail("节点{}确认信息已丢失, 需要重发确认请求", taskNodeId);
|
|
|
+ }
|
|
|
+ JSONObject callBackJsonParam = JSONObject.parseObject(jsonParam);
|
|
|
|
|
|
+ //String taskType = callBackJsonParam.get("taskType").toString();
|
|
|
|
|
|
- //更换手抓
|
|
|
- /*if(StringUtil.isNotEmpty(stockType) && DemoLineConstant.TASK_TYPE_CHANGE.equals(stockType)){
|
|
|
- if (StringUtils.isNotEmpty(code) && "1".equals(code)) {
|
|
|
- String changeTargetHand = callBackJsonParam.getOrDefault("CHANGE_TARGET_HAND" + "_" + taskNodeId,"").toString();
|
|
|
|
|
|
- if(StringUtil.isEmpty(changeTargetHand)){
|
|
|
- log.warn("【更换手抓】目的位置不存在");
|
|
|
- return R.fail(-5,"【更换手抓】目的位置不存在");
|
|
|
- }
|
|
|
- Productionresource productionresource = productionresourceBizMapper.selectOne(new QueryWrap<Productionresource>().lambda().eq(Productionresource::getCode, "FMS_JQR"));
|
|
|
- if(changeTargetHand.equals(productionresource.getHandType())){
|
|
|
- return R.fail(-5,"【更换手抓】当前手抓类型和目标手抓类型一致");
|
|
|
+ //更换手抓
|
|
|
+ /*if(StringUtil.isNotEmpty(stockType) && DemoLineConstant.TASK_TYPE_CHANGE.equals(stockType)){
|
|
|
+ if (StringUtils.isNotEmpty(code) && "1".equals(code)) {
|
|
|
+ String changeTargetHand = callBackJsonParam.getOrDefault("CHANGE_TARGET_HAND" + "_" + taskNodeId,"").toString();
|
|
|
+
|
|
|
+ if(StringUtil.isEmpty(changeTargetHand)){
|
|
|
+ log.warn("【更换手抓】目的位置不存在");
|
|
|
+ return R.fail(-5,"【更换手抓】目的位置不存在");
|
|
|
+ }
|
|
|
+ Productionresource productionresource = productionresourceBizMapper.selectOne(new QueryWrap<Productionresource>().lambda().eq(Productionresource::getCode, "FMS_JQR"));
|
|
|
+ if(changeTargetHand.equals(productionresource.getHandType())){
|
|
|
+ return R.fail(-5,"【更换手抓】当前手抓类型和目标手抓类型一致");
|
|
|
+ }else{
|
|
|
+ log.warn("【更换手抓】成功");
|
|
|
+ //更新机器人手抓类型
|
|
|
+ productionresource.setHandType(changeTargetHand);
|
|
|
+ productionresourceBizMapper.updateById(productionresource);
|
|
|
+
|
|
|
+ //移除缓存
|
|
|
+ msgUtil.redis_del("CHANGE_HAND_OP");
|
|
|
+ msgUtil.redis_del("CHANGE_TARGET_HAND");
|
|
|
+ msgUtil.redis_del(repeatKey);
|
|
|
+ return R.success();
|
|
|
+ }
|
|
|
}else{
|
|
|
- log.warn("【更换手抓】成功");
|
|
|
- //更新机器人手抓类型
|
|
|
- productionresource.setHandType(changeTargetHand);
|
|
|
- productionresourceBizMapper.updateById(productionresource);
|
|
|
-
|
|
|
- //移除缓存
|
|
|
- msgUtil.redis_del("CHANGE_HAND_OP");
|
|
|
- msgUtil.redis_del("CHANGE_TARGET_HAND");
|
|
|
msgUtil.redis_del(repeatKey);
|
|
|
- return R.success();
|
|
|
+ log.warn("更换手抓失败");
|
|
|
+ return R.fail(-5,"更换手抓失败");
|
|
|
}
|
|
|
- }else{
|
|
|
- msgUtil.redis_del(repeatKey);
|
|
|
- log.warn("更换手抓失败");
|
|
|
- return R.fail(-5,"更换手抓失败");
|
|
|
- }
|
|
|
|
|
|
- }
|
|
|
-*/
|
|
|
- TTask task = taskService.getById(taskId);
|
|
|
- Object taskInfoObject = msgUtil.redis_get(taskId);
|
|
|
+ }
|
|
|
+ */
|
|
|
+ TTask task = taskService.getById(taskId);
|
|
|
+ Object taskInfoObject = msgUtil.redis_get(taskId);
|
|
|
|
|
|
- if (null == task && null == taskInfoObject) {
|
|
|
- return R.fail(-5, "任务不存在");
|
|
|
- }
|
|
|
+ if (null == task && null == taskInfoObject) {
|
|
|
+ return R.fail(-5, "任务不存在");
|
|
|
+ }
|
|
|
|
|
|
- //清除节点锁定
|
|
|
- Object obj = msgUtil.redis_get(CacheKey.TASK_NODE_LOCK + "_" + taskNodeId);
|
|
|
- if (!Objects.isNull(obj)) msgUtil.redis_del(CacheKey.TASK_NODE_LOCK + "_" + taskNodeId);
|
|
|
+ //清除节点锁定
|
|
|
+ Object obj = msgUtil.redis_get(CacheKey.TASK_NODE_LOCK + "_" + taskNodeId);
|
|
|
+ if (!Objects.isNull(obj)) msgUtil.redis_del(CacheKey.TASK_NODE_LOCK + "_" + taskNodeId);
|
|
|
|
|
|
- //清除锁定上下料站
|
|
|
- Object obj2 = msgUtil.redis_get(CacheKey.TASK_DEVICE_LOCK + "_" + task.getResourceId());
|
|
|
- if(!Objects.isNull(obj2)){
|
|
|
- String taskCacheId = obj2.toString();
|
|
|
- //判断锁定任务是否一致
|
|
|
- if(taskCacheId.equals(taskId)){
|
|
|
- // 缓存上下料站已被伺服舵机锁定则清空缓存
|
|
|
- List list = productionresourcePositionService.getFreeProductionresourcePositionByIds(new String[]{task.getResourceId().toString()});
|
|
|
- if(list.size()==0){
|
|
|
- //上下料站或立库库位取完成以后释放锁定
|
|
|
- ProductionresourcePosition productionresourcePosition = productionresourcePositionService.getOne(new LambdaQueryWrapper<ProductionresourcePosition>().eq(ProductionresourcePosition::getResourceId, task.getResourceId()).last("limit 1"));
|
|
|
- Storge storge = storgeService.getById(productionresourcePosition.getStorgeId());
|
|
|
- storgeService.unlockStorge(storge);
|
|
|
+ //清除锁定上下料站
|
|
|
+ Object obj2 = msgUtil.redis_get(CacheKey.TASK_DEVICE_LOCK + "_" + task.getResourceId());
|
|
|
+ if(!Objects.isNull(obj2)){
|
|
|
+ String taskCacheId = obj2.toString();
|
|
|
+ //判断锁定任务是否一致
|
|
|
+ if(taskCacheId.equals(taskId)){
|
|
|
+ // 缓存上下料站已被伺服舵机锁定则清空缓存
|
|
|
+ List list = productionresourcePositionService.getFreeProductionresourcePositionByIds(new String[]{task.getResourceId().toString()});
|
|
|
+ if(list.size()==0){
|
|
|
+ //上下料站或立库库位取完成以后释放锁定
|
|
|
+ ProductionresourcePosition productionresourcePosition = productionresourcePositionService.getOne(new LambdaQueryWrapper<ProductionresourcePosition>().eq(ProductionresourcePosition::getResourceId, task.getResourceId()).last("limit 1"));
|
|
|
+ Storge storge = storgeService.getById(productionresourcePosition.getStorgeId());
|
|
|
+ storgeService.unlockStorge(storge);
|
|
|
|
|
|
- //设备点位已锁定 删除上下料站缓存锁定信息
|
|
|
- msgUtil.redis_del(YunjianConstant.YUNJIAN_FANMIAN + taskId);
|
|
|
- msgUtil.redis_del(CacheKey.TASK_DEVICE_LOCK + "_" + task.getResourceId());
|
|
|
+ //设备点位已锁定 删除上下料站缓存锁定信息
|
|
|
+ msgUtil.redis_del(YunjianConstant.YUNJIAN_FANMIAN + taskId);
|
|
|
+ msgUtil.redis_del(CacheKey.TASK_DEVICE_LOCK + "_" + task.getResourceId());
|
|
|
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- //把三坐标检测结果追加进去
|
|
|
- if (StringUtil.isNotEmpty(bean.getStationId())) {
|
|
|
- callBackJsonParam.put("stationId", bean.getStationId());
|
|
|
- }
|
|
|
- callBackJsonParam.put("content",bean.getContent());
|
|
|
- jsonParam = callBackJsonParam.toJSONString();
|
|
|
+ //把三坐标检测结果追加进去
|
|
|
+ if (StringUtil.isNotEmpty(bean.getStationId())) {
|
|
|
+ callBackJsonParam.put("stationId", bean.getStationId());
|
|
|
+ }
|
|
|
+ callBackJsonParam.put("content",bean.getContent());
|
|
|
+ jsonParam = callBackJsonParam.toJSONString();
|
|
|
+
|
|
|
|
|
|
+ if (null != taskInfoObject) {
|
|
|
+ String taskInfos = taskInfoObject.toString();
|
|
|
|
|
|
- if (null != taskInfoObject) {
|
|
|
- String taskInfos = taskInfoObject.toString();
|
|
|
+ JSONObject taskInfosObject = JSONObject.parseObject(taskInfos);
|
|
|
+ ManualInfo manualInfo = JSONObject.parseObject(taskInfosObject.getString("taskInfo"), ManualInfo.class);
|
|
|
+ String handModeFlag = bean.getHandModeFlag();
|
|
|
+ if (null != manualInfo && "1".equals(manualInfo.getHandModeFlag())) {//手动模式是特殊处理
|
|
|
+ return handModeStock(bean);
|
|
|
+ }
|
|
|
|
|
|
- JSONObject taskInfosObject = JSONObject.parseObject(taskInfos);
|
|
|
- ManualInfo manualInfo = JSONObject.parseObject(taskInfosObject.getString("taskInfo"), ManualInfo.class);
|
|
|
- String handModeFlag = bean.getHandModeFlag();
|
|
|
- if (null != manualInfo && "1".equals(manualInfo.getHandModeFlag())) {//手动模式是特殊处理
|
|
|
- return handModeStock(bean);
|
|
|
}
|
|
|
|
|
|
- }
|
|
|
+ List<TaskNode> taskNodeList = baseMapper.selectList(Wraps.<TaskNode>lbQ().eq(TaskNode::getCompleteBatchNo,
|
|
|
+ task.getCompleteBatchNo()).orderByAsc(TaskNode::getCompleteBatchSort));
|
|
|
|
|
|
- List<TaskNode> taskNodeList = baseMapper.selectList(Wraps.<TaskNode>lbQ().eq(TaskNode::getCompleteBatchNo,
|
|
|
- task.getCompleteBatchNo()).orderByAsc(TaskNode::getCompleteBatchSort));
|
|
|
+ Map<Long, TaskNode> taskNodeMap = taskNodeList.stream().collect(Collectors.toMap(TaskNode::getId, t -> t));
|
|
|
|
|
|
- Map<Long, TaskNode> taskNodeMap = taskNodeList.stream().collect(Collectors.toMap(TaskNode::getId, t -> t));
|
|
|
+ //当前正在执行的自动化程序
|
|
|
+ taskNode = taskNodeMap.get(Long.parseLong(taskNodeId));
|
|
|
|
|
|
- //当前正在执行的自动化程序
|
|
|
- TaskNode taskNode = taskNodeMap.get(Long.parseLong(taskNodeId));
|
|
|
+ if ("3".equals(taskNode.getExeStatus())) {
|
|
|
+ return R.success("任务{}已经完成,无需再次回调", taskNodeId);
|
|
|
+ }
|
|
|
|
|
|
- if ("3".equals(taskNode.getExeStatus())) {
|
|
|
- return R.success("任务{}已经完成,无需再次回调", taskNodeId);
|
|
|
- }
|
|
|
+ List<AAutoNodeLog> autoNodeLogList =
|
|
|
+ autoNodeLogMapper.selectList(Wraps.<AAutoNodeLog>lbQ().eq(AAutoNodeLog::getTaskId, taskId).eq(AAutoNodeLog::getTaskNodeId,
|
|
|
+ taskNode.getId()));
|
|
|
+ lg = autoNodeLogList.size()>0 && autoNodeLogList.size()<4 ? autoNodeLogList.get(autoNodeLogList.size()-1):null;
|
|
|
+ if(null == lg){
|
|
|
+ return R.fail("指令和数据一致性不正确");
|
|
|
+ }
|
|
|
+ lg.setSendStatus("2");
|
|
|
+ lg.setExeResult("1");
|
|
|
|
|
|
- List<AAutoNodeLog> autoNodeLogList =
|
|
|
- autoNodeLogMapper.selectList(Wraps.<AAutoNodeLog>lbQ().eq(AAutoNodeLog::getTaskId, taskId).eq(AAutoNodeLog::getTaskNodeId,
|
|
|
- taskNode.getId()));
|
|
|
- AAutoNodeLog lg = autoNodeLogList.size()>0 && autoNodeLogList.size()<4 ? autoNodeLogList.get(autoNodeLogList.size()-1):null;
|
|
|
- if(null == lg){
|
|
|
- return R.fail("指令和数据一致性不正确");
|
|
|
- }
|
|
|
- lg.setSendStatus("2");
|
|
|
- lg.setExeResult("1");
|
|
|
+ String bizCallBackData = jsonParam;
|
|
|
|
|
|
- String bizCallBackData = jsonParam;
|
|
|
+ if (StringUtils.isNotEmpty(code) && "1".equals(code)) {
|
|
|
+ taskNodeCallbackBiz(taskNode, task, taskNodeList, lg, bizCallBackData);
|
|
|
+ msgUtil.redis_del(CacheKey.TASK_CURRENT_NODE_CONDITION + "_" + taskNode.getId());
|
|
|
+ msgUtil.redis_del(CacheKey.TASK_CURRENT_NODE_PARAMS + "_" + taskNode.getId());
|
|
|
+ } else {
|
|
|
+ //插入执行日志
|
|
|
+ lg.setStatus("0").setExeResult("0").setManual("1").setFeedback(msg);
|
|
|
+ autoNodeLogMapper.updateAllById(lg);
|
|
|
+ }
|
|
|
+ msgUtil.redis_del(repeatKey);
|
|
|
|
|
|
- if (StringUtils.isNotEmpty(code) && "1".equals(code)) {
|
|
|
- taskNodeCallbackBiz(taskNode, task, taskNodeList, lg, bizCallBackData);
|
|
|
- msgUtil.redis_del(CacheKey.TASK_CURRENT_NODE_CONDITION + "_" + taskNode.getId());
|
|
|
- msgUtil.redis_del(CacheKey.TASK_CURRENT_NODE_PARAMS + "_" + taskNode.getId());
|
|
|
- } else {
|
|
|
- //插入执行日志
|
|
|
- lg.setStatus("0").setExeResult("0").setManual("1").setFeedback(msg);
|
|
|
+ }catch (Exception e){
|
|
|
+ // 删除重复调用,日志修改位异常状态
|
|
|
+ msgUtil.redis_del(repeatKey);
|
|
|
+ lg.setExeStatus("2");
|
|
|
+ lg.setExeResult("0");
|
|
|
+ lg.setFeedback("回调时出错"+ e.getMessage());
|
|
|
autoNodeLogMapper.updateAllById(lg);
|
|
|
+
|
|
|
+ taskNode.setExeStatus("2").setExeResult("0").setEndTime(new Date());
|
|
|
+ updateAllById(taskNode);
|
|
|
+
|
|
|
+ throw new Exception(e);
|
|
|
}
|
|
|
- msgUtil.redis_del(repeatKey);
|
|
|
return R.success();
|
|
|
}
|
|
|
|