Преглед изворни кода

fix: 优化回调报错问题

wang.sq@aliyun.com пре 1 месец
родитељ
комит
c4aae52c80

+ 1 - 1
imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/operationManagementCenter/service/TaskNodeService.java

@@ -103,7 +103,7 @@ public interface TaskNodeService extends SuperService<TaskNode> {
 
     String taskNodeStockTran(TaskNode bean);
 
-    R taskNodeCallback(TaskNodeCallBackDTO bean) throws InterruptedException;
+    R taskNodeCallback(TaskNodeCallBackDTO bean) throws Exception;
 
     /**
      * 获取后N节点

+ 154 - 132
imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/operationManagementCenter/service/impl/TaskNodeServiceImpl.java

@@ -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();
     }
 

+ 1 - 0
imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/util/MsgUtil.java

@@ -714,6 +714,7 @@ public class MsgUtil implements ApplicationContextAware {
         try{
             //todo 与ccs联调需要释放  $需要换地址$
             //returnData = restTemplate.postForObject(instructionUrl, formEntity, String.class);
+            returnData = "1";
         }
         catch(BizException ex){
             logger.error("接口{}数据远程调用失败", instructionUrl);

+ 1 - 1
imcs-admin-boot/imcs-business-controller/src/main/java/com/github/zuihou/business/controller/operationManagementCenter/TaskNodeController.java

@@ -156,7 +156,7 @@ public class TaskNodeController extends SuperController<TaskNodeService, Long, T
 
     @ApiOperation(value = "任务回调", notes = "任务回调")
     @PostMapping("/taskNodeCallback")
-    public R taskNodeCallback(@RequestBody TaskNodeCallBackDTO bean) throws InterruptedException {
+    public R taskNodeCallback(@RequestBody TaskNodeCallBackDTO bean) throws Exception {
         return baseService.taskNodeCallback(bean);
     }