瀏覽代碼

1,资源抢占锁资源范围扩大
2.接收小时多一次判断消息是否已经处理完成了

yejian 2 年之前
父節點
當前提交
b94579dcaf

+ 89 - 81
imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/mq/TaskWorkNode.java

@@ -158,96 +158,103 @@ public class TaskWorkNode {
     private static ReentrantLock lock = new ReentrantLock();
 
     public void updateTaskStatusJob(String data, String consumerQueue) throws InterruptedException {
+        String returnData = "";
+        boolean specialCallBackMyselfFlag = false;
+        Map conMap = new HashMap();
+        boolean lockFlag = false;
+        TaskNode taskNode = null;
+        TTask tTask = null;
+        AAutoNodeLog log = null;
+
+        BaseContextHandler.setTenant("0000");
         JSONObject jsonObject = JSONObject.parseObject(data);
         System.out.println("返回请求数据: " + data);
         String taskNodeId = jsonObject.getString("taskNodeId");
-        //业务类型-1、是普通的节点类型,2-是线边库轮询
-        String bizType = jsonObject.getString("bizType");
-        String handMode = jsonObject.getString("handMode");
-        //多产品搬运类型
-        String carryType = jsonObject.getString("carryType");
+        taskNode = taskNodeService.getById(taskNodeId);
+        tTask = taskMapper.selectById(taskNode.getTaskId());
+        //初始化业务日志
+        log = getBusinessLog(tTask, taskNode);
 
-        BaseContextHandler.setTenant("0000");
-        String queueName = "device.queue."+ BizConstant.MQ_GLOBAL_EXCEPTION;
-
-        if (consumerQueue.equals(queueName)) {
-            AAutoNodeLog log = AAutoNodeLog.builder().build();
-            StringBuilder buffer = new StringBuilder();
-            //处理产线存储
-            String lineName = jsonObject.getString("Line");
-            ZZone line = zoneService.getOne(new LbqWrapper<ZZone>().like(ZZone::getAbbreviate, lineName.substring(0, lineName.length()-1)));
-            buffer.append(lineName).append("-设备(").append(jsonObject.getString("Name")+")").append(jsonObject.getString("Status"));
-            log.setExeResult("0").setManual("1").setFeedback("全局异常:"+ buffer.toString()).setStartTime(new Date()).setExecuteTime(new Date()).setZoneId(line.getId());
-
-            LbqWrapper<AAutoNodeLog> lbqWrapper = new LbqWrapper<AAutoNodeLog>();
-            lbqWrapper.eq(AAutoNodeLog::getZoneId, line.getId()).eq(AAutoNodeLog::getExeResult, log.getExeResult()).eq(AAutoNodeLog::getManual, log.getManual()).eq(AAutoNodeLog::getStatus, 0).eq(AAutoNodeLog::getFeedback, log.getFeedback());
-            //判断全局异常是否已存在
-            AAutoNodeLog exist = autoNodeLogService.getOne(lbqWrapper);
-            if(null == exist){
-                autoNodeLogService.save(log);
-            }else{
-                //更新执行时间
-                exist.setExecuteTime(new Date());
-                autoNodeLogService.updateAllById(exist);
-            }
-            //throw new RuntimeException("全局通知异常");
-            return;
-        }
-        logger.info("=======================" + taskNodeId);
+        try {
+            lockFlag = lock.tryLock();
+            if(lockFlag){
+                logger.info("节点{}获取到了执行锁",taskNode.getId());
+                TaskNode hisTask = taskNodeMapper.selectById(taskNodeId);
+                if("3".equals(hisTask.getExeResult())){
+                    logger.info("节点{}已经执行完成,重复推送丢弃",taskNodeId);
+                }
 
-        TaskNode taskNode = taskNodeService.getById(taskNodeId);
-//
-        if (taskNode == null || taskNode.getTaskId() == null) {
-            //模拟处理数据
-            AAutoNodeLog log = AAutoNodeLog.builder().build();
-            log.setExeResult("0").setManual("0").setFeedback("当前任务节点为空");
-            autoNodeLogService.save(log);
-            throw new RuntimeException("节点参数异常");
-        }
-        TTask tTask = taskMapper.selectById(taskNode.getTaskId());
-        if (tTask == null || tTask.getStatus() == "3") {
-            AAutoNodeLog log = AAutoNodeLog.builder().build();
-            log.setTaskNodeId(taskNode.getId()).setExeResult("0").setManual("0").setFeedback("当前任务为空");
-            autoNodeLogService.save(log);
-            throw new RuntimeException("节点参数异常");
-        }
-//        //获取配置序数据
-        //任务初始化判断
-        if ("1".equals(tTask.getStatus())) {
-            //下发的数据才更新状态
-            tTask.setStatus("2").setStartTime(new Date());
-            taskMapper.updateById(tTask);
-            planMapper.updateproduceStatusBegin();
-            orderMapper.updateproduceStatusBegin();
-
-            msgUtil.redis_set(CacheKey.PRESOURCE_CURRENT_TASK + "_" + tTask.getResourceId(), tTask.getId());
-            msgUtil.redis_set(CacheKey.PRESOURCE_CURRENT_TASK_OBJECT + "_" + tTask.getResourceId(), tTask);
-        }
-        //获取配置节点
-//        String autoProgramUrl = getInterfaceUrl(taskNode);
+                //业务类型-1、是普通的节点类型,2-是线边库轮询
+                String bizType = jsonObject.getString("bizType");
+                String handMode = jsonObject.getString("handMode");
+                //多产品搬运类型
+                String carryType = jsonObject.getString("carryType");
+
+                String queueName = "device.queue."+ BizConstant.MQ_GLOBAL_EXCEPTION;
+
+                if (consumerQueue.equals(queueName)) {
+                    StringBuilder buffer = new StringBuilder();
+                    //处理产线存储
+                    String lineName = jsonObject.getString("Line");
+                    ZZone line = zoneService.getOne(new LbqWrapper<ZZone>().like(ZZone::getAbbreviate, lineName.substring(0, lineName.length()-1)));
+                    buffer.append(lineName).append("-设备(").append(jsonObject.getString("Name")+")").append(jsonObject.getString("Status"));
+                    log.setExeResult("0").setManual("1").setFeedback("全局异常:"+ buffer.toString()).setStartTime(new Date()).setExecuteTime(new Date()).setZoneId(line.getId());
+
+                    LbqWrapper<AAutoNodeLog> lbqWrapper = new LbqWrapper<AAutoNodeLog>();
+                    lbqWrapper.eq(AAutoNodeLog::getZoneId, line.getId()).eq(AAutoNodeLog::getExeResult, log.getExeResult()).eq(AAutoNodeLog::getManual, log.getManual()).eq(AAutoNodeLog::getStatus, 0).eq(AAutoNodeLog::getFeedback, log.getFeedback());
+                    //判断全局异常是否已存在
+                    AAutoNodeLog exist = autoNodeLogService.getOne(lbqWrapper);
+                    if(null == exist){
+                        autoNodeLogService.save(log);
+                    }else{
+                        //更新执行时间
+                        exist.setExecuteTime(new Date());
+                        autoNodeLogService.updateAllById(exist);
+                    }
+                    //throw new RuntimeException("全局通知异常");
+                    return;
+                }
+                logger.info("=======================" + taskNodeId);
+
+        //
+                if (taskNode == null || taskNode.getTaskId() == null) {
+                    //模拟处理数据
+                    log.setExeResult("0").setManual("0").setFeedback("当前任务节点为空");
+                    autoNodeLogService.save(log);
+                    throw new RuntimeException("节点参数异常");
+                }
 
-        //填充配置节点内容
-        ResourceAutoCode resourceAutoCode = resourceAutoCodeService.getById(taskNode.getAutoNode().getId());
-        taskNode.setAutoNode(resourceAutoCode);
+                if (tTask == null || tTask.getStatus() == "3") {
+                    log.setTaskNodeId(taskNode.getId()).setExeResult("0").setManual("0").setFeedback("当前任务为空");
+                    autoNodeLogService.save(log);
+                    throw new RuntimeException("节点参数异常");
+                }
+        //        //获取配置序数据
+                //任务初始化判断
+                if ("1".equals(tTask.getStatus())) {
+                    //下发的数据才更新状态
+                    tTask.setStatus("2").setStartTime(new Date());
+                    taskMapper.updateById(tTask);
+                    planMapper.updateproduceStatusBegin();
+                    orderMapper.updateproduceStatusBegin();
+
+                    msgUtil.redis_set(CacheKey.PRESOURCE_CURRENT_TASK + "_" + tTask.getResourceId(), tTask.getId());
+                    msgUtil.redis_set(CacheKey.PRESOURCE_CURRENT_TASK_OBJECT + "_" + tTask.getResourceId(), tTask);
+                }
+                //获取配置节点
+        //        String autoProgramUrl = getInterfaceUrl(taskNode);
 
-        isFinal = resourceAutoCode.isFinal() ? true : false;
-        msgUtil.redis_set(CacheKey.TASK_CURRENT_NODE + "_" + taskNode.getResourceId(), resourceAutoCode);
+                //填充配置节点内容
+                ResourceAutoCode resourceAutoCode = resourceAutoCodeService.getById(taskNode.getAutoNode().getId());
+                taskNode.setAutoNode(resourceAutoCode);
 
-        //更新节点任务
-        taskNode.setExeStatus("2").setStartTime(new Date());
-        taskNodeMapper.updateAllById(taskNode);
+                isFinal = resourceAutoCode.isFinal() ? true : false;
+                msgUtil.redis_set(CacheKey.TASK_CURRENT_NODE + "_" + taskNode.getResourceId(), resourceAutoCode);
 
-        //初始化业务日志
-        AAutoNodeLog log = getBusinessLog(tTask, taskNode);
+                //更新节点任务
+                taskNode.setExeStatus("2").setStartTime(new Date());
+                taskNodeMapper.updateAllById(taskNode);
 
-//        logger.info("==================请求地址=============" + autoProgramUrl);
-        String returnData = "";
-        boolean specialCallBackMyselfFlag = false;
-        Map conMap = new HashMap();
-        boolean lockFlag = false;
-        try {
-            lockFlag = lock.tryLock(10,TimeUnit.SECONDS);
-            if(lockFlag){
                 if ("04".equals(taskNode.getInterfaceType())) {
                     //人工上下料或质检
                     //不用调接口,直接返回成功
@@ -343,7 +350,7 @@ public class TaskWorkNode {
                                     JSONObject ret = new JSONObject();
                                     ret.put("result","true");
                                     returnData = ret.toJSONString();
-                                }else if(resourceBusiness.getName().contains("下料业务") && "GetServoStacker".equals(method) && "打标业务".equals(beforResourceBusiness.getName())){
+                                }else if(taskNode.getCompleteBatchSort()!=1 && "3".equals(beforTask.getStatus()) && resourceBusiness.getName().contains("下料业务") && "GetServoStacker".equals(method) && "打标业务".equals(beforResourceBusiness.getName())){
                                     specialCallBackMyselfFlag = true;
                                     String jsonParam = getRequestParam(conMap);
                                     //缓存执行当前节点传参
@@ -372,6 +379,7 @@ public class TaskWorkNode {
                     }
                 }
             }else{
+                logger.info("节点{}未获取到了执行锁",taskNode.getId());
                 conMap.put("result",false);
             }
         } catch (BizException e) {

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

@@ -1299,6 +1299,17 @@ public class TaskNodeServiceImpl extends SuperServiceImpl<TaskNodeMapper, TaskNo
     @Override
     public R taskNodeCallback(TaskNodeCallBackDTO bean) {
         log.info("指令回调参数======================" + JSONObject.toJSONString(bean));
+
+        String uid = bean.getUid() == null ? "" : bean.getUid().toString();
+
+        //验证是否重复回调
+        String cacheUid = msgUtil.redis_get(uid) == null ? "" : msgUtil.redis_get(uid).toString();
+        if (StringUtil.isNotEmpty(cacheUid)) {//排除掉重复回调
+            log.info("回调重复了======================" + cacheUid);
+            return null;
+        }
+
+
         BaseContextHandler.setTenant("0000");
         //取出参数
         String code = bean.getCode();
@@ -1341,14 +1352,6 @@ public class TaskNodeServiceImpl extends SuperServiceImpl<TaskNodeMapper, TaskNo
 
         String taskId = bean.getTaskId() == null ? "" : bean.getTaskId().toString();
         String bizCallBackData = jsonParam;
-        String uid = bean.getUid() == null ? "" : bean.getUid().toString();
-
-        //验证是否重复回调
-        String cacheUid = msgUtil.redis_get(uid) == null ? "" : msgUtil.redis_get(uid).toString();
-        if (StringUtil.isNotEmpty(cacheUid)) {//排除掉重复回调
-            log.info("回调重复了======================" + cacheUid);
-            return null;
-        }
         //把当前id存放入缓存
         msgUtil.redis_set(uid, uid, 1, TimeUnit.HOURS);
 

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

@@ -5,9 +5,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.github.zuihou.business.DemoLine.YunjianConstant;
 import com.github.zuihou.business.edgeLibrary.service.StockInfoService;
 import com.github.zuihou.business.edgeLibrary.service.impl.StockInfoServiceImpl;
-import com.github.zuihou.business.operationManagementCenter.dao.OrderMapper;
-import com.github.zuihou.business.operationManagementCenter.dao.OrderQualityMapper;
-import com.github.zuihou.business.operationManagementCenter.dao.PlanMapper;
+import com.github.zuihou.business.operationManagementCenter.dao.*;
 import com.github.zuihou.business.operationManagementCenter.entity.*;
 import com.github.zuihou.business.operationManagementCenter.service.TaskNodeService;
 import com.github.zuihou.business.operationManagementCenter.service.TaskService;
@@ -98,6 +96,10 @@ public class MsgUtil implements ApplicationContextAware {
     private OrderMapper orderMapper;
     @Autowired
     private PlanMapper planMapper;
+    @Autowired
+    private WorkpieceMapper workpieceMapper;
+    @Autowired
+    private TTaskTestUnqualifiedBomMapper taskTestUnqualifiedBomMapper;
 
     @Override
     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
@@ -185,19 +187,30 @@ public class MsgUtil implements ApplicationContextAware {
                 // TODO modify by yejian on 20220525 for 添加三坐标模拟
                 Random random = new Random();
                 Boolean measuringFlag = random.nextBoolean();
-                int measuringResult = measuringFlag ? 0 : 1;
+//                int measuringResult = measuringFlag ? 0 : 1;
+                int measuringResult = 1;
                 String measuringResultFile = filePath + taskNode.getCompleteBatchNo() + "_" + task.getProcedureNo();
                 List<String> fileContents = new ArrayList<>();
-//                if(measuringFlag){
-//                    fileContents.add("NG");
-//                }else{
+                OrderQuality orderQuality = new OrderQuality();
+                TTaskTestUnqualifiedBom taskTestUnqualifiedBom =  new TTaskTestUnqualifiedBom();
+
+                TWorkpiece workpiece = workpieceMapper.selectOne(Wraps.<TWorkpiece>lbQ().eq(TWorkpiece::getCompleteBatchNo,task.getCompleteBatchNo()));
+                if(measuringResult == 1){
+                    fileContents.add("NG");
+                    orderQuality.setOkFlag("NG");
+                    workpiece.setTestResult("0");
+                    taskTestUnqualifiedBom.setTestResult("0");
+                }else{
                     fileContents.add("OK");
-//                }
+                    orderQuality.setOkFlag("OK");
+                    workpiece.setTestResult("1");
+                    taskTestUnqualifiedBom.setTestResult("1");
+                }
                 SmbShareFileUtil.writeShareFileContent(measuringResultFile,fileContents,userName,password,fileIp);
                 Order order = orderMapper.selectById(task.getOrderId());
                 Plan plan = planMapper.selectById(task.getPlanId());
                 BBom bom = bBomMapper.selectById(task.getBomId());
-                OrderQuality orderQuality = new OrderQuality();
+
                 orderQuality.setOrderNo(order.getOrderNo());
                 orderQuality.setOrderId(order.getId());
                 orderQuality.setTaskId(task.getId());
@@ -206,10 +219,25 @@ public class MsgUtil implements ApplicationContextAware {
                 orderQuality.setProcedureId(task.getProcedureId());
                 orderQuality.setProcedureName(task.getProcedureName());
                 orderQuality.setMeasuringType(1);
-                orderQuality.setOkFlag("OK");
                 orderQuality.setMeasuringReport(measuringResultFile);
                 orderQualityMapper.insert(orderQuality);
 
+                taskTestUnqualifiedBom.setTaskId(task.getId());
+                taskTestUnqualifiedBom.setTaskNo(task.getTaskNo());
+                taskTestUnqualifiedBom.setOrderId(order.getId());
+                taskTestUnqualifiedBom.setOrderNo(order.getOrderNo());
+                taskTestUnqualifiedBom.setPlanId(plan.getId());
+                taskTestUnqualifiedBom.setPlanNo(plan.getPlanNo());
+                taskTestUnqualifiedBom.setProcedureId(task.getProcedureId());
+                taskTestUnqualifiedBom.setBomId(task.getBomId());
+                taskTestUnqualifiedBom.setBomName(bom.getName());
+                taskTestUnqualifiedBom.setUniqueCode(workpiece.getUniqueCode());
+                taskTestUnqualifiedBom.setBomNum(1);
+                taskTestUnqualifiedBomMapper.insert(taskTestUnqualifiedBom);
+
+                workpieceMapper.updateById(workpiece);
+
+
                 if(1 == measuringResult){
                     //获取下料工序
                     List<BomProcedure> bomProcedureList = bomProcedureService.list(Wraps.<BomProcedure>lbQ().eq(BomProcedure::getBomId,task.getBomId()).eq(BomProcedure::getType,"下料").orderByAsc(BomProcedure::getSort));