Ver código fonte

实现单个节点动态换产功能 上下料站兼容功能开发

oyq28 2 anos atrás
pai
commit
6ba3474f6f
20 arquivos alterados com 371 adições e 38 exclusões
  1. 1 1
      imcs-admin-boot/imcs-authority-server/src/main/java/com/github/zuihou/interceptor/TokenHandlerInterceptor.java
  2. 21 21
      imcs-admin-boot/imcs-authority-server/src/main/java/com/github/zuihou/job/DashboardJob.java
  3. 27 0
      imcs-admin-boot/imcs-business-biz/src/main/resources/mapper_business/base/edgeLibrary/StockInfoMapper.xml
  4. 38 0
      imcs-admin-boot/imcs-business-biz/src/main/resources/mapper_business/base/operationManagementCenter/OrderMapper.xml
  5. 22 7
      imcs-admin-boot/imcs-business-biz/src/main/resources/mapper_business/base/operationManagementCenter/TTaskMapper.xml
  6. 149 4
      imcs-admin-boot/imcs-business-controller/src/main/java/com/github/zuihou/business/controller/externalApi/SynProductionStatus.java
  7. 5 0
      imcs-admin-boot/imcs-business-controller/src/main/java/com/github/zuihou/business/controller/operationManagementCenter/OrderController.java
  8. 13 0
      imcs-admin-boot/imcs-business-controller/src/main/java/com/github/zuihou/business/controller/operationManagementCenter/TaskController.java
  9. 6 0
      imcs-admin-boot/imcs-business-controller/src/main/java/com/github/zuihou/business/controller/productionReadyCenter/BomProcedureVersionController.java
  10. 9 1
      imcs-admin-boot/imcs-business-controller/src/main/java/com/github/zuihou/business/controller/productionResourceCenter/ZZoneController.java
  11. 6 0
      imcs-admin-boot/imcs-business-entity/src/main/java/com/github/zuihou/business/operationManagementCenter/dto/OrderPageDTO.java
  12. 6 0
      imcs-admin-boot/imcs-business-entity/src/main/java/com/github/zuihou/business/productionReadyCenter/dto/BomProcedurePageDTO.java
  13. 7 0
      imcs-admin-boot/imcs-business-entity/src/main/java/com/github/zuihou/business/productionReadyCenter/dto/BomProcedureSaveDTO.java
  14. 7 0
      imcs-admin-boot/imcs-business-entity/src/main/java/com/github/zuihou/business/productionReadyCenter/dto/BomProcedureUpdateDTO.java
  15. 7 0
      imcs-admin-boot/imcs-business-entity/src/main/java/com/github/zuihou/business/productionReadyCenter/dto/BomProcedureVersionPageDTO.java
  16. 7 0
      imcs-admin-boot/imcs-business-entity/src/main/java/com/github/zuihou/business/productionReadyCenter/dto/BomProcedureVersionSaveDTO.java
  17. 7 0
      imcs-admin-boot/imcs-business-entity/src/main/java/com/github/zuihou/business/productionReadyCenter/dto/BomProcedureVersionUpdateDTO.java
  18. 9 2
      imcs-admin-boot/imcs-business-entity/src/main/java/com/github/zuihou/business/productionReadyCenter/entity/BomProcedure.java
  19. 9 2
      imcs-admin-boot/imcs-business-entity/src/main/java/com/github/zuihou/business/productionReadyCenter/entity/BomProcedureVersion.java
  20. 15 0
      imcs-admin-boot/imcs-common/src/main/java/com/github/zuihou/common/util/DateUtil.java

+ 1 - 1
imcs-admin-boot/imcs-authority-server/src/main/java/com/github/zuihou/interceptor/TokenHandlerInterceptor.java

@@ -104,7 +104,7 @@ public class TokenHandlerInterceptor extends HandlerInterceptorAdapter {
                 return super.preHandle(request, response, handler);
             }
 
-            //获取token, 解析,然后想信息放入 heade
+            //获取token, 解析,然后想信息放入 header
             //3, 获取token
             token = getHeader(BEARER_HEADER_KEY, request);
             log.debug("TokenHandlerInterceptor token="+token);

+ 21 - 21
imcs-admin-boot/imcs-authority-server/src/main/java/com/github/zuihou/job/DashboardJob.java

@@ -11,6 +11,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.github.zuihou.base.request.PageParams;
+import com.github.zuihou.business.edgeLibrary.service.StockInfoService;
+import com.github.zuihou.business.edgeLibrary.service.impl.StockInfoServiceImpl;
 import com.github.zuihou.business.operationManagementCenter.entity.Order;
 import com.github.zuihou.business.operationManagementCenter.entity.Plan;
 import com.github.zuihou.business.operationManagementCenter.service.OrderService;
@@ -22,6 +24,8 @@ import com.github.zuihou.business.productionResourceCenter.entity.Repair;
 import com.github.zuihou.business.productionResourceCenter.entity.ZZone;
 import com.github.zuihou.business.productionResourceCenter.service.RepairService;
 import com.github.zuihou.business.productionResourceCenter.service.ZZoneService;
+import com.github.zuihou.business.productionResourceCenter.service.impl.ZZoneServiceImpl;
+import com.github.zuihou.business.util.MsgUtil;
 import com.github.zuihou.business.websocket.WebSocketServer;
 import com.github.zuihou.common.util.StringUtil;
 import com.github.zuihou.context.BaseContextConstants;
@@ -53,6 +57,7 @@ import java.io.IOException;
 import java.lang.reflect.Field;
 import java.lang.reflect.ParameterizedType;
 import java.util.*;
+import java.util.stream.Collectors;
 
 
 @Component
@@ -88,6 +93,9 @@ public class DashboardJob {
     @Autowired
     private TokenUtil tokenUtil;
 
+    @Autowired
+    private MsgUtil msgUtil;
+
     @Value("${zuihou.database.tenantDatabasePrefix}")
     private String database;
 
@@ -116,24 +124,10 @@ public class DashboardJob {
             zoneMap.put("zoneData", zoneList);
             dataScreenMap.put("zoneMap", zoneMap);
 
-            PageParams params = new PageParams();
-            params.setCurrent(1L);
-            params.setSize(5l);
-            params.setOrder("descending");
-            params.setModel(null);
-            params.setSort("id");
-            params.setMap(new HashMap());
-
-            QueryWrap wrap = this.handlerWrapper(null, params);
-
-            LbqWrapper<Plan> wrapper = wrap.lambda();
-
-            Plan plan = BeanUtil.toBean(params.getModel(), Plan.class);
-            plan.setOrderProduceStatus(StringUtil.isEmpty(plan.getOrderProduceStatus()) ? "" : StringUtil.changeIdsArrToSubQueryStr(plan.getOrderProduceStatus()));
-            plan.setPlanStatus("2");
-            Page<Plan> planPage = new Page<Plan>();
+            LbqWrapper<Plan> wrapper = new LbqWrapper<Plan>();
+            Page<Plan> planPage = new Page<Plan>(1L, 8);
             planPage.setSearchCount(false);
-            wrapper.eq(Plan::getPlanStatus,"2").eq(Plan::getProduceStatus, "2");
+            wrapper.eq(Plan::getPlanStatus,"2").orderByDesc(Plan::getCreateTime);
 
             IPage<Plan> planData = planService.pageList(planPage, null, null, null, null, null, null, null, null, wrapper);
             //planData = planData.getRecords().stream().map(obj -> obj.setEndTime() );
@@ -142,12 +136,12 @@ public class DashboardJob {
             planMap.put("planData", planData);
             dataScreenMap.put("planMap", planMap);
 
-            QueryWrap orderWrap = this.handlerWrapper(null, params);
-            LbqWrapper<Order> OrderWrapper = orderWrap.lambda();
+            LbqWrapper<Order> OrderWrapper = new LbqWrapper<Order>();
 
-            Page<Order> orderPage = new Page<Order>();
+            Page<Order> orderPage = new Page<Order>(1L, 5);
             orderPage.setSearchCount(false);
-            OrderWrapper.eq(Order::getStatus, "1").notIn(Order::getProduceStatus,"3,4").orderByDesc(Order::getCreateTime);
+            List<Long> ids = planData.getRecords().stream().map(Plan::getOrderId).collect(Collectors.toList());
+            OrderWrapper.eq(Order::getStatus, "1").in(Order::getId, ids).orderByDesc(Order::getCreateTime);
             IPage<Order> orderData = orderService.pageList(orderPage, null, OrderWrapper);
 
             Map orderMap = Maps.newHashMap();
@@ -158,6 +152,12 @@ public class DashboardJob {
             Map orderStatistics = orderService.orderStatitcs();
             dataScreenMap.put("orderStatistics", orderStatistics);
 
+            //任务时长统计数据
+            Map timeSpanStatistics = orderService.timeSpanStatistics();
+            Map validTimeSpanStatistics = orderService.validTimeSpanStatistics();
+            dataScreenMap.put("timeSpanStatistics", timeSpanStatistics);
+            dataScreenMap.put("validTimeSpanStatistics", validTimeSpanStatistics);
+
             Page<Repair> repairPage = new Page<Repair>(1L, 5);
             repairPage.setSearchCount(false);
             IPage<Repair> repairData = repairService.pageList(repairPage, new LbqWrapper<Repair>().eq(Repair::getStatus, "1").orderByDesc(Repair::getRepairEndTime));

+ 27 - 0
imcs-admin-boot/imcs-business-biz/src/main/resources/mapper_business/base/edgeLibrary/StockInfoMapper.xml

@@ -206,4 +206,31 @@
     <update id="updateStockInfoByStorgeId">
         UPDATE imcs_s_stock_info SET storge_id = #{agvEndStorgeId} WHERE storge_id = #{agvStartStorgeId};
     </update>
+
+    <!-- 统计货架里数量 -->
+    <select id="getXbkCountByShelves" parameterType="map" resultType="map">
+        SELECT
+        count(*) AS cnt,
+        v2.`name`,
+        v2.no
+        FROM imcs_s_storge s
+        LEFT JOIN imcs_s_shelves v ON s.shelves_id = v.id
+        LEFT JOIN imcs_s_shelves v2 ON v2.id = v.parent_id
+        LEFT JOIN imcs_z_zone z ON Locate(z.abbreviate, left(v2.name,5))
+        WHERE
+        v.parent_id > 0
+        AND v.`status` = 1
+        <if test="no != null and no != ''">
+            AND v2.`no` <![CDATA[<>]]> #{no}
+        </if>
+        AND s. id NOT IN (
+          select storge_id from imcs_s_stock_info
+        )
+        <if test="orgIds != null and orgIds != ''">
+            and z.org_id in (${orgIds})
+        </if>
+        GROUP BY v.parent_id
+    </select>
+
+
 </mapper>

+ 38 - 0
imcs-admin-boot/imcs-business-biz/src/main/resources/mapper_business/base/operationManagementCenter/OrderMapper.xml

@@ -192,4 +192,42 @@
             )
     </update>
 
+    <select id="timeSpanStatistics" resultType="map">
+        SELECT
+            sum(s.timeMinute) as timeMinute,s.zoneId,s.zoneName
+        FROM
+            (
+                SELECT
+                    t.start_time, t.end_time,
+                    t.status,
+                    t.resource_id,
+                    p.name,
+                    z.name AS zoneName,
+                    z.id AS zoneId,
+                    TIMESTAMPDIFF(
+                        MINUTE,
+                            t.start_time,
+                            t.end_time
+                        ) AS timeMinute
+                FROM
+                    imcs_t_task t
+                        LEFT JOIN imcs_tenant_productionresource p ON t.resource_id = p.id
+                        LEFT JOIN imcs_z_zone z ON Locate(
+                            z.abbreviate,LEFT (p.name, 5)
+		                )
+                WHERE
+                    t.start_time IS NOT NULL
+                  AND (
+                        t.`status` = 3
+                        OR (
+                            t.`status` = 2
+                            AND t.end_time IS NOT NULL
+                        )
+                    )
+                  AND TO_DAYS(t.start_time) = TO_DAYS(NOW())
+                ORDER BY t.start_time ASC
+            ) s
+        GROUP BY s.zoneId
+    </select>
+
 </mapper>

+ 22 - 7
imcs-admin-boot/imcs-business-biz/src/main/resources/mapper_business/base/operationManagementCenter/TTaskMapper.xml

@@ -298,6 +298,7 @@
           ipp.prority AS prority,
           ibbp.name AS taskName,
           INSTR(ibbp.name, '下料') AS funcType,
+          INSTR(ittn.node_name, '申请') AS rclType,
           ibbp.remark AS content,
           ibbp.no AS taskNo,
           ibbp.tray_conf AS trayConf,
@@ -346,7 +347,7 @@
         AND imfc.id = ibbpt.tray_id
         AND imm.id = ibb.meterial_id
         AND itt.resource_id = #{resourceId}
-        ORDER BY ittn.exe_status DESC, funcType desc, ipp.prority desc, itt.procedure_order desc, ittn.complete_batch_sort, itt.expect_start_time LIMIT 0, 6
+        ORDER BY ittn.exe_status DESC, funcType desc, ipp.prority desc, rclType asc, itt.procedure_order desc, ittn.complete_batch_sort, itt.expect_start_time LIMIT 0, 6
     </select>
     <select id="selectTotalMachineUseTime" resultType="java.lang.Integer">
         SELECT
@@ -362,30 +363,44 @@
           irdr.`3d_resource_id` AS id,
           'cnc' AS deviceType,
           itp.name AS deviceName,
-          ioo.order_name AS orderName,
-          ioo.order_no AS orderNumber,
+          ifnull(ioo.order_name, '无订单') AS orderName,
+          ifnull(ioo.order_no, '无订单') AS orderNumber,
           irdr.resource_id AS resourceId,
-          tmp1.productName,
-          tmp1.productNumber
+          ifnull(tmp1.productName,'无产品') AS productName,
+          ifnull(tmp1.productNumber, '无产品') AS productNumber,
+          ifnull(tmp1.operationName,'无工序') AS operationName,
+          (case when itp.online_status='0' then '离线' when itp.online_status='1' then '在线' when itp.online_status='2' then '加工中' else '报警' end ) AS monitoringStatus,
+          izz.abbreviate
         FROM imcs_resource_3d_relation irdr
           LEFT JOIN imcs_tenant_productionresource itp
             ON (irdr.resource_id = itp.id)
+          LEFT JOIN imcs_z_zone izz ON Locate(izz.abbreviate, left(itp.name,5))
           LEFT JOIN (SELECT
               itt.resource_id,
               itt.order_id,
               ibbp.name AS operationName,
               ibb.name AS productName,
-              ibb.no AS productNumber
+              ibb.parts_no AS productNumber
             FROM imcs_t_task itt,
                  imcs_b_bom_procedure ibbp,
                  imcs_b_bom ibb
             WHERE itt.procedure_id = ibbp.id
             AND itt.bom_id = ibb.id
-            AND ibb.status = '2'
+            AND itt.status = '2'
+            GROUP BY itt.resource_id
             ORDER BY ibb.status DESC) tmp1
             ON (irdr.resource_id = tmp1.resource_id)
           LEFT JOIN imcs_o_order ioo
             ON (tmp1.order_id = ioo.id)
+          WHERE 1=1
+         <if test="zoneName != null">
+            and izz.abbreviate = '${zoneName}'
+         </if>
+    </select>
+
+    <select id="getTaskResourceName" resultType="java.util.Map">
+       SELECT * from imcs_s
+
     </select>
 
 </mapper>

+ 149 - 4
imcs-admin-boot/imcs-business-controller/src/main/java/com/github/zuihou/business/controller/externalApi/SynProductionStatus.java

@@ -1,20 +1,36 @@
 package com.github.zuihou.business.controller.externalApi;
 
+import cn.hutool.core.util.ArrayUtil;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.github.zuihou.base.R;
+import com.github.zuihou.business.DemoLine.DemoLineConstant;
+import com.github.zuihou.business.edgeLibrary.entity.StockInfo;
+import com.github.zuihou.business.edgeLibrary.entity.Storge;
+import com.github.zuihou.business.edgeLibrary.service.StockInfoService;
+import com.github.zuihou.business.edgeLibrary.service.StorgeService;
+import com.github.zuihou.business.operationManagementCenter.entity.TTask;
+import com.github.zuihou.business.operationManagementCenter.entity.TaskNode;
 import com.github.zuihou.business.operationManagementCenter.service.OrderService;
+import com.github.zuihou.business.operationManagementCenter.service.TaskNodeService;
+import com.github.zuihou.business.operationManagementCenter.service.TaskService;
 import com.github.zuihou.business.productionReadyCenter.entity.AAutoNodeLog;
 import com.github.zuihou.business.productionReadyCenter.service.AAutoNodeLogService;
 import com.github.zuihou.business.productionResourceCenter.dao.ProductionresourceBizMapper;
+import com.github.zuihou.business.productionResourceCenter.service.ProductionresourcePositionService;
+import com.github.zuihou.business.util.MsgUtil;
+import com.github.zuihou.common.util.DateUtil;
 import com.github.zuihou.context.BaseContextHandler;
 import com.github.zuihou.database.mybatis.conditions.query.LbqWrapper;
 import com.github.zuihou.log.annotation.SysLog;
 import com.github.zuihou.tenant.entity.Productionresource;
 import com.github.zuihou.tenant.service.ProductionresourceService;
+import com.google.common.collect.Maps;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.compress.utils.Lists;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -24,9 +40,9 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.time.LocalDateTime;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -53,6 +69,18 @@ public class SynProductionStatus {
     private OrderService orderService;
     @Autowired
     private AAutoNodeLogService autoNodeLogService;
+    @Autowired
+    private TaskService taskService;
+    @Autowired
+    private TaskNodeService taskNodeService;
+    @Autowired
+    private StockInfoService stockInfoService;
+    @Autowired
+    private StorgeService storgeService;
+    @Autowired
+    private ProductionresourcePositionService productionresourcePositionService;
+    @Autowired
+    private MsgUtil msgUtil;
 
     @ApiOperation(value = "设备状态同步", notes = "设备状态同步")
     @PostMapping("/synProductionStatus")
@@ -99,9 +127,126 @@ public class SynProductionStatus {
         }
 
         // 状态变化重调度
-        if(!isAlarm && networkChanged){
+        if(!isAlarm && !networkChanged){
             //orderService.reschedulingPlanTasks();
+            this.taskSchedule();
         }
         return R.success();
     }
+
+    /**
+     * 上下料站任务权限自动调整
+     *
+     */
+    public void taskSchedule(){
+        LbqWrapper<com.github.zuihou.business.productionResourceCenter.entity.Productionresource> lbqWrapper = new LbqWrapper<com.github.zuihou.business.productionResourceCenter.entity.Productionresource>();
+        lbqWrapper.eq(com.github.zuihou.business.productionResourceCenter.entity.Productionresource::getStatus, "1").ne(com.github.zuihou.business.productionResourceCenter.entity.Productionresource::getOnlineStatus, "0").isNotNull(com.github.zuihou.business.productionResourceCenter.entity.Productionresource::getModeSpecification);
+        //获取全部加工在线的加工设备
+        List<com.github.zuihou.business.productionResourceCenter.entity.Productionresource> macProductionResources = productionresourceBizMapper.selectList(lbqWrapper);
+        //获取未处于加工状态的加工设备
+        List<com.github.zuihou.business.productionResourceCenter.entity.Productionresource> bizProductionResources = macProductionResources.stream().filter(item->item.getOnlineStatus().equals("1")).collect(Collectors.toList());
+
+        if(bizProductionResources.size()>0){
+            List<Long> macResourceIds = macProductionResources.stream().map(com.github.zuihou.business.productionResourceCenter.entity.Productionresource::getId).collect(Collectors.toList());
+            List<Long> resourceIds = bizProductionResources.stream().map(com.github.zuihou.business.productionResourceCenter.entity.Productionresource::getId).collect(Collectors.toList());
+            //获取线边库加工任务列表(模糊匹配舱体和框体线边库)
+            List<Long> storgeIds = storgeService.list(new LbqWrapper<Storge>().eq(Storge::getLockStatus, "1").like(Storge::getName, "T_库位")).stream().map(Storge::getId).collect(Collectors.toList());
+            //获取线边库零件编号
+            List<String> completeBatchNos = stockInfoService.list(new LbqWrapper<StockInfo>().eq(StockInfo::getGoodsType, "4").in(StockInfo::getStorgeId, storgeIds)).stream().map(StockInfo::getCompleteBatchNo).collect(Collectors.toList());
+            //获取线边库满足条件的节点
+            List<TaskNode> taskNodeList = completeBatchNos.size()>0 ? taskNodeService.list(new LbqWrapper<TaskNode>().eq(TaskNode::getExeStatus,"2").in(TaskNode::getTargetResourceId, macResourceIds).in(TaskNode::getCompleteBatchNo, completeBatchNos).eq(TaskNode::getNodeName, "放本序设备")) : Lists.newArrayList();
+            //获得线边库加工设备列表
+            //Map<Long, List<TaskNode>> taskNodeMap = taskNodeList.stream().filter(item-> resourceIds.contains(item.getTargetResourceId())).collect(Collectors.groupingBy(TaskNode::getResourceId,  LinkedHashMap::new, Collectors.toList()));
+
+            if(taskNodeList != null && taskNodeList.size() > 0) {
+                List<TTask> updatedTaskList = Lists.newArrayList();
+                List<TaskNode> updatedTaskNodeList = taskNodeList.stream().filter(item-> bizProductionResources.stream().anyMatch(productionresource->{
+                    //线边库节点的目标设备
+                    com.github.zuihou.business.productionResourceCenter.entity.Productionresource device = productionresourceBizMapper.selectById(item.getTargetResourceId());
+                    List targetList = productionresourcePositionService.getFreeProductionresourcePositionByIds(new String[]{productionresource.getId().toString()});
+                    item.setTargetResourceId(productionresource.getId());
+                    return device.getModeSpecification().equals(productionresource.getModeSpecification()) && targetList.size()>0 && !device.getId().equals(productionresource.getId());
+                })).collect(Collectors.toList());
+
+                // 执行任务和节点设备更新
+                if(updatedTaskNodeList.size()>0){
+                    TaskNode updatedNode = updatedTaskNodeList.get(0);
+                    //只默认取当前第一条任务
+                    TTask updatedTask = taskService.getById(updatedNode.getTaskId());
+                    com.github.zuihou.business.productionResourceCenter.entity.Productionresource targetDevice = productionresourceBizMapper.selectById(updatedNode.getTargetResourceId());
+                    //更新缓存中哈默上传文件路径IP信息
+                    if(targetDevice.getModeSpecification().equals("HEIDENHAIN")){
+                        String uploadInfo = msgUtil.redis_get(DemoLineConstant.DEMOLINE_HEIDENHAIN_FILE_URL+"_"+updatedTask.getId())!=null? msgUtil.redis_get(DemoLineConstant.DEMOLINE_HEIDENHAIN_FILE_URL+"_"+updatedTask.getId()).toString(): null;
+                        if(StringUtils.isNotEmpty(uploadInfo)){
+                            JSONObject jsonObject = JSONObject.parseObject(uploadInfo);
+                            jsonObject.put("url", targetDevice.getIp());
+                            msgUtil.redis_set(DemoLineConstant.DEMOLINE_HEIDENHAIN_FILE_URL+"_"+updatedTask.getId(), jsonObject.toJSONString(), 30, TimeUnit.DAYS);
+                        }
+                    }
+
+                    // 执行任务和节点设备更新
+                    if(updatedTask!=null && updatedTask.getResourceId() != null){
+                        updatedTask.setResourceId(updatedNode.getTargetResourceId());
+                        JSONObject dyChangedInfo = new JSONObject();
+                        List<TaskNode> taskNodes = taskNodeService.list(new LbqWrapper<TaskNode>().eq(TaskNode::getTaskId, updatedTask.getId()));
+                        //更新节点目的设备
+                        taskNodes.stream().forEach(taskNode->{
+                            if(null != taskNode.getTargetResourceId()){
+                                if(taskNode.getResourceId().equals(taskNode.getTargetResourceId())){
+                                    if(!dyChangedInfo.containsKey("fromResource")){
+                                        dyChangedInfo.put("fromResource", taskNode.getResourceId());
+                                    }
+                                    taskNode.setResourceId(updatedTask.getResourceId());
+                                }
+                                taskNode.setTargetResourceId(updatedTask.getResourceId());
+                            }
+                        });
+                        taskService.updateById(updatedTask);
+                        taskNodeService.updateBatchById(taskNodes);
+                        dyChangedInfo.put("toResource", updatedTask.getResourceId());
+                        dyChangedInfo.put("time", DateUtil.formatTime(new Date()));
+
+                        // 缓存数据更新
+                        //TaskNode currTaskNode = taskNodeService.getOne(new LbqWrapper<TaskNode>().eq(TaskNode::getTaskId,updatedTask.getId()).eq(TaskNode::getExeStatus,"2"));
+                        msgUtil.redis_set(DemoLineConstant.DEMOLINE_RESOURCE_DY_CHANGE +"_"+updatedTask.getId(), dyChangedInfo.toJSONString(), 1, TimeUnit.DAYS);
+                    }
+
+                }
+            }
+
+            //获取即将加工设备列表
+            List<TTask> tasks = taskService.list(new LbqWrapper<TTask>().eq(TTask::getStatus,"2").like(TTask::getProcedureName,"上料"));
+            Map<Long, List<TTask>> nextTaskMap = tasks.stream().map(item -> {
+                return taskService.getNNextTask(item, 1);
+            }).filter(item -> resourceIds.contains(item.getResourceId())).collect(Collectors.groupingBy(TTask::getResourceId, LinkedHashMap::new, Collectors.toList()));
+
+            if (!nextTaskMap.isEmpty() && nextTaskMap.size() > 0 ) {
+                //获取当前排产设备数量最少的加工设备
+                List<TTask> priorityTasks = nextTaskMap.entrySet().stream().map(m -> m.getValue()).min(Comparator.comparingInt(item -> {
+                    return item.size();
+                })).get();
+
+                List<TTask> maxTasks = nextTaskMap.entrySet().stream().map(m -> m.getValue()).max(Comparator.comparingInt(item -> {
+                    return item.size();
+                })).get();
+
+                //单一设备任务执行完成而设备排产数量超出空闲设备数量
+                if (priorityTasks.size() ==0 && maxTasks.size()>bizProductionResources.size()) {
+                    //设备无执行任务重排产
+                    orderService.reschedulingPlanTasks();
+                } else {
+                    //实时调整上料任务的优先级
+                    TTask priorityTask = priorityTasks.stream().sorted(Comparator.comparing(TTask::getPrority, Comparator.reverseOrder()).thenComparing(TTask::getProcedureOrder, Comparator.reverseOrder()).thenComparing(TTask::getExpectStartTime)).collect(Collectors.toList()).get(0);
+                    int procedureOrder = taskService.getOne(new LbqWrapper<TTask>().select(TTask::getProcedureOrder).eq(TTask::getResourceId, priorityTask.getResourceId()).orderByDesc(TTask::getProcedureOrder).last("limit 1")).getProcedureOrder();
+                    UpdateWrapper<TTask> updateWrapper = new UpdateWrapper<TTask>();
+                    TTask currTask = taskService.getNNextTask(priorityTask, -1);
+                    updateWrapper.lambda().eq(TTask::getId, currTask.getId()).set(TTask::getProcedureOrder, ++procedureOrder);
+                    taskService.update(null, updateWrapper);
+                }
+            }
+
+        }
+    }
+
+
 }

+ 5 - 0
imcs-admin-boot/imcs-business-controller/src/main/java/com/github/zuihou/business/controller/operationManagementCenter/OrderController.java

@@ -98,9 +98,13 @@ public class OrderController extends SuperController<OrderService, Long, Order,
         Order order = BeanUtil.toBean(data, Order.class);
 //        DateTimeFormatter timeDtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
         String[] planStatus = null;
+        String[] orderIds = null;
         if(StrUtil.isNotEmpty(order.getPlanStatus())){
             planStatus = order.getPlanStatus().split(",");
         }
+        if(StrUtil.isNotEmpty(data.getOrderIds())){
+            orderIds = data.getOrderIds().split(",");
+        }
 
         wrapper.like(Order::getOrderNo, order.getOrderNo())
                 .eq(Order::getOrderStatus, order.getOrderStatus())
@@ -115,6 +119,7 @@ public class OrderController extends SuperController<OrderService, Long, Order,
         wrapper.eq(Order::getSource,order.getSource())
                 .like(Order::getOrderName,order.getOrderName())
                 .in(Order::getPlanStatus,planStatus)
+                .in(Order::getId, orderIds)
                 .orderByDesc(Order::getPrority)
                 .orderByDesc(Order::getCreateTime);
         IPage<Order> ipage = baseService.pageList(page,order.getCustDesc(), wrapper);

+ 13 - 0
imcs-admin-boot/imcs-business-controller/src/main/java/com/github/zuihou/business/controller/operationManagementCenter/TaskController.java

@@ -249,4 +249,17 @@ public class TaskController extends SuperController<TaskService, Long, TTask, TT
         if(null == clampNo) return R.fail("数据传参有误");
         return R.success(baseService.getValidTrayCount(map));
     }
+
+    /**
+     * 判断节点是否配置入库节点
+     *  是:可以补充入库节点;否:已经配置入库节点
+     * @param map
+     * @return
+     */
+    @PostMapping("/checkStockNode")
+    public R checkStockNode(@RequestBody Map<String,Object> map) {
+        String taskNodeId = map.containsKey("taskNodeId")? map.get("taskNodeId").toString() : null;
+        if(null == taskNodeId) return R.fail("数据传参有误");
+        return R.success(baseService.checkStockNode(map));
+    }
 }

+ 6 - 0
imcs-admin-boot/imcs-business-controller/src/main/java/com/github/zuihou/business/controller/productionReadyCenter/BomProcedureVersionController.java

@@ -107,4 +107,10 @@ public class BomProcedureVersionController extends SuperController<BomProcedureV
         return success(baseService.getPreMeterialList(map));
     }
 
+    @ApiOperation(value = "复制工艺管理", notes = "复制工艺管理")
+    @PostMapping("/cloneProcedure")
+    public R<List<BomProcedureVersion>> cloneProcedure(@RequestBody BomProcedureVersion bean) {
+        return success(baseService.cloneProcedure(bean));
+    }
+
 }

+ 9 - 1
imcs-admin-boot/imcs-business-controller/src/main/java/com/github/zuihou/business/controller/productionResourceCenter/ZZoneController.java

@@ -193,6 +193,14 @@ public class ZZoneController extends SuperController<ZZoneService, Long, ZZone,
         return success(baseService.getYunjianResourceList(map));
     }
 
-
+    /**
+     * 质量中心示范线库位展示
+     * @return
+     */
+    @ApiOperation(value = "云箭时长处理展示", notes = "云箭时长处理展示")
+    @PostMapping("/getTimeSpanList")
+    public R<Map> getTimeSpanList(@RequestBody(required = false) Map map) {
+        return success(baseService.getTimeSpanList(map));
+    }
 
 }

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

@@ -161,4 +161,10 @@ public class OrderPageDTO implements Serializable {
     @TableField(exist = false)
     private String deliveryTime_ed;
 
+    /**
+     * 多订单查询
+     */
+    @TableField(exist = false)
+    private String orderIds;
+
 }

+ 6 - 0
imcs-admin-boot/imcs-business-entity/src/main/java/com/github/zuihou/business/productionReadyCenter/dto/BomProcedurePageDTO.java

@@ -110,4 +110,10 @@ public class BomProcedurePageDTO implements Serializable {
     @ApiModelProperty(value = "不合格直接下料(1-启用0-不启用)")
     private String directCuttingFlag;
 
+    /**
+     * 工序编号
+     */
+    @ApiModelProperty(value = "工序编号")
+    @Length(max = 6, message = "工序编号内容长度不能超过6")
+    private Integer opid;
 }

+ 7 - 0
imcs-admin-boot/imcs-business-entity/src/main/java/com/github/zuihou/business/productionReadyCenter/dto/BomProcedureSaveDTO.java

@@ -109,4 +109,11 @@ public class BomProcedureSaveDTO implements Serializable {
     @ApiModelProperty(value = "不合格直接下料(1-启用0-不启用)")
     private String directCuttingFlag;
 
+    /**
+     * 工序编号
+     */
+    @ApiModelProperty(value = "工序编号")
+    @Length(max = 6, message = "工序编号内容长度不能超过6")
+    private Integer opid;
+
 }

+ 7 - 0
imcs-admin-boot/imcs-business-entity/src/main/java/com/github/zuihou/business/productionReadyCenter/dto/BomProcedureUpdateDTO.java

@@ -113,4 +113,11 @@ public class BomProcedureUpdateDTO implements Serializable {
 
     @ApiModelProperty(value = "不合格直接下料(1-启用0-不启用)")
     private String directCuttingFlag;
+
+    /**
+     * 工序编号
+     */
+    @ApiModelProperty(value = "工序编号")
+    @Length(max = 6, message = "工序编号内容长度不能超过6")
+    private Integer opid;
 }

+ 7 - 0
imcs-admin-boot/imcs-business-entity/src/main/java/com/github/zuihou/business/productionReadyCenter/dto/BomProcedureVersionPageDTO.java

@@ -141,4 +141,11 @@ public class BomProcedureVersionPageDTO implements Serializable {
     @ApiModelProperty(value = "不合格直接下料(1-启用0-不启用)")
     private String directCuttingFlag;
 
+    /**
+     * 工序编号
+     */
+    @ApiModelProperty(value = "工序编号")
+    @Length(max = 6, message = "工序编号内容长度不能超过6")
+    private Integer opid;
+
 }

+ 7 - 0
imcs-admin-boot/imcs-business-entity/src/main/java/com/github/zuihou/business/productionReadyCenter/dto/BomProcedureVersionSaveDTO.java

@@ -140,4 +140,11 @@ public class BomProcedureVersionSaveDTO implements Serializable {
     @ApiModelProperty(value = "不合格直接下料(1-启用0-不启用)")
     private String directCuttingFlag;
 
+    /**
+     * 工序编号
+     */
+    @ApiModelProperty(value = "工序编号")
+    @Length(max = 6, message = "工序编号内容长度不能超过6")
+    private Integer opid;
+
 }

+ 7 - 0
imcs-admin-boot/imcs-business-entity/src/main/java/com/github/zuihou/business/productionReadyCenter/dto/BomProcedureVersionUpdateDTO.java

@@ -144,4 +144,11 @@ public class BomProcedureVersionUpdateDTO implements Serializable {
 
     @ApiModelProperty(value = "不合格直接下料(1-启用0-不启用)")
     private String directCuttingFlag;
+
+    /**
+     * 工序编号
+     */
+    @ApiModelProperty(value = "工序编号")
+    @Length(max = 6, message = "工序编号内容长度不能超过6")
+    private Integer opid;
 }

+ 9 - 2
imcs-admin-boot/imcs-business-entity/src/main/java/com/github/zuihou/business/productionReadyCenter/entity/BomProcedure.java

@@ -302,13 +302,19 @@ public class BomProcedure extends Entity<Long> {
     private String randomCheckPrograme;
 
 
-
+    /**
+     * 工序编号
+     */
+    @ApiModelProperty(value = "工序编号")
+    @TableField("opid")
+    @Excel(name = "排序")
+    private Integer opid;
 
 
     @Builder
     public BomProcedure(Long id, LocalDateTime createTime, Long createUser, LocalDateTime updateTime, Long updateUser, 
                     String no, String name, String type, Long bomId, String auditStatus, 
-                    Float prepareWorkhours, String content, Float ratedWorkhours, String keyFlag,Long versionId) {
+                    Float prepareWorkhours, String content, Float ratedWorkhours, String keyFlag,Long versionId, Integer opid) {
         this.id = id;
         this.createTime = createTime;
         this.createUser = createUser;
@@ -324,6 +330,7 @@ public class BomProcedure extends Entity<Long> {
         this.ratedWorkhours = ratedWorkhours;
         this.keyFlag = keyFlag;
         this.versionId = versionId;
+        this.opid = opid;
     }
 
 }

+ 9 - 2
imcs-admin-boot/imcs-business-entity/src/main/java/com/github/zuihou/business/productionReadyCenter/entity/BomProcedureVersion.java

@@ -312,13 +312,19 @@ public class BomProcedureVersion extends Entity<Long> {
     @Excel(name = "备注")
     private String remark;
 
-
+    /**
+     * 工序编号
+     */
+    @ApiModelProperty(value = "工序编号")
+    @TableField("opid")
+    @Excel(name = "排序")
+    private Integer opid;
 
     @Builder
     public BomProcedureVersion(Long id, LocalDateTime createTime, Long createUser, LocalDateTime updateTime, Long updateUser, 
                     String no, String name, String type, Long versionId, String auditStatus, 
                     Float prepareWorkhours, String content, Float ratedWorkhours, String keyFlag, Long bomId,Integer sort,String meterialConf,
-                               String trayConf,String programConf,String programTest ) {
+                               String trayConf,String programConf,String programTest, Integer opid ) {
         this.id = id;
         this.createTime = createTime;
         this.createUser = createUser;
@@ -339,6 +345,7 @@ public class BomProcedureVersion extends Entity<Long> {
         this.trayConf = trayConf;
         this.programConf = programConf;
         this.programTest = programTest;
+        this.opid = opid;
     }
 
 }

+ 15 - 0
imcs-admin-boot/imcs-common/src/main/java/com/github/zuihou/common/util/DateUtil.java

@@ -477,6 +477,21 @@ public class DateUtil {
 		return day;
 	}
 
+	//日期差值
+	public static long minuteDiff(String startTime, String endTime) throws ParseException {
+		// 按照传入的格式生成一个simpledateformate对象
+		SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		//long nd = 1000 * 24 * 60 * 60;// 一天的毫秒数
+		//long nh = 1000*60*60;//一小时的毫秒数
+		 long nm = 1000*60;//一分钟的毫秒数
+		// long ns = 1000;//一秒钟的毫秒数
+		long diff;
+		// 获得两个时间的毫秒时间差异
+		diff = sd.parse(endTime).getTime() - sd.parse(startTime).getTime();
+		long minute = diff / nm;// 计算差多少小时
+		return minute;
+	}
+
     /**
      * 获取某月的天数
      * @param date