Bladeren bron

后台功能处理

oyq28 6 maanden geleden
bovenliggende
commit
dc43261a09
15 gewijzigde bestanden met toevoegingen van 214 en 154 verwijderingen
  1. 6 2
      imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/mq/TaskWorkNode.java
  2. 8 16
      imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/operationManagementCenter/service/impl/TaskNodeServiceImpl.java
  3. 1 0
      imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/productionResourceCenter/service/impl/AsyncServiceImpl.java
  4. 6 0
      imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/productionResourceCenter/service/impl/MachineNodeServiceImpl.java
  5. 1 1
      imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/productionResourceCenter/service/impl/RobotNodeServiceImpl.java
  6. 84 70
      imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/statisticalAnalysis/impl/ProductLinePerformanceServiceImpl.java
  7. 4 1
      imcs-admin-boot/imcs-business-biz/src/main/resources/mapper_business/base/operationManagementCenter/TWorkpieceMapper.xml
  8. 2 0
      imcs-admin-boot/imcs-business-biz/src/main/resources/mapper_business/base/productionReadyCenter/AAutoNodeLogMapper.xml
  9. 1 0
      imcs-admin-boot/imcs-business-biz/src/main/resources/mapper_business/base/productionReadyCenter/MMeterialReceiveLogMapper.xml
  10. 61 57
      imcs-admin-boot/imcs-business-biz/src/main/resources/mapper_business/base/statisticalAnalysis/ProductLinePerformanceMapper.xml
  11. 25 0
      imcs-admin-boot/imcs-business-controller/src/main/java/com/github/zuihou/business/controller/operationManagementCenter/ToolbarController.java
  12. 2 7
      imcs-admin-boot/imcs-business-controller/src/main/java/com/github/zuihou/business/controller/statisticalAnalysis/ProductLinePerformanceController.java
  13. 3 0
      imcs-admin-boot/imcs-business-entity/src/main/java/com/github/zuihou/business/operationManagementCenter/entity/TaskNode.java
  14. 4 0
      imcs-admin-boot/imcs-tenant-entity/src/main/java/com/github/zuihou/tenant/dto/ProductDto.java
  15. 6 0
      imcs-admin-boot/imcs-tenant-entity/src/main/java/com/github/zuihou/tenant/vo/DeviceResourceDetailVo.java

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

@@ -262,6 +262,7 @@ public class TaskWorkNode {
                 //多产品搬运类型
                 String carryType = jsonObject.getString("carryType");
 
+                /*
                 String queueName = "device.queue." + BizConstant.MQ_GLOBAL_EXCEPTION;
 
                 if (consumerQueue.equals(queueName)) {
@@ -286,6 +287,7 @@ public class TaskWorkNode {
                     //throw new RuntimeException("全局通知异常");
                     return;
                 }
+                 */
                 logger.info("=======================" + taskNodeId);
 
                 //
@@ -404,7 +406,9 @@ public class TaskWorkNode {
 
                     //运行条件验证
                     conMap = checkCon(taskNode, tTask, queryMap);
-                    //conMap.put("result", true);
+                    if(conMap.containsKey("dirty")){
+                        return;
+                    }
                     logger.info("节点{}检查资源返回{}", taskNode.getId(), conMap);
                     msgUtil.redis_set_map(CacheKey.TASK_CURRENT_NODE_CONDITION + "_" + taskNode.getId(), conMap);
 
@@ -555,7 +559,7 @@ public class TaskWorkNode {
             //插入执行日志
             e.printStackTrace();
             logger.warn("节点{},逻辑出现异常:{}", taskNode.getId(), e.getMessage());
-            log.setStatus("0").setExeResult("0").setManual("1").setFeedback("节点" + taskNode.getId() + "异常:" + conMap.get("resultmsg") + ":" + e.getMessage());
+            log.setStatus("0").setExeResult("0").setManual("1").setFeedback("节点" + taskNode.getId() + "异常:" + e.getMessage());
             //插入执行日志
             //autoNodeLogMapper.updateAllById(log);
 

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

@@ -2290,26 +2290,18 @@ public class TaskNodeServiceImpl extends SuperServiceImpl<TaskNodeMapper, TaskNo
             return R.success("");
         }
         if (DemoLineConstant.DEMOLINE_STOCK_TYPE_METERIAL_CK.equals(stockType)) {
-            List<BomProcedureMeterial> meterialList =
+            List<BomProcedureMeterial> materialList =
                     bomProcedureMeterialService.list(Wraps.<BomProcedureMeterial>lbQ().eq(BomProcedureMeterial::getProcedureId,
                             task.getProcedureId()));
             // 毛料出库
-            if (meterialList != null && meterialList.size() > 0) {
-
-                //List<StockInfo> trayList = stockInfoService.list(new LbqWrapper<StockInfo>().eq(StockInfo::getStorgeId, ));
-                R<String> ckresult = stockInfoService.meterialStockOut(meterialList.get(0),
+            if (materialList != null && materialList.size() > 0) {
+                R<String> ckresult = stockInfoService.meterialStockOut(materialList.get(0),
                         Long.parseLong(srcStorgeId), task.getCompleteBatchNo());
-
-                List<BomProcedureTray> trayList =
-                        procedureTrayService.list(Wraps.<BomProcedureTray>lbQ().eq(BomProcedureTray::getProcedureId,
-                                task.getProcedureId()).orderByAsc(BomProcedureTray::getBizType));
-                if (trayList != null && trayList.size() > 0) {
-                    //毛料出库 清空子盘工装的批次信息
-                    List<StockInfo> stockInfoList = this.getConnectTray(trayList, currWorkpiece, srcStorgeId);
-                    stockInfoList.stream().forEach(stockInfo -> {
-                        stockInfo.setCompleteBatchNo("");
-                    });
-                    stockInfoService.updateBatchById(stockInfoList);
+            }else{
+                //零件信息无法获取直接删除零件库位
+                StockInfo materialInfo = stockInfoService.getOne(new LbqWrapper<StockInfo>().eq(StockInfo::getStorgeId, srcStorgeId).eq(StockInfo::getCompleteBatchNo, task.getCompleteBatchNo()).eq(StockInfo::getGoodsType,"4").last("LIMIT 1"));
+                if(materialInfo!=null){
+                    stockInfoService.delete(materialInfo);
                 }
             }
             return R.success("");

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

@@ -38,6 +38,7 @@ public class AsyncServiceImpl  implements AsyncService {
         // 当上传不成功进行抛错处理
         if(!JSONObject.parseObject(mono.block().toString()).getBoolean("result")){
             msgUtil.redis_del("ApplyFeeding_"+ taskNodeId);
+            msgUtil.createWarnLog("节点"+taskNodeId+"上料申请执行失败,请检查文件路径", "ApplyFeedingError");
             return Boolean.FALSE;
         }
         return Boolean.TRUE;

+ 6 - 0
imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/productionResourceCenter/service/impl/MachineNodeServiceImpl.java

@@ -335,6 +335,12 @@ public class MachineNodeServiceImpl implements NodeOperationService {
                     } catch (InterruptedException e) {
                         e.printStackTrace();
                     }
+//                    Object startNCProgram = msgUtil.redis_get("StartNCProgram_"+ taskNode.getId());
+//                    if(!ObjectUtil.isEmpty(startNCProgram)){
+//                        map.put("result", false);
+//                        map.put("dirty", true);
+//                        return map;
+//                    }
                     //当前执行数量
                     List<BomProcedureProgram> procedureProgramList = bomProcedureProgramMapper.selectList(Wraps.<BomProcedureProgram>lbQ().eq(BomProcedureProgram::getProcedureId, task.getProcedureId()));
                     JSONObject data = new JSONObject();

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

@@ -417,7 +417,7 @@ public class RobotNodeServiceImpl implements NodeOperationService {
         //新增是否替换工装
         //if((taskNode.getCompleteBatchSort()==2 && taskNode.getNodeType().equals("4"))||(taskNode.getPrority()==4 && taskNode.getNodeType().equals("4"))){
         boolean getCondition = taskNode.getNodeType().equals("4") && (taskNode.getCompleteBatchSort()==2 || taskNode.getPrority()==4) ;
-        boolean checkCondition = taskNode.getNodeName().indexOf("立库取")>-1;
+        boolean checkCondition = taskNode.getNodeName().indexOf("立库取")>-1 || taskNode.getNodeName().indexOf("取放目的位置")>-1;
         if(getCondition || checkCondition){
                 // 判断是否是单线单独运行
             if(currentOrder.getSingleTaskFlag().equals("1")){

+ 84 - 70
imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/statisticalAnalysis/impl/ProductLinePerformanceServiceImpl.java

@@ -36,6 +36,7 @@ import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 /**
  * <p>
@@ -66,10 +67,15 @@ public class ProductLinePerformanceServiceImpl extends SuperCacheServiceImpl<Pro
         IPage<TaskNode> taskNodeIPage = baseMapper.pageList(page, wrapper, new DataScope());
         List<TaskNode> records = taskNodeIPage.getRecords();
         records.forEach(item->{
+            /*
             if (item.getEndTime() != null && item.getStartTime() != null){
                 String datePoor = DateUtil.getDatePoor(item.getEndTime(), item.getStartTime());
                 item.setStatisticalHours(datePoor);
-            }
+            } */
+            float values = Float.valueOf(item.getStatisticalHours());
+            int hours = (int)Math.floor(values);
+            int minutes = Math.round((values - hours)*60);
+            item.setStatisticalHours(String.format("%d小时%d分钟", hours, minutes));
         });
         taskNodeIPage.setRecords(records);
         return taskNodeIPage;
@@ -79,10 +85,14 @@ public class ProductLinePerformanceServiceImpl extends SuperCacheServiceImpl<Pro
     public List<TaskNode> queryOperatorDetailPerformance(TaskNode taskNode){
         List<TaskNode> taskNodes = baseMapper.queryOperatorDetailPerformance(taskNode);
         taskNodes.forEach(item->{
-            if (item.getEndTime() != null && item.getStartTime() != null){
-                String datePoor = DateUtil.getDatePoor(item.getEndTime(), item.getStartTime());
-                item.setStatisticalHours(datePoor);
-            }
+            float values = Float.valueOf(item.getStatisticalHours());
+            int hours = (int)Math.floor(values);
+            int minutes = Math.round((values - hours)*60);
+            item.setStatisticalHours(String.format("%d小时%d分钟", hours, minutes));
+            float dValues = Float.valueOf(item.getDelayHours());
+            int dHours = (int)Math.floor(dValues);
+            int dMinutes = Math.round((dValues - dHours)*60);
+            item.setDelayHours(String.format("%d小时%d分钟", dHours, dMinutes));
         });
         return taskNodes;
     }
@@ -339,24 +349,23 @@ public class ProductLinePerformanceServiceImpl extends SuperCacheServiceImpl<Pro
     }
 
     @Override
-    public Map<String,List<String>> resourceRate(Map<String, Object> params) {
+    public Map<String, List<String>> resourceRate(Map<String, Object> params) {
         String date = null;
-        if(Objects.isNull(params.get("date")) || StringUtils.isEmpty(params.get("date").toString())){
+        if (Objects.isNull(params.get("date")) || StringUtils.isEmpty(params.get("date").toString())) {
             //默认当天
             date = DateUtil.dateToString0(new Date(), "yyyy-MM-dd");
-        }else{
+        } else {
             date = params.get("date").toString();
         }
-        Date queryDate = cn.hutool.core.date.DateUtil.parse(date,"yyyy-MM-dd");
-        Date queryStartTime = cn.hutool.core.date.DateUtil.offsetHour(queryDate,-1);
-        Date queryEndTime = cn.hutool.core.date.DateUtil.offsetHour(queryDate,26);
-        params.put("startTime",DateUtil.dateToString0(queryStartTime, "yyyy-MM-dd HH:mm:ss"));
-        params.put("endTime",DateUtil.dateToString0(queryEndTime, "yyyy-MM-dd HH:mm:ss"));
-
+        Date queryDate = cn.hutool.core.date.DateUtil.parse(date, "yyyy-MM-dd");
+        Date queryStartTime = cn.hutool.core.date.DateUtil.offsetHour(queryDate, -1);
+        Date queryEndTime = cn.hutool.core.date.DateUtil.offsetHour(queryDate, 26);
+        params.put("startTime", DateUtil.dateToString0(queryStartTime, "yyyy-MM-dd HH:mm:ss"));
+        params.put("endTime", DateUtil.dateToString0(queryEndTime, "yyyy-MM-dd HH:mm:ss"));
 
         List<DeviceResourceDetailVo> deviceResourceDetailVos = baseMapper.resourceRate(params);
 
-        Map<String,List<String>> map = new HashMap<>();
+        Map<String, List<String>> map = new HashMap<>();
         List<String> hours = new ArrayList<>();
         List<String> rateList = new ArrayList<>();
 
@@ -364,80 +373,85 @@ public class ProductLinePerformanceServiceImpl extends SuperCacheServiceImpl<Pro
         //判断所选日期是否是当前日期
         int n = 0;
         Date nowDate = new Date();
-        if(Objects.isNull(params.get("date")) || StringUtils.isEmpty(params.get("date").toString()) || DateUtil.dateToString0(nowDate, "yyyy-MM-dd").equals( params.get("date").toString())){
+        if (Objects.isNull(params.get("date")) || StringUtils.isEmpty(params.get("date").toString()) || DateUtil.dateToString0(nowDate, "yyyy-MM-dd").equals(params.get("date").toString())) {
             String x = DateUtil.dateToString0(nowDate, "HH");
-            if(x.indexOf("0") == 0){
-                x = x.substring(x.indexOf("0"));
-            }
             n = Integer.parseInt(x);
-        }else{
+        } else {
             n = 24;
         }
 
-        if(CollectionUtil.isEmpty(deviceResourceDetailVos)){
-            for(int i=1;i<=n;i++){
-
-                String hour =  "";
-                if(i<10){
-                    hour =  "0" + i;
-                }else{
-                    hour = i + "";
-                }
-                hours.add(hour + "时");
-                rateList.add("0");
-            }
-        }else{
-            for(int i=1;i<=n;i++){
+        hours = IntStream.rangeClosed(0, n).boxed().map(item -> {
+            return item < 10 ? "0" + item.toString() : item.toString();
+        }).collect(Collectors.toList());
 
-                String hour =  "";
-                if(i<10){
-                    hour =  "0" + i;
-                }else{
-                    hour = i + "";
-                }
-                hours.add(hour + "时");
+        if (CollectionUtil.isEmpty(deviceResourceDetailVos)) {
+            String[] arrs = new String[n];
+            Arrays.fill(arrs, "0");
+            rateList = Arrays.asList(arrs);
+        } else {
+            Date startDate = DateUtil.stringToDate0(date + " 00:00:00", "yyyy-MM-dd HH:mm:ss");
 
-                String nowTime = date + " " + hour + ":00:00";
+            for (int i = 1; i <= n; i++) {
+                String nowTime = date + " " + hours.get(i) + ":00:00";
+                Date endDate = DateUtil.stringToDate0(nowTime, "yyyy-MM-dd HH:mm:ss");
 
-                Date endDate = cn.hutool.core.date.DateUtil.parse(nowTime,"yyyy-MM-dd HH:mm:ss");
-                Date startDate = cn.hutool.core.date.DateUtil.parse(date+" 00:00:00","yyyy-MM-dd HH:mm:ss");
                 long jgTime = 0;
-                for(DeviceResourceDetailVo deviceResourceDetailVo:deviceResourceDetailVos){
+                int expectTime = 0;
+                int realTime = 0;
+                int delayTime = 0;
+                for (DeviceResourceDetailVo deviceResourceDetailVo : deviceResourceDetailVos) {
                     Date startTime = deviceResourceDetailVo.getStartTime();
-
-                    Date endTime = null;
-                    if(Objects.isNull(deviceResourceDetailVo.getEndTime())){
-                        endTime = new Date();
-                    }else{
-                        endTime = deviceResourceDetailVo.getEndTime();
-                    }
-
-                    if((startDate.after(startTime) && startDate.after(endTime)) || (endDate.before(startTime) && endDate.before(endTime))){
-                        continue;
-                    }else{
-                        if(startDate.after(startTime) && startDate.before(endTime) && endDate.after(endTime)){
-                            jgTime += endTime.getTime() -  startDate.getTime();
-                        }else if(startDate.after(startTime) && endDate.before(endTime)){
-                            jgTime += endDate.getTime() -  startDate.getTime();
-                        }else if(endDate.after(startTime) && endDate.before(endTime)){
-                            jgTime += endDate.getTime() - startTime.getTime();
-                        }else if(endDate.after(startTime) && endDate.after(endTime) && startDate.before(startTime)){
-                            jgTime += endTime.getTime() - startTime.getTime();
-                        }else if(endDate.after(startTime) && endDate.before(endTime)){
-                            jgTime += endDate.getTime() - startTime.getTime();
-                        }
+                    Date endTime = Objects.isNull(deviceResourceDetailVo.getEndTime()) ? new Date() : deviceResourceDetailVo.getEndTime();
+                    // 定义两个时间区间:[事件区间] startDate~endDate;[参考区间] startTime~endTime
+                    // 先判断是否无重叠:事件区间完全在参考区间之前,或完全在参考区间之后
+                    if (endDate.before(startTime) || startDate.after(endTime)) {
+                        continue; // 无重叠,跳过
+                    } else {
+                        // 有重叠,计算重叠时长
+                        // 重叠区间的开始 = 两个区间的"较晚开始时间"
+                        long overlapStart = Math.max(startDate.getTime(), startTime.getTime());
+                        // 重叠区间的结束 = 两个区间的"较早结束时间"
+                        long overlapEnd = Math.min(endDate.getTime(), endTime.getTime());
+                        // 累加重叠时长(确保结束时间 >= 开始时间,避免负数)
+                        jgTime += Math.max(0, overlapEnd - overlapStart);
                     }
+                    expectTime += (int) Float.parseFloat(deviceResourceDetailVo.getExpectTime());
+                    realTime += (int) Float.parseFloat(deviceResourceDetailVo.getRealTime());
+                    delayTime += (realTime > 1.5 * expectTime) ? realTime - 1.5 * expectTime : 0;
                 }
 
                 BigDecimal jgBig = new BigDecimal(jgTime);
                 BigDecimal sumBig = new BigDecimal((endDate.getTime() - startDate.getTime()));
+                BigDecimal minutes = jgBig.divide(new BigDecimal(60000), 2, BigDecimal.ROUND_HALF_UP);
+                if (delayTime > 0) {
+//                    minutes 表示实际使用的分钟数
+                    minutes = minutes.subtract(new BigDecimal(delayTime));
+                }
+
+//                sumMinutes 表示总时间分钟数
+                BigDecimal sumMinutes = sumBig.divide(new BigDecimal(60000), 2, BigDecimal.ROUND_HALF_UP);
+                BigDecimal actualTimeRate;
+
+                // 检查sumMinutes是否为0,避免除以0的异常
+                if (sumMinutes.compareTo(BigDecimal.ZERO) == 0) {
+                    // 当总和为0时,可根据业务需求设置默认值,这里设为0
+                    actualTimeRate = BigDecimal.ZERO;
+                } else {
+                    // 正常计算百分比
+                    actualTimeRate = minutes.divide(sumMinutes, 2, BigDecimal.ROUND_HALF_UP)
+                            .multiply(new BigDecimal("100"));
+                }
+                // 若结果为负数,则设为0
+                if (actualTimeRate.compareTo(BigDecimal.ZERO) < 0) {
+                    actualTimeRate = BigDecimal.ZERO;
+                }
+                rateList.add(actualTimeRate.toString());
 
-                rateList.add(jgBig.divide(sumBig,2,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"");
             }
         }
 
-        map.put("hour",hours);
-        map.put("rate",rateList);
+        map.put("hour", hours);
+        map.put("rate", rateList);
 
         return map;
     }

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

@@ -51,8 +51,9 @@
             left join imcs_t_workpiece itw on ioo.id = itw.order_id
             left join imcs_tenant_productionresource itp on itp.id = itt.resource_id
         <where>
+            ioo.single_task_flag = '0'
         <if test=" vo.bomName != null and vo.bomName != ''">
-            itw.bom_name like concat('%', #{vo.bomName}, '%')
+            AND itw.bom_name like concat('%', #{vo.bomName}, '%')
         </if>
         <if test="vo.startTime != null and vo.startTime != ''">
             AND date_format(itt.start_time,'%y-%m-%d') &gt;= date_format(#{vo.startTime},'%y-%m-%d')
@@ -69,6 +70,7 @@
         select * from (
                           select ioo.order_no,
                                  ioo.remark,
+                                 ioo.product_num  as productNum,
                                  ipp.start_time                                                       as planStartTime,
                                  ipp.end_time                                                         as planEndTime,
                                  min(itt.start_time)                                                  as startTime,
@@ -80,6 +82,7 @@
                               left join imcs_p_plan ipp on ioo.order_no = ipp.order_no
                               left join imcs_t_task itt on ioo.order_no = itt.order_no
                               left join imcs_t_workpiece itw on ioo.order_no = itw.order_no
+                          where ioo.single_task_flag = '0'
                           group by ioo.order_no
                       ) t
         <where>

+ 2 - 0
imcs-admin-boot/imcs-business-biz/src/main/resources/mapper_business/base/productionReadyCenter/AAutoNodeLogMapper.xml

@@ -54,6 +54,7 @@
         aanl.id,
         aanl.start_storge,
         aanl.end_storge,
+        aanl.order_id,
         ittn.node_name as taskNodeName,-- 节点名称
         iss.lock_status,
         aanl.execute_time,-- 执行时间
@@ -81,6 +82,7 @@
         ORDER BY
         aanl.order_id DESC,
         ittn.complete_batch_no DESC,
+        aanl.execute_time DESC,
         aanl.create_time DESC,
         aanl.exe_status ASC,
         aanl.id DESC

+ 1 - 0
imcs-admin-boot/imcs-business-biz/src/main/resources/mapper_business/base/productionReadyCenter/MMeterialReceiveLogMapper.xml

@@ -61,6 +61,7 @@
         FROM
             imcs_m_meterial_receive_log l
             LEFT JOIN imcs_m_meterial m ON l.meterial_id = m.id
+            where l.is_del = '0' and m.is_del = '0'
         GROUP BY
             l.meterial_id
             LIMIT 3;

+ 61 - 57
imcs-admin-boot/imcs-business-biz/src/main/resources/mapper_business/base/statisticalAnalysis/ProductLinePerformanceMapper.xml

@@ -3,7 +3,8 @@
 <mapper namespace="com.github.zuihou.business.statisticalAnalysis.dao.ProductLinePerformanceMapper">
     <!-- 分页 -->
     <select id="pageList" resultType="com.github.zuihou.business.operationManagementCenter.entity.TaskNode">
-        SELECT tmp1.productionlineId,tmp1.productionlineName,tmp1.statisticalDate,tmp1.start_time,tmp1.end_time,SUM(TIMESTAMPDIFF(MINUTE, tmp1.start_time, tmp1.end_time) / 60) AS statisticalHours, tmp1.org_id FROM
+        SELECT tmp1.productionlineId,tmp1.productionlineName,tmp1.statisticalDate,tmp1.start_time,tmp1.end_time,SUM(
+        IF(TIMESTAMPDIFF(MINUTE,tmp1.start_time,tmp1.end_time)<![CDATA[ <= ]]>30,TIMESTAMPDIFF(MINUTE,tmp1.start_time, tmp1.end_time ), 0))/60 AS statisticalHours, tmp1.org_id FROM
         (SELECT
           izz.id AS productionlineId,
           izz.name AS productionlineName,
@@ -21,6 +22,7 @@
         AND c.id = d.task_id
         AND d.loading_user_id = e.id
         AND d.exe_status = '3'
+        AND ioo.single_task_flag = '0'
         AND d.loading_user_id IS NOT NULL) tmp1 ${ew.customSqlSegment} GROUP BY tmp1.statisticalDate,tmp1.productionlineId ORDER BY tmp1.productionlineId,tmp1.statisticalDate
     </select>
 
@@ -32,7 +34,8 @@
           date_format(d.start_time,'%Y-%m') AS statisticalDate,
           d.start_time,
           d.end_time,
-          SUM(TIMESTAMPDIFF(MINUTE, d.start_time,d.end_time) / 60) AS statisticalHours
+          SUM(IF(TIMESTAMPDIFF(MINUTE,d.start_time,d.end_time)>30,TIMESTAMPDIFF(MINUTE,d.start_time, d.end_time ), 0))/60 AS delayHours,
+          SUM(IF(TIMESTAMPDIFF(MINUTE,d.start_time,d.end_time)<![CDATA[ <= ]]>30,TIMESTAMPDIFF(MINUTE,d.start_time, d.end_time ), 0))/60 AS statisticalHours
         FROM imcs_base_300_0000.imcs_z_zone izz,
              imcs_base_300_0000.imcs_o_order ioo,
              imcs_base_300_0000.imcs_t_task c,
@@ -43,6 +46,7 @@
         AND c.id = d.task_id
         AND d.loading_user_id = e.id
         AND d.exe_status = '3'
+        AND ioo.single_task_flag = '0'
         AND d.loading_user_id IS NOT NULL and izz.id = #{productionlineId} and date_format(d.start_time,'%Y-%m') = #{statisticalDate} GROUP BY statisticalDate,d.loading_user_id order by e.name
     </select>
 
@@ -115,16 +119,16 @@
     <select id="procedureSum" resultType="com.github.zuihou.tenant.dto.ProcedureSumDto">
         select ioo.order_no,
                itw.bom_name,
-               count(itw.procedure_id) as totalNum,
-               sum(if(itw.is_end = 0 ,1,0)) as awaitNum,
-               sum(if(itw.is_end = 1 ,1,0)) as endNum,
-               sum(if(itw.test_result = 0 ,1,0)) as scrapNum
+               ioo.product_num as totalNum,
+               sum(if(itw.is_end = '0' ,1,0)) as awaitNum,
+               sum(if(itw.is_end = '1' ,1,0)) as endNum,
+               sum(if(itw.test_result = '0' ,1,0)) as scrapNum
         from imcs_o_order ioo
-        left join imcs_t_task itt on ioo.id = itt.order_id
         left join imcs_t_workpiece itw on ioo.id = itw.order_id
         <where>
+            ioo.single_task_flag='0'
         <if test=" vo.bomName != null and vo.bomName != ''">
-            itw.bom_name like concat('%', #{vo.bomName}, '%')
+            and itw.bom_name like concat('%', #{vo.bomName}, '%')
         </if>
         </where>
         group by itw.order_no, itw.bom_name
@@ -135,14 +139,13 @@
         select * from (
                           select  ioo.order_no,
                                   itw.bom_name,
-                                  itt.procedure_name,
-                                  count(itw.procedure_id)                     as totalNum,
-                                  sum(if(itw.is_end = 0 ,1,0)) as awaitNum,
-                                  sum(if(itw.is_end = 1 ,1,0)) as endNum,
-                                  sum(if(itw.test_result = 0 ,1,0)) as scrapNum ,
-                                  itt.procedure_sort
+                                  ibbp.name as procedureName,
+                                  count(itw.procedure_id)    as totalNum,
+                                  sum(if(itw.is_end = '0' ,1,0)) as awaitNum,
+                                  sum(if(itw.is_end = '1' ,1,0)) as endNum,
+                                  sum(if(itw.test_result = '0' ,1,0)) as scrapNum ,
+                                  ibbp.sort  as procedure_sort
                           from imcs_o_order ioo
-                                   left join imcs_t_task itt on ioo.id = itt.order_id
                                    left join imcs_t_workpiece itw on ioo.id = itw.order_id
                                    left join imcs_b_bom_procedure ibbp on ibbp.bom_id = itw.bom_id
                           <where>
@@ -150,7 +153,7 @@
                                   ioo.order_no like concat('%', #{params.orderNo}, '%')
                               </if>
                           </where>
-                          group by itw.order_no, itw.bom_name, itt.procedure_name
+                          group by itw.order_no, itw.bom_name, ibbp.name
                       ) t
         order by t.procedure_sort;
     </select>
@@ -277,48 +280,49 @@
 
     <select id="resourceRate" resultType="com.github.zuihou.tenant.vo.DeviceResourceDetailVo">
         select
-            t.resourceId,
-            t.resourceName,
-            t.resourceCode,
-            t.bomName,
-            t.start_time,
-            t.end_time,
-            t.startHour,
-            t.endHour
+        t.resourceId,
+        t.resourceName,
+        t.bomName,
+        t.nodeEndTime as startTime,
+        t.taskEndTime as endTime,
+        t.startHour,
+        t.endHour,
+        t.expectTime,
+        t.realTime
         from(
-            SELECT
-            itp.id AS resourceId,
-            itp.NAME AS resourceName,
-            itp.code as resourceCode,
-            ibb.NAME AS bomName,
-            c.procedure_no,
-            (select itn.end_time from imcs_base_300_0000.imcs_t_task_node itn where itn.task_id = c.id and itn.node_name =
-            '放本序设备') as start_time,
-            c.end_time,
-            DATE_FORMAT((select itn.end_time from imcs_base_300_0000.imcs_t_task_node itn where itn.task_id = c.id and
-            itn.node_name = '放本序设备'),'%H') as startHour,
-            DATE_FORMAT(c.end_time,'%H') as endHour
-            FROM
-            imcs_base_300_0000.imcs_z_zone a,
-            imcs_base_300_0000.imcs_z_zone_productionresource b,
-            imcs_base_300_0000.imcs_tenant_productionresource itp,
-            imcs_base_300_0000.imcs_t_task c,
-            imcs_base_300_0000.imcs_b_bom ibb
-            WHERE
-            a.id = b.zone_id
-            AND b.resource_id = c.resource_id
-            AND b.resource_id = itp.id
-            AND c.bom_id = ibb.id
-            AND c.start_time IS NOT NULL
-            AND c.`status` in (2,3)
-            AND c.procedure_no LIKE 'OP%0'
-            AND c.end_time BETWEEN #{params.startTime} and #{params.endTime}
-            <if test="params.resourceId !=null and params.resourceId !=''">
-                AND b.resource_id = #{params.resourceId}
-            </if>
-            ) t
-    where t.start_time is not null
-    order by t.start_time ASC
+        SELECT
+        itp.id AS resourceId,
+        itp.NAME AS resourceName,
+        ibb.NAME AS bomName,
+        c.procedure_no,
+        n.end_time as nodeEndTime,
+        c.end_time as taskEndTime,
+        Round(p.rated_workHours) AS expectTime,
+        TIMESTAMPDIFF(MINUTE, n.end_time, ifnull(c.end_time, Now())) AS realTime,
+        DATE_FORMAT(n.end_time, '%H') as startHour,
+        DATE_FORMAT(c.end_time, '%H') as endHour
+        FROM
+        imcs_base_300_0000.imcs_tenant_productionresource itp,
+        imcs_base_300_0000.imcs_t_task c,
+        imcs_base_300_0000.imcs_b_bom_procedure p,
+        imcs_base_300_0000.imcs_t_task_node n,
+        imcs_base_300_0000.imcs_b_bom ibb
+        WHERE
+        itp.id = c.resource_id
+        AND c.bom_id = ibb.id
+        AND c.procedure_id = p.id
+        AND n.exe_status='3'
+        AND c.start_time IS NOT NULL
+        AND c.`status` in (2,3)
+        AND n.node_name = '放本序设备'
+        AND c.id = n.task_id
+        AND c.end_time BETWEEN #{params.startTime} and #{params.endTime}
+        <if test="params.resourceId !=null and params.resourceId !=''">
+            AND c.resource_id = #{params.resourceId}
+        </if>
+        ) t
+        where t.nodeEndTime is not null
+        order by t.nodeEndTime ASC
     </select>
 
 

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

@@ -112,6 +112,10 @@ public class ToolbarController {
     private OrderTaskService orderTaskService;
     @Autowired
     private AAutoNodeLogService autoNodeLogService;
+    @Autowired
+    private PlanProductService planProductService;
+    @Autowired
+    private OrderProductService orderProductService;
 
 
     @ApiOperation(value = "更新库位位置", notes = "更新库位位置")
@@ -834,6 +838,27 @@ public class ToolbarController {
         return R.success();
     }
 
+    @ApiOperation(value = "强制删除订单", notes = "强制删除订单")
+    @PostMapping("/delOrder")
+    public R delOrder(@RequestBody Map data) {
+        BaseContextHandler.setTenant("0000");
+        String orderId = data.containsKey("orderId")? data.get("orderId").toString() : null;
+        if(StringUtils.isEmpty(orderId)) return R.fail("数据传参为空");
+        Order order = orderService.getById(orderId);
+        if(null==order) return R.fail("订单数据不能为空");
+
+        taskNodeService.remove(new LbqWrapper<TaskNode>().eq(TaskNode::getOrderId, orderId));
+        taskService.remove(new LbqWrapper<TTask>().eq(TTask::getOrderId, orderId));
+        planService.remove(new LbqWrapper<Plan>().eq(Plan::getOrderId, orderId));
+        planProductService.remove(new LbqWrapper<PlanProduct>().eq(PlanProduct::getOrderId, orderId));
+        orderProductService.remove(new LbqWrapper<OrderProduct>().eq(OrderProduct::getOrderId, orderId));
+        workpieceService.remove(new LbqWrapper<TWorkpiece>().eq(TWorkpiece::getOrderId, orderId));
+        orderTaskService.remove(new LbqWrapper<OrderTask>().eq(OrderTask::getOrderId, orderId));
+        orderService.removeById(orderId);
+
+        return R.success();
+    }
+
     @ApiOperation(value = "异常任务处理", notes = "异常任务处理")
     @PostMapping("/manualTask")
     public R manualTask(@RequestBody Map data) {

+ 2 - 7
imcs-admin-boot/imcs-business-controller/src/main/java/com/github/zuihou/business/controller/statisticalAnalysis/ProductLinePerformanceController.java

@@ -57,17 +57,12 @@ public class ProductLinePerformanceController extends SuperController<ProductLin
         LbqWrapper<TaskNode> wrapper = wrap.lambda();
         String statisticalBeginDate;
         String statisticalEndDate;
-        if(null == data.getStatisticalDate()){
-            Calendar now = Calendar.getInstance();
-            now.add(Calendar.MONTH,-3);
-            statisticalBeginDate = com.github.zuihou.common.util.DateUtil.beginMonthTime(now.getTime());
-            statisticalEndDate = com.github.zuihou.common.util.DateUtil.endMonthTime(new Date());
-        }else{
+        if(null != data.getStatisticalDate()){
             Date SearchDate = com.github.zuihou.common.util.DateUtil.stringToDate0(data.getStatisticalDate(),"yyyy-MM");
             statisticalBeginDate = com.github.zuihou.common.util.DateUtil.beginMonthTime(SearchDate);
             statisticalEndDate = com.github.zuihou.common.util.DateUtil.endMonthTime(SearchDate);
+            wrapper.between(TaskNode::getStartTime,DateUtil.stringToDate7(statisticalBeginDate),DateUtil.stringToDate7(statisticalEndDate)).between(TaskNode::getEndTime,DateUtil.stringToDate7(statisticalBeginDate),DateUtil.stringToDate7(statisticalEndDate));
         }
-        wrapper.between(TaskNode::getStartTime,DateUtil.stringToDate7(statisticalBeginDate),DateUtil.stringToDate7(statisticalEndDate)).between(TaskNode::getEndTime,DateUtil.stringToDate7(statisticalBeginDate),DateUtil.stringToDate7(statisticalEndDate));
         page.orders().remove(0);
         baseService.pageList(page, wrapper);
     }

+ 3 - 0
imcs-admin-boot/imcs-business-entity/src/main/java/com/github/zuihou/business/operationManagementCenter/entity/TaskNode.java

@@ -430,6 +430,9 @@ public class TaskNode extends Entity<Long> {
     @TableField(exist = false)
     private String statisticalHours;
 
+    @TableField(exist = false)
+    private String delayHours;
+
     @ApiModelProperty(value="统计月")
     @TableField(exist = false)
     private String statisticalDate;

+ 4 - 0
imcs-admin-boot/imcs-tenant-entity/src/main/java/com/github/zuihou/tenant/dto/ProductDto.java

@@ -62,4 +62,8 @@ public class ProductDto {
     @ApiModelProperty(value = "说明")
     @Excel(name = "说明" , width = 35)
     private String remark;
+
+    @ApiModelProperty(value = "零件数量")
+    @Excel(name = "零件数量" , width = 10)
+    private Integer productNum;
 }

+ 6 - 0
imcs-admin-boot/imcs-tenant-entity/src/main/java/com/github/zuihou/tenant/vo/DeviceResourceDetailVo.java

@@ -53,4 +53,10 @@ public class DeviceResourceDetailVo {
 
     @ApiModelProperty(value = "报警时长")
     private float alarmHour;
+
+    @ApiModelProperty(value = "理论加工时间")
+    private String expectTime;
+
+    @ApiModelProperty(value = "实际加工时间")
+    private String realTime;
 }