Jelajahi Sumber

1审核订单将优先级默认从100调整到50
2.工件表增加part_prority字段,存放计划的优先级方便后续排产比较
3.rabbitmq同一设备队列增加任务优先级比较,防止rabbitmq抢占后紧急插单提高的优先级任务没有第一时间执行

yejian 3 tahun lalu
induk
melakukan
a8dff5bfc3

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

@@ -23,4 +23,6 @@ import java.util.Map;
 @Repository
 public interface WorkpieceMapper extends SuperMapper<TWorkpiece> {
     IPage<TWorkpiece> pageList(IPage page, @Param(Constants.WRAPPER) Wrapper<TWorkpiece> queryWrapper);
+
+    void updatePlanWorkpiecePrority(Map workPieceParam);
 }

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

@@ -398,7 +398,7 @@ public class OrderServiceImpl extends SuperServiceImpl<OrderMapper, Order> imple
                             TWorkpiece workpiece = new TWorkpiece();
                             workpiece.setBomId(planProduct.getBomId()).setCompleteBatchNo(UUID.randomUUID().toString().replace("-", "")).setOrderId(planProduct.getOrderId()).setOrderNo(planProduct.getOrderNo())
                                     .setPlanId(planProduct.getPlanId()).setPlanNo(planProduct.getPlanNo()).setBomName(bbomsMap.get(planProduct.getBomId()).getName()).setBomNo(bbomsMap.get(planProduct.getBomId()).getNo()).setOrderName(oriBean.getOrderName())
-                            .setIsEnd("0").setSerialNo(partNum+1);
+                            .setIsEnd("0").setSerialNo(partNum+1).setPartPrority(plan.getPrority());
                             workpieceMapper.insert(workpiece);
 
                             // 生成task表,因为工序定了以后不变,排产时只需更新预计开始时间和结束时间
@@ -472,6 +472,13 @@ public class OrderServiceImpl extends SuperServiceImpl<OrderMapper, Order> imple
 
         Plan bean = BeanPlusUtil.toBean(data, Plan.class);
         planMapper.updateById(bean);
+
+        // 将计划下工件对应的工件优先级更新成计划的优先级
+        Map workPieceParam = new HashMap();
+        workPieceParam.put("planId",bean.getId());
+        workPieceParam.put("partPrority", bean.getPrority());
+        workpieceMapper.updatePlanWorkpiecePrority(workPieceParam);
+
         return R.success();
     }
 

+ 2 - 2
imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/operationManagementCenter/service/impl/PlanServiceImpl.java

@@ -100,7 +100,7 @@ public class PlanServiceImpl extends SuperServiceImpl<PlanMapper, Plan> implemen
                         p.setOrderNo(map.get("orderNo")==null?"":map.get("orderNo").toString());
                         p.setDraftFlag("1");//草稿
                         p.setPlanNo(codeRuleService.getBillCode(CodeRuleModule.CODE_RULE_PLAN));
-                        p.setPrority(100);//暂时默认
+                        p.setPrority(50);//暂时默认
                         //设置时间相关
                         p.setStartTime(new Date());
                         p.setEndTime(map.get("deliveryTime")==null?null:DateUtil.stringToDate3(map.get("deliveryTime").toString()));
@@ -128,7 +128,7 @@ public class PlanServiceImpl extends SuperServiceImpl<PlanMapper, Plan> implemen
                     p.setOrderNo(map.get("orderNo")==null?"":map.get("orderNo").toString());
                     p.setDraftFlag("1");//草稿
                     p.setPlanNo(codeRuleService.getBillCode(CodeRuleModule.CODE_RULE_PLAN));
-                    p.setPrority(100);//暂时默认
+                    p.setPrority(50);//暂时默认
                     //设置时间相关
                     p.setStartTime(new Date());
                     p.setEndTime(map.get("deliveryTime")==null?null:(Date)map.get("deliveryTime"));

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

@@ -340,7 +340,6 @@ public class TaskServiceImpl extends SuperServiceImpl<TTaskMapper, TTask> implem
                 workpiece.setOpList(opList);
                 // 根据最终版本调整交互日期及优先级
                 workpiece.setDueDate(orderProduct.getDeliveryTime().getTime());
-                workpiece.setPartPrority(orderProduct.getPrority());
                 partMap.put(workpiece.getCompleteBatchNo(),workpiece);
             }
         }

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

@@ -324,55 +324,62 @@ public class RobotNodeServiceImpl implements NodeOperationService {
                     log.info("节点{}检查机器人资源{}点位返回{}",taskNode.getId(),po.getResourceId(),po.getPointId());
                     if (po != null) {
                         // 机器人可用,判断目标地址
-                        //目标库位,可能是
-                        Map returnMap = getTargetStorge(nextTaskNode,taskNode.getFindAgvFlag(),bomProcedure.getType());
 
-                        //目标地址和类型
-                        Storge targetStorge = returnMap.get("store")==null?null:(Storge)returnMap.get("store");
-                        log.info("节点{}检查目标库位是否满足返回{}",taskNode.getId(),targetStorge.getPointId());
-                        if(null != targetStorge){
-
-                            String targetxbk = returnMap.get("targetxbk")==null?null:(String)returnMap.get("targetxbk");
-                            jqrStorge = storgeService.getById(jqrMap.get(DemoLineConstant.DEMOLINE_RJQR_ZS).get(0).getStorgeId());
-                            jqrStorge.setCompleteBatchNo(task.getCompleteBatchNo());
-                            storgeService.lockStorge(jqrStorge, nextTaskNode.getId());
-                            //锁定一个缓存位
-                            List<ProductionresourcePosition> hcwList = jqrMap.get(jqrMap.keySet().stream().filter(p -> !DemoLineConstant.DEMOLINE_RJQR_ZS.equals(p)).findFirst().get());
-                            Storge hcwStorge = storgeService.getById(hcwList.get(0).getStorgeId());
-                            hcwStorge.setCompleteBatchNo(task.getCompleteBatchNo());
-                            storgeService.lockStorge(hcwStorge, nextTaskNode.getId());
-
-                            //锁定目标库位
-                            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);
-                            msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_JXS + taskNode.getId(), jqrStorge, 1, TimeUnit.DAYS);
-                            //缓存位缓存
-                            msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_HCW + nextTaskNode.getId(), hcwStorge, 1, TimeUnit.DAYS);
-                            msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_HCW + taskNode.getId(), hcwStorge, 1, TimeUnit.DAYS);
-                            //目标缓存
-                            msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + DemoLineConstant.YUNJIAN_TARGET_STORE + nextTaskNode.getId(), targetStorge, 1, TimeUnit.DAYS);
-
-                            //目标是线边库
-                            msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + DemoLineConstant.YUNJIAN_TARGET_XBK_FLAG + nextTaskNode.getId(), targetxbk, 1, TimeUnit.DAYS);
-
-                            //满足条件--机器人空闲,设备或线边库有一个空闲
-                            Map locationMap = new HashMap();
-                            locationMap.put("location",startStore.getPointId());
-                            dataMap.put("data", locationMap);
-                            dataMap.put("method", "MoveRobotPosition");
-                            dataMap.put("result", true);
+                        // 判断同一资源是否有优先级更高的任务需要执行,如果有重新进入队列
+                        List<TaskNode> highLevelTaskNode = taskNodeService.list(Wraps.<TaskNode>lbQ().lt(TaskNode::getExpectStartTime,taskNode.getExpectStartTime()).eq(TaskNode::getExeStatus,"2").ne(TaskNode::getId,taskNode.getId()));
+                        if(highLevelTaskNode.size() > 0){
+                            dataMap.put("result", false);
+                        }else{
+                            //目标库位,可能是
+                            Map returnMap = getTargetStorge(nextTaskNode,taskNode.getFindAgvFlag(),bomProcedure.getType());
+
+                            //目标地址和类型
+                            Storge targetStorge = returnMap.get("store")==null?null:(Storge)returnMap.get("store");
+                            log.info("节点{}检查目标库位是否满足返回{}",taskNode.getId(),targetStorge.getPointId());
+                            if(null != targetStorge){
+
+                                String targetxbk = returnMap.get("targetxbk")==null?null:(String)returnMap.get("targetxbk");
+                                jqrStorge = storgeService.getById(jqrMap.get(DemoLineConstant.DEMOLINE_RJQR_ZS).get(0).getStorgeId());
+                                jqrStorge.setCompleteBatchNo(task.getCompleteBatchNo());
+                                storgeService.lockStorge(jqrStorge, nextTaskNode.getId());
+                                //锁定一个缓存位
+                                List<ProductionresourcePosition> hcwList = jqrMap.get(jqrMap.keySet().stream().filter(p -> !DemoLineConstant.DEMOLINE_RJQR_ZS.equals(p)).findFirst().get());
+                                Storge hcwStorge = storgeService.getById(hcwList.get(0).getStorgeId());
+                                hcwStorge.setCompleteBatchNo(task.getCompleteBatchNo());
+                                storgeService.lockStorge(hcwStorge, nextTaskNode.getId());
+
+                                //锁定目标库位
+                                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);
+                                msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_JXS + taskNode.getId(), jqrStorge, 1, TimeUnit.DAYS);
+                                //缓存位缓存
+                                msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_HCW + nextTaskNode.getId(), hcwStorge, 1, TimeUnit.DAYS);
+                                msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_HCW + taskNode.getId(), hcwStorge, 1, TimeUnit.DAYS);
+                                //目标缓存
+                                msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + DemoLineConstant.YUNJIAN_TARGET_STORE + nextTaskNode.getId(), targetStorge, 1, TimeUnit.DAYS);
+
+                                //目标是线边库
+                                msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + DemoLineConstant.YUNJIAN_TARGET_XBK_FLAG + nextTaskNode.getId(), targetxbk, 1, TimeUnit.DAYS);
+
+                                //满足条件--机器人空闲,设备或线边库有一个空闲
+                                Map locationMap = new HashMap();
+                                locationMap.put("location",startStore.getPointId());
+                                dataMap.put("data", locationMap);
+                                dataMap.put("method", "MoveRobotPosition");
+                                dataMap.put("result", true);
 //                            dataMap.put("bizType", targetxbk);
-                            // begin modify by yejian on 20220520 for 解决资源抢占时机器人是空闲状态但是实际上面有料不能操作的时候请求指令接口返回失败后进入死循环问题
-                            // TODO 后续可改成信号对接判断,先如果返回失败释放资源进去队列重新轮训
-                            // 返回内容中记录当前任务占用资源
+                                // 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);
+                                // end modify by yejian on 20220520 for 解决资源抢占时机器人是空闲状态但是实际上面有料不能操作的时候请求指令接口返回失败后进入死循环问题
+                            }else{
+                                dataMap.put("result", false);
+                            }
                         }
 
                     }else{
@@ -426,64 +433,70 @@ public class RobotNodeServiceImpl implements NodeOperationService {
                 ProductionresourcePosition po = logical(robotList,flikustockInfos,taskNode);
                 log.info("节点{}检查机器人资源条件返回{}",taskNode.getId(),po);
                 if (po!=null) {
-                    Map returnMap = getTargetStorge(nextTaskNode,taskNode.getFindAgvFlag(),bomProcedure.getType());
 
-                    //目标地址和类型
-                    Storge targetStorge = returnMap.get("store")==null?null:(Storge)returnMap.get("store");
-                    String targetxbk = returnMap.get("targetxbk")==null?null:(String)returnMap.get("targetxbk");
-                    log.info("节点{}检查目标库位是否满足返回{}",taskNode.getId(),targetStorge.getPointId());
-
-                    // 立库取子盘到人工上下料站资源不可用时不能进入线边库
-                    if(taskNode.getCompleteBatchSort()==1 && "1".equals(targetxbk)){
+                    List<TaskNode> highLevelTaskNode = taskNodeService.list(Wraps.<TaskNode>lbQ().lt(TaskNode::getExpectStartTime,taskNode.getExpectStartTime()).eq(TaskNode::getExeStatus,"2").ne(TaskNode::getId,taskNode.getId()));
+                    if(highLevelTaskNode.size() > 0){
                         dataMap.put("result", false);
                     }else{
-                        if(null != targetStorge){
-                            jqrStorge = storgeService.getById(robotList.get(0).getStorgeId());
-
-                            dataMap.put("fromStorge", startStore);
-
-                            Map locationMap = new HashMap();
-                            locationMap.put("location",startStore.getPointId());
-                            dataMap.put("data", locationMap);
-                            // TODO 有问题,需要区分是否是第一步上料
-                            //出入库类型
-                            if(taskNode.getCompleteBatchSort()==1){//TODO 条件后续再丰富
-                                dataMap.put(DemoLineConstant.DEMOLINE_STOCK_TYPE, DemoLineConstant.DEMOLINE_STOCK_TYPE_TRAY_CRK);
-                            }else {
-                                dataMap.put(DemoLineConstant.DEMOLINE_STOCK_TYPE, DemoLineConstant.DEMOLINE_STOCK_TYPE_ALL_CRK);
-                            }
+                        Map returnMap = getTargetStorge(nextTaskNode,taskNode.getFindAgvFlag(),bomProcedure.getType());
 
-                            //目的地为机器人手臂
-                            dataMap.put("toStorge", jqrStorge);
+                        //目标地址和类型
+                        Storge targetStorge = returnMap.get("store")==null?null:(Storge)returnMap.get("store");
+                        String targetxbk = returnMap.get("targetxbk")==null?null:(String)returnMap.get("targetxbk");
+                        log.info("节点{}检查目标库位是否满足返回{}",taskNode.getId(),targetStorge.getPointId());
+
+                        // 立库取子盘到人工上下料站资源不可用时不能进入线边库
+                        if(taskNode.getCompleteBatchSort()==1 && "1".equals(targetxbk)){
+                            dataMap.put("result", false);
+                        }else{
+                            if(null != targetStorge){
+                                jqrStorge = storgeService.getById(robotList.get(0).getStorgeId());
+
+                                dataMap.put("fromStorge", startStore);
+
+                                Map locationMap = new HashMap();
+                                locationMap.put("location",startStore.getPointId());
+                                dataMap.put("data", locationMap);
+                                // TODO 有问题,需要区分是否是第一步上料
+                                //出入库类型
+                                if(taskNode.getCompleteBatchSort()==1){//TODO 条件后续再丰富
+                                    dataMap.put(DemoLineConstant.DEMOLINE_STOCK_TYPE, DemoLineConstant.DEMOLINE_STOCK_TYPE_TRAY_CRK);
+                                }else {
+                                    dataMap.put(DemoLineConstant.DEMOLINE_STOCK_TYPE, DemoLineConstant.DEMOLINE_STOCK_TYPE_ALL_CRK);
+                                }
+
+                                //目的地为机器人手臂
+                                dataMap.put("toStorge", jqrStorge);
 
 //                            dataMap.put("bizType", targetxbk);
-                            //锁定机器人
-                            jqrStorge.setCompleteBatchNo(task.getCompleteBatchNo());
-                            storgeService.lockStorge(jqrStorge, nextTaskNode.getId());
-
-                            //锁定目标库位
-                            targetStorge.setCompleteBatchNo(task.getCompleteBatchNo());
-                            storgeService.lockStorge(targetStorge, nextTaskNode.getId());
-
-                            //抓手缓存
-                            msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_JXS + nextTaskNode.getId(), jqrStorge, 1, TimeUnit.DAYS);
-                            msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_JXS + taskNode.getId(), jqrStorge, 1, TimeUnit.DAYS);
-                            //目标缓存
-                            msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + DemoLineConstant.YUNJIAN_TARGET_STORE + nextTaskNode.getId(), targetStorge, 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 后续可改成信号对接判断,先如果返回失败释放资源进去队列重新轮训
-                            // 返回内容中记录当前任务占用资源
+                                //锁定机器人
+                                jqrStorge.setCompleteBatchNo(task.getCompleteBatchNo());
+                                storgeService.lockStorge(jqrStorge, nextTaskNode.getId());
+
+                                //锁定目标库位
+                                targetStorge.setCompleteBatchNo(task.getCompleteBatchNo());
+                                storgeService.lockStorge(targetStorge, nextTaskNode.getId());
+
+                                //抓手缓存
+                                msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_JXS + nextTaskNode.getId(), jqrStorge, 1, TimeUnit.DAYS);
+                                msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_JXS + taskNode.getId(), jqrStorge, 1, TimeUnit.DAYS);
+                                //目标缓存
+                                msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + DemoLineConstant.YUNJIAN_TARGET_STORE + nextTaskNode.getId(), targetStorge, 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 解决资源抢占时机器人是空闲状态但是实际上面有料不能操作的时候请求指令接口返回失败后进入死循环问题
+                                // end modify by yejian on 20220520 for 解决资源抢占时机器人是空闲状态但是实际上面有料不能操作的时候请求指令接口返回失败后进入死循环问题
 
-                        }else{
-                            dataMap.put("result", false);
+                            }else{
+                                dataMap.put("result", false);
+                            }
                         }
                     }
                 }else{

+ 6 - 1
imcs-admin-boot/imcs-business-biz/src/main/resources/mapper_business/base/operationManagementCenter/TWorkpieceMapper.xml

@@ -25,7 +25,6 @@
         order_no, order_id, unique_code, produce_status, test_result, plan_id, plan_no,complete_batch_no,bom_id,bom_name,bom_no
     </sql>
 
-
     <!-- 分页 -->
     <select id="pageList" resultMap="BaseResultMap">
         select
@@ -35,4 +34,10 @@
         ) s ${ew.customSqlSegment}
     </select>
 
+    <update id="updatePlanWorkpiecePrority">
+        update imcs_t_workpiece itw
+           set itw.part_prority = #{partPrority}
+         where itw.plan_id = #{planId}
+    </update>
+
 </mapper>

+ 6 - 6
imcs-admin-boot/imcs-business-entity/src/main/java/com/github/zuihou/business/operationManagementCenter/entity/TWorkpiece.java

@@ -226,6 +226,12 @@ public class TWorkpiece extends Entity implements Serializable {
     @TableField("exchange_zone_flag")
     private String exchangeZoneFlag;
 
+    /**
+     * 订单工件优先级
+     */
+    @TableField("part_prority")
+    private int partPrority;
+
     /**
      * 工序总数
      */
@@ -278,10 +284,4 @@ public class TWorkpiece extends Entity implements Serializable {
      */
     @TableField(exist = false)
     private double totalWorkTime;
-
-    /**
-     * 订单工件优先级
-     */
-    @TableField(exist = false)
-    private int partPrority;
 }