Przeglądaj źródła

调试发现问题修改,机器人上料手续增加托盘库位查找逻辑

yejian 3 lat temu
rodzic
commit
b690f42efb

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

@@ -3,8 +3,11 @@ package com.github.zuihou.business.mq;
 import cn.hutool.core.collection.CollectionUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.github.zuihou.base.R;
 import com.github.zuihou.business.DemoLine.DemoCacheKey;
 import com.github.zuihou.business.DemoLine.DemoLineConstant;
+import com.github.zuihou.business.edgeLibrary.dao.StockInfoMapper;
+import com.github.zuihou.business.edgeLibrary.entity.StockInfo;
 import com.github.zuihou.business.edgeLibrary.entity.Storge;
 import com.github.zuihou.business.edgeLibrary.service.StorgeService;
 import com.github.zuihou.business.operationManagementCenter.dao.OrderMapper;
@@ -17,16 +20,16 @@ import com.github.zuihou.business.operationManagementCenter.entity.TaskNode;
 import com.github.zuihou.business.operationManagementCenter.service.TaskNodeService;
 import com.github.zuihou.business.operationManagementCenter.service.WorkpieceService;
 import com.github.zuihou.business.productionReadyCenter.dao.AAutoNodeLogMapper;
-import com.github.zuihou.business.productionReadyCenter.entity.AAutoNodeLog;
-import com.github.zuihou.business.productionReadyCenter.entity.BomProcedureProductionresource;
-import com.github.zuihou.business.productionReadyCenter.entity.BomProcedureTray;
+import com.github.zuihou.business.productionReadyCenter.dao.BBomMapper;
+import com.github.zuihou.business.productionReadyCenter.dao.BomProcedureMapper;
+import com.github.zuihou.business.productionReadyCenter.dao.BomProcedureTrayMapper;
+import com.github.zuihou.business.productionReadyCenter.entity.*;
 import com.github.zuihou.business.productionReadyCenter.service.BomProcedureProductionresourceService;
 import com.github.zuihou.business.productionReadyCenter.service.BomProcedureVersionService;
 import com.github.zuihou.business.productionResourceCenter.dao.ProductionresourceBizMapper;
-import com.github.zuihou.business.productionResourceCenter.entity.Productionresource;
-import com.github.zuihou.business.productionResourceCenter.entity.ProductionresourcePosition;
-import com.github.zuihou.business.productionResourceCenter.entity.ResourceAutoCode;
-import com.github.zuihou.business.productionResourceCenter.entity.ResourceBusiness;
+import com.github.zuihou.business.productionResourceCenter.dao.ProductionresourcePositionMapper;
+import com.github.zuihou.business.productionResourceCenter.dao.ZZoneMapper;
+import com.github.zuihou.business.productionResourceCenter.entity.*;
 import com.github.zuihou.business.productionResourceCenter.service.NodeOperationService;
 import com.github.zuihou.business.productionResourceCenter.service.ProductionresourcePositionService;
 import com.github.zuihou.business.productionResourceCenter.service.ResourceAutoCodeService;
@@ -105,7 +108,6 @@ public class TaskWorkNode {
 
     @Autowired
     private ModuleInstructionService  moduleInstructionService;
-
     private NodeOperationService nodeOperationService;
 
     @Autowired
@@ -394,17 +396,17 @@ public class TaskWorkNode {
         map.put("instructions", moduleInstructions);
         map.put("moduleName", module.getName());
 
-        if ("1" == category) {
-            nodeOperationService = new MachineNodeServiceImpl();
-        } else if ("2" == category) {
-            nodeOperationService = new AGVNodeServiceImpl();
-        } else if ("3" == category) {
+        if ("1".equals(category)) {
+            nodeOperationService = MsgUtil.getBean(MachineNodeServiceImpl.class);
+        } else if ("2".equals(category)) {
+            nodeOperationService = MsgUtil.getBean(AGVNodeServiceImpl.class);
+        } else if ("3".equals(category)) {
             //默认示范线设备
             //map.put("robotType", DictionaryKey.LINE_ROBOT_NODES.get(robotType));
             map.put("robotType", DictionaryKey.YJ_ROBOT_NODES.get(robotType));
-            nodeOperationService = new RobotNodeServiceImpl();
-        } else if("4" == category){
-            nodeOperationService  = new OtherNodeServiceImpl();
+            nodeOperationService = MsgUtil.getBean(RobotNodeServiceImpl.class);
+        } else if("4".equals(category)) {
+            nodeOperationService  = MsgUtil.getBean(OtherNodeServiceImpl.class);
         }
         //初始化设备资源
         logger.info("========设备资源初始化=======" + module.getName()+"====="+taskNode.getResourceId());

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

@@ -1637,6 +1637,14 @@ public class TaskNodeServiceImpl extends SuperServiceImpl<TaskNodeMapper, TaskNo
                 queryMap.put("resourceId", manualInfo.getEndResourceId());
                 List<ProductionresourcePosition> targetList = productionresourcePositionMapper.getStorgeIdByResource(queryMap);
 
+                // 机器人动作已经完成
+                TaskNode currentTaskNode = manualInfo.getTaskNode();
+                // 更新当前节点完成状态
+                currentTaskNode.setExeStatus("3");
+                currentTaskNode.setExeResult("1");
+                baseMapper.updateById(currentTaskNode);
+                TaskNode nextTaskNode =  this.getNextNTaskNode(currentTaskNode,1);
+
                 // 判断是否是设备节点,还有后续指令节点
                 if(StringUtils.isNotBlank(manualInfo.getTaskId())){
                     // 先将原库位上所有物料信息读取出来
@@ -1652,12 +1660,6 @@ public class TaskNodeServiceImpl extends SuperServiceImpl<TaskNodeMapper, TaskNo
                     }
                     msgUtil.redis_del(manualInfo.getManualId());
                 }else{
-                    TaskNode currentTaskNode = manualInfo.getTaskNode();
-                    // 更新当前节点完成状态
-                    currentTaskNode.setExeStatus("3");
-                    currentTaskNode.setExeResult("1");
-                    baseMapper.updateById(currentTaskNode);
-                    TaskNode nextTaskNode =  this.getNextNTaskNode(currentTaskNode,1);
                     // 没有后续指令
                     if(null == nextTaskNode){
                         // 先将原库位上所有物料信息读取出来
@@ -1673,13 +1675,9 @@ public class TaskNodeServiceImpl extends SuperServiceImpl<TaskNodeMapper, TaskNo
                         }
                         msgUtil.redis_del(manualInfo.getManualId());
                     }else{
-                        // 设备还有后续指令需要执行
-                        // AGV 调度
-                        if(null == nextTaskNode.getResourceId()){
-
-                        }else{
-                            // 设备任务
-                        }
+                            Map paraMap = new HashMap();
+                            paraMap.put("taskId",manualInfo.getTaskId());
+                            workpieceService.executeOrder(paraMap);
                     }
                 }
 

+ 38 - 6
imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/operationManagementCenter/service/impl/WorkpieceServiceImpl.java

@@ -52,6 +52,7 @@ import org.springframework.http.MediaType;
 import org.springframework.stereotype.Service;
 import org.springframework.web.client.RestTemplate;
 
+import java.time.ZonedDateTime;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -629,7 +630,7 @@ public class WorkpieceServiceImpl extends SuperServiceImpl<WorkpieceMapper, TWor
         long taskId = Long.valueOf(paraMap.get("taskId").toString());
         TTask tTask = tTaskMapper.selectById(taskId);
         // 工序节点子任务
-        List<TaskNode> taskNodes = taskNodeService.list(Wraps.<TaskNode>lbQ().eq(TaskNode::getCompleteBatchNo,tTask.getCompleteBatchNo()).orderByAsc(TaskNode:: getPrority));
+        List<TaskNode> taskNodes = taskNodeService.list(Wraps.<TaskNode>lbQ().eq(TaskNode::getCompleteBatchNo,tTask.getCompleteBatchNo()).eq(TaskNode::getExeStatus,"1").orderByAsc(TaskNode:: getPrority));
         // 工件信息
         TWorkpiece workpiece = baseMapper.selectOne(Wraps.<TWorkpiece>lbQ().eq(TWorkpiece::getCompleteBatchNo,tTask.getCompleteBatchNo()));
 
@@ -679,21 +680,52 @@ public class WorkpieceServiceImpl extends SuperServiceImpl<WorkpieceMapper, TWor
         }else{
             // 按照顺序将托盘移动到上下料站
             // 根据动作节点拆分
+
+            // 判断当前第一个指令是的设备是机器人还是加工设备,如果是机器人指定起点和重点,如果是设备不需要传入起点和重点
+            Productionresource firstNodeResource = productionresourceBizMapper.selectById(taskNodes.get(0).getResourceId());
+            // TODO 先用名称判断
+            if(firstNodeResource.getName().contains("伺服舵机") || firstNodeResource.getName().contains("机器人")){
+                // 机器人需要有起点和终点
+            }else{
+
+            }
+
             List<StockInfo> stockInfos = stockInfoMapper.selectList(Wraps.<StockInfo>lbQ().eq(StockInfo::getCompleteBatchNo,tTask.getCompleteBatchNo()));
             ProductionresourcePosition startProductionresourcePosition = productionresourcePositionMapper.selectOne(Wraps.<ProductionresourcePosition>lbQ().eq(ProductionresourcePosition::getStorgeId, stockInfos.get(0).getStorgeId()));
             String startPointid = startProductionresourcePosition.getPointId();
 
             TaskNode lastActionTaskNode = getNextActionTaskNode(taskNodes,0);
-
+            TaskNode currentTaskNode = taskNodes.get(0);
+            ZZoneProductionresource zZoneProductionresource = zZoneProductionresourceMapper.selectOne(Wraps.<ZZoneProductionresource>lbQ().eq(ZZoneProductionresource::getResourceId,currentTaskNode.getResourceId()));
+//            ZZone zzone = zZoneMapper.selectOne(Wraps.<ZZone>lbQ().eq(ZZone::getId,zZoneProductionresource.getZoneId()));
+            ProductionresourcePosition endProductionresourcePosition = null;
             if(null == lastActionTaskNode.getResourceId()){
-
+                // agv动作,动态查询agv接驳位
+                // 查询当前设备所在产线的接驳位
+                Map queryParams = new HashedMap();
+                queryParams.put("zoneId",zZoneProductionresource.getZoneId());
+                queryParams.put("resourceName","接驳");
+                List<Productionresource> productionresources = productionresourceBizMapper.selectResouces(queryParams);
+
+                // 遍历接驳位判断是否有可用的接驳位
+                for(Productionresource productionresource : productionresources){
+                    endProductionresourcePosition = productionresourcePositionMapper.selectOne(Wraps.<ProductionresourcePosition>lbQ().eq(ProductionresourcePosition::getResourceId, productionresource.getId()));
+                    List<StockInfo> agvStationMeterails = stockInfoMapper.selectList(Wraps.<StockInfo>lbQ().eq(StockInfo::getStorgeId,endProductionresourcePosition.getStorgeId()));
+                    List<String> meterails = agvStationMeterails.stream().map(p -> p.getGoodsType()).collect(Collectors.toList());
+                    // 有托板但是没有托盘认为可放
+                    if(meterails.contains("5") &&  meterails.contains("2")){
+                        break;
+                    }
+                }
             }
-
-            ProductionresourcePosition endProductionresourcePosition = productionresourcePositionMapper.selectOne(Wraps.<ProductionresourcePosition>lbQ().eq(ProductionresourcePosition::getResourceId, lastActionTaskNode.getResourceId()));
+            if(null == endProductionresourcePosition){
+                return R.fail("不具备搬运条件,AGV接驳位不可用");
+            }
+            // 满足条件的agv接驳位
             String endPointid = endProductionresourcePosition.getPointId();
 
+            // 在回调中分段处理
             return processOperation(taskId, tTask, taskNodes, zZone, startPointid, endPointid);
-            // 回调中分段处理
         }
     }
 

+ 2 - 0
imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/productionResourceCenter/dao/ProductionresourceBizMapper.java

@@ -5,6 +5,7 @@ import com.github.zuihou.business.productionResourceCenter.entity.Productionreso
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -18,4 +19,5 @@ import java.util.List;
 public interface ProductionresourceBizMapper extends SuperMapper<Productionresource> {
 
 
+    List<Productionresource> selectResouces(Map queryParams);
 }

+ 49 - 26
imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/productionResourceCenter/service/impl/RobotNodeServiceImpl.java

@@ -3,18 +3,27 @@ package com.github.zuihou.business.productionResourceCenter.service.impl;
 
 import cn.hutool.core.collection.CollectionUtil;
 import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.github.zuihou.base.R;
 import com.github.zuihou.business.DemoLine.DemoCacheKey;
 import com.github.zuihou.business.DemoLine.DemoLineConstant;
 import com.github.zuihou.business.DemoLine.YunjianConstant;
+import com.github.zuihou.business.edgeLibrary.dao.StockInfoMapper;
+import com.github.zuihou.business.edgeLibrary.dao.StorgeMapper;
+import com.github.zuihou.business.edgeLibrary.entity.StockInfo;
 import com.github.zuihou.business.edgeLibrary.entity.Storge;
 import com.github.zuihou.business.edgeLibrary.service.StorgeService;
 import com.github.zuihou.business.operationManagementCenter.entity.TTask;
+import com.github.zuihou.business.operationManagementCenter.entity.TWorkpiece;
 import com.github.zuihou.business.operationManagementCenter.entity.TaskNode;
 import com.github.zuihou.business.operationManagementCenter.service.TaskNodeService;
-import com.github.zuihou.business.operationManagementCenter.service.TaskService;
 import com.github.zuihou.business.operationManagementCenter.service.WorkpieceService;
+import com.github.zuihou.business.productionReadyCenter.dao.BomProcedureMapper;
+import com.github.zuihou.business.productionReadyCenter.dao.BomProcedureTrayMapper;
+import com.github.zuihou.business.productionReadyCenter.entity.BBom;
+import com.github.zuihou.business.productionReadyCenter.entity.BomProcedure;
+import com.github.zuihou.business.productionReadyCenter.entity.BomProcedureTray;
 import com.github.zuihou.business.productionResourceCenter.dao.ProductionresourcePositionMapper;
+import com.github.zuihou.business.productionResourceCenter.dao.ZZoneProductionresourceMapper;
 import com.github.zuihou.business.productionResourceCenter.entity.ProductionresourcePosition;
 import com.github.zuihou.business.productionResourceCenter.entity.ResourceAutoCode;
 import com.github.zuihou.business.productionResourceCenter.entity.ZZone;
@@ -28,24 +37,15 @@ import com.github.zuihou.common.constant.BizConstant;
 import com.github.zuihou.common.constant.DictionaryKey;
 import com.github.zuihou.common.util.StringUtil;
 import com.github.zuihou.database.mybatis.conditions.Wraps;
-import com.github.zuihou.database.mybatis.conditions.query.LbqWrapper;
-import com.github.zuihou.tenant.entity.Module;
-import com.github.zuihou.tenant.entity.Productionresource;
-import com.github.zuihou.tenant.entity.TenantResource;
-import com.github.zuihou.tenant.service.ModuleService;
-import com.github.zuihou.tenant.service.ProductionresourceService;
 import com.google.common.collect.Maps;
 import lombok.extern.slf4j.Slf4j;
-import org.checkerframework.checker.units.qual.C;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
 
 import static java.util.stream.Collectors.groupingBy;
 
@@ -53,8 +53,6 @@ import static java.util.stream.Collectors.groupingBy;
 @Service
 public class RobotNodeServiceImpl implements NodeOperationService {
 
-    private ProductionresourcePosition productionresourcePosition;
-
     @Autowired
     private ProductionresourcePositionService productionresourcePositionService;
 
@@ -67,9 +65,6 @@ public class RobotNodeServiceImpl implements NodeOperationService {
     @Autowired
     private StorgeService storgeService;
 
-    @Autowired
-    private TaskService taskService;
-
     @Autowired
     private MsgUtil msgUtil;
 
@@ -77,13 +72,18 @@ public class RobotNodeServiceImpl implements NodeOperationService {
     private WorkpieceService workpieceService;
 
     @Autowired
-    private ProductionresourceService productionresourceService;
-
-    @Autowired
-    private ModuleService moduleService;
+    private ZZoneProductionresourceMapper zZoneProductionresourceMapper;
 
     @Autowired
     private ZZoneProductionresourceService zZoneProductionresourceService;
+    @Autowired
+    private BomProcedureMapper bomProcedureMapper;
+    @Autowired
+    private BomProcedureTrayMapper bomProcedureTrayMapper;
+    @Autowired
+    private StockInfoMapper stockInfoMapper;
+    @Autowired
+    private StorgeMapper storgeMapper;
 
     @Autowired
     private ZZoneService zoneService;
@@ -124,11 +124,11 @@ public class RobotNodeServiceImpl implements NodeOperationService {
         //this.sxlzIdArr = new String[] {DemoLineConstant.JQR1};
         String moduleName = dataMap.get("moduleName") == null ? "" : dataMap.get("moduleName").toString();
         String robotType = dataMap.get("robotType") == null ? "" : dataMap.get("robotType").toString();
+        ZZoneProductionresource zoneProductionresource = zZoneProductionresourceMapper.selectOne(Wraps.<ZZoneProductionresource>lbQ().eq(ZZoneProductionresource::getResourceId,taskNode.getResourceId()));
         if(StringUtil.isNotEmpty(moduleName)) {
             //List<Module> modules = moduleService.list(new QueryWrapper<Module>().like("name", moduleName));
-            Productionresource productionresource = productionresourceService.getOne(new QueryWrapper<Productionresource>().eq("id", taskNode.getResourceId()));
-            if(productionresource!=null){
-                deviceArr = new String[] {productionresource.getId().toString()};
+            if(zoneProductionresource!=null){
+                deviceArr = new String[] {zoneProductionresource.getResourceId().toString()};
                 robotList = productionresourcePositionService.getFreeProductionresourcePositionByIds(deviceArr);
             }
         }
@@ -140,8 +140,7 @@ public class RobotNodeServiceImpl implements NodeOperationService {
 //            jbwList = productionresourcePositionService.getFreeProductionresourcePositionByIds(jbwArr);
 //        }
         //获取产线ID
-        ZZoneProductionresource zZoneProductionresource = zZoneProductionresourceService.getOne(new LbqWrapper<ZZoneProductionresource>().eq(ZZoneProductionresource::getResourceId, taskNode.getResourceId()));
-        zoneId = zZoneProductionresource.getZoneId();
+        zoneId = zoneProductionresource.getZoneId();
         zZone = zoneService.getById(zoneId);
         zoneName = zoneService.getById(zoneId).getName();
     }
@@ -174,7 +173,31 @@ public class RobotNodeServiceImpl implements NodeOperationService {
 //            return map;
 //        }
         //开始库位
-        Storge currStore = workpieceService.getWorkPieceStock(taskNode.getId(), false);
+        // add by yejian on 20220329 for 区分上料逻辑,起点需要取判断托盘家具是否够用
+        // 查找工件所属产线
+        // 根据工序判断需要做什么任务
+        Storge currStore = null;
+        BomProcedure bomProcedure = bomProcedureMapper.selectOne(Wraps.<BomProcedure>lbQ().eq(BomProcedure::getId,task.getProcedureId()));
+        // 人工序只有上下料
+        if("上料".equals(bomProcedure.getType())){
+            // 判断当前任务所属产品,找出相应的子盘夹具
+            BomProcedureTray bomProcedureTray = bomProcedureTrayMapper.selectOne(Wraps.<BomProcedureTray>lbQ().eq(BomProcedureTray::getProcedureId,task.getProcedureId()));
+            // 判断夹具是否有可用的,查询330个库位信息中是否还有夹具
+            List<StockInfo> stockInfos = stockInfoMapper.selectList(Wraps.<StockInfo>lbQ().eq(StockInfo::getGoodsId,bomProcedureTray.getTrayId()).orderByAsc(StockInfo::getStorgeId));
+            if(stockInfos.size() <= 0){
+                map.put("result", false);
+                map.put("msg", DictionaryKey.NodeException.RUNNING_FALSE);
+                return map;
+            }
+            // 按照顺序将托盘移动到上下料站
+            // 获取抓取托盘起点及放设备重点
+            StockInfo metetailStockInfo = stockInfos.get(0);
+            ProductionresourcePosition startProductionresourcePosition = productionresourcePositionMapper.selectOne(Wraps.<ProductionresourcePosition>lbQ().eq(ProductionresourcePosition::getStorgeId, metetailStockInfo.getStorgeId()));
+            currStore = storgeMapper.selectById(startProductionresourcePosition.getStorgeId());
+        }else{
+            currStore = workpieceService.getWorkPieceStock(taskNode.getId(), false);
+        }
+
         //目的库位
         Storge jqrStorge = storgeService.getById(robotList.get(0).getStorgeId());
         //目标地址判断

+ 14 - 0
imcs-admin-boot/imcs-business-biz/src/main/resources/mapper_business/base/productionResourceCenter/ProductionresourceBizMapper.xml

@@ -78,5 +78,19 @@
           ${sql}
     </select>
 
+    <select id="selectResouces" resultType="com.github.zuihou.business.productionResourceCenter.entity.Productionresource">
+        SELECT
+            itp.*
+        FROM imcs_tenant_productionresource itp
+        LEFT JOIN imcs_z_zone_productionresource izzp
+        ON itp.id = izzp.resource_id
+        <if test="resourceName != null and resourceName != ''">
+            and itp.name like concat('%', #{resourceName}, '%')
+        </if>
+        <if test="zoneId != null and zoneId != ''">
+            and izzp.zone_id = #{zoneId}
+        </if>
+    </select>
+
 
 </mapper>