From ec8cf418f6dc3958aa7b5f524a7bf8f6edf62e07 Mon Sep 17 00:00:00 2001
From: zhanghl <253316343@qq.com>
Date: 星期二, 29 四月 2025 11:32:37 +0800
Subject: [PATCH] 气体管路-bak 计算工时

---
 aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsGasPipingRouteStatServiceImpl.java |  199 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 199 insertions(+), 0 deletions(-)

diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsGasPipingRouteStatServiceImpl.java b/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsGasPipingRouteStatServiceImpl.java
index 9c7677c..53070f7 100644
--- a/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsGasPipingRouteStatServiceImpl.java
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsGasPipingRouteStatServiceImpl.java
@@ -1,5 +1,6 @@
 package com.aps.core.service.impl;
 
+import cn.hutool.core.util.IdUtil;
 import com.alibaba.fastjson2.JSONObject;
 import com.aps.common.core.utils.DateUtils;
 import com.aps.common.core.utils.uuid.IdUtils;
@@ -22,6 +23,7 @@
 import org.apache.poi.xssf.streaming.SXSSFWorkbook;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
@@ -519,4 +521,201 @@
 
         return yearMonths;
     }
+
+    @Override
+    public void saveGasPipingProcessStat(){
+        try {
+            String batchNum = IdUtils.fastSimpleUUID();
+            List<ApsGasPipingRouteStat> tempList = apsGasPipingRouteStatMapper.queryTempStat();
+            Map<String, List<ApsGasPipingRouteStat>> groupByOrderNo = tempList.stream().collect(groupingBy(ApsGasPipingRouteStat::getWorkOrderNo));
+            Boolean hasBefore = false;
+            LocalDateTime now = LocalDateTime.now();
+            for (Map.Entry<String, List<ApsGasPipingRouteStat>> entry : groupByOrderNo.entrySet()) {
+                List<ApsGasPipingRouteStat> statPerOrder = entry.getValue();
+                /*num 涓烘牴鎹畬宸ユ椂闂存帓搴忓嚭鐨勫簭鍙凤紝鎸夋鎺掑簭锛屽彲淇濊瘉鏄寜瀹屽伐鏃堕棿鍊掑彊鎺掑垪*/
+                statPerOrder.sort((a, b)->a.getNum().compareTo(b.getNum()));
+                ApsGasPipingRouteStat last=null;
+                for (int i = 0; i <statPerOrder.size(); i++) {
+                    ApsGasPipingRouteStat stat = statPerOrder.get(i);
+                    stat.setId(IdUtils.fastSimpleUUID());
+                    stat.setBatchNumber(batchNum);
+                    stat.setCreateBy(SecurityUtils.getUsername());
+                    stat.setWarning(false);
+                    if(i==0){
+                        Date orderPlanEndDay = stat.getOrderPlanEndDay();
+                        LocalDateTime transLocalDateTime = transLocalDateTime(orderPlanEndDay);
+                        LocalTime endOfDay = LocalTime.of(23, 59, 59);
+                        LocalDateTime orderPlanEndDayLocalDateTime =  LocalDateTime.of( transLocalDateTime.toLocalDate(), endOfDay);
+                        if(orderPlanEndDayLocalDateTime.isBefore(now)){
+                            hasBefore = true;
+                            stat.setWarning(true);
+                            stat.setProcessPlanEndDay(transDate(now));
+                            stat.setProcessPlanStartDay(transDate(now));
+                        }else {
+                            /*璁″垝瀹屽伐鏃�=閽i噾璁″垝宸ュ崟瀹屾垚鏃堕棿*/
+                            stat.setProcessPlanEndDay(transDate(orderPlanEndDayLocalDateTime));
+                            /*璁″垝寮�宸ユ棩=閽i噾璁″垝宸ュ崟瀹屾垚鏃堕棿 -  宸ュ簭鎬诲伐鏃�*/
+                            long seconds = stat.getProcessTotalTime().multiply(new BigDecimal(60)).multiply(new BigDecimal(60)).longValue();
+                            LocalDateTime lastPlanStartDt = orderPlanEndDayLocalDateTime.minusSeconds(seconds);
+                            if(lastPlanStartDt.isBefore(now)){
+                                hasBefore = true;
+                                stat.setProcessPlanStartDay(transDate(now));
+                            }else {
+                                stat.setProcessPlanStartDay(transDate(lastPlanStartDt));
+                            }
+                        }
+                    }
+                    /*褰撳伐鑹哄伐搴忓彿 >= 宸ュ崟褰撳墠宸ュ簭 浠h〃鏄湭鏉ュ伐搴忥紝鎵嶈繘琛岃鍒掑紑宸ユ棩 鍜岃鍒掑畬宸ユ棩鐨勮绠�
+                     * 褰撳伐鑹哄伐搴忓彿 < 宸ュ崟褰撳墠宸ュ簭  杩囧幓宸ュ簭锛屼笉杩涜璁$畻
+                     * */
+                    if( stat.getRouteProcessNumber().compareTo(stat.getCurrentProcessNumber())>=0){
+                        /*鍊掓帓鏃� 涓嬩竴閬撳伐搴忓瓨鍦� 姣斿綋鍓嶆椂闂村皬鐨勮鍒掓椂闂达紝鍒欏綋鍓嶈鍒掑紑濮嬪拰缁撴潫鏃堕棿閮芥槸褰撳墠鏃堕棿*/
+                        if(hasBefore){
+                            stat.setWarning(true);
+                            stat.setProcessPlanEndDay(transDate(now));
+                            stat.setProcessPlanStartDay(transDate(now));
+                        }else{
+                            /*涓嬩竴閬撳伐搴忚鍒掓椂闂撮兘姝e父鏃讹紝*/
+                            if (last != null) {
+                                /*褰撳墠宸ュ簭缁撴潫鏃堕棿=涓嬩竴閬撳伐搴忕殑寮�濮嬫椂闂�*/
+                                stat.setProcessPlanEndDay(last.getProcessPlanStartDay());
+                                /*寮�濮嬫椂闂�=缁撴潫鏃堕棿-鎬诲伐鏃�*/
+                                long seconds = stat.getProcessTotalTime().multiply(new BigDecimal(60)).multiply(new BigDecimal(60)).longValue();
+                                LocalDateTime crtStartDt = transLocalDateTime(last.getProcessPlanStartDay()).minusSeconds(seconds);
+                                /*濡傛灉寮�濮嬫椂闂村皬浜庡綋鍓嶆椂闂�*/
+                                if(crtStartDt.isBefore(now)){
+                                    hasBefore=true;
+                                    stat.setWarning(true);
+                                    stat.setProcessPlanStartDay(transDate(now));
+                                }else {
+                                    stat.setProcessPlanStartDay(transDate(crtStartDt));
+                                }
+                            }
+                        }
+                    }
+                    last = stat;
+                    apsGasPipingRouteStatMapper.insertApsGasPipingRouteStat(stat);
+                }
+                hasBefore=false;
+
+            }
+            apsGasPipingRouteStatMapper.deleteApsGasPipingRouteStatByBatchNum(batchNum);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    };
+
+    private Date transDate(LocalDateTime localDateTime){
+        return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
+    }
+
+    private LocalDateTime transLocalDateTime(Date date){
+        return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
+    }
+
+    /**
+     * 淇濆瓨閽i噾缁熻鏁版嵁
+     */
+    @Transactional
+    @Override
+    public void saveGasPipingRoutStateList() {
+        String batchNum = IdUtils.fastSimpleUUID();
+        List<ApsGasPipingRouteStat> tempList = apsGasPipingRouteStatMapper.queryTempStat();
+        Map<String, List<ApsGasPipingRouteStat>> groupByOrderNo = tempList.stream().collect(groupingBy(ApsGasPipingRouteStat::getWorkOrderNo));
+
+        LocalDateTime now = LocalDateTime.now();
+        /*寰呬繚瀛樼殑鏁版嵁*/
+        List<ApsGasPipingRouteStat> cptStateList = new ArrayList<>();
+        for (Map.Entry<String, List<ApsGasPipingRouteStat>> entry : groupByOrderNo.entrySet()) {
+            List<ApsGasPipingRouteStat> statPerOrder = entry.getValue();
+            /*num 涓烘牴鎹畬宸ユ椂闂存帓搴忓嚭鐨勫簭鍙凤紝鎸夋鎺掑簭锛屽彲淇濊瘉鏄寜瀹屽伐鏃堕棿鍊掑彊鎺掑垪*/
+            statPerOrder.sort((a, b)->a.getNum().compareTo(b.getNum()));
+            ApsGasPipingRouteStat last=null;
+            /*褰撳墠宸ュ簭鏄惁瀛樺湪 璁″垝寮�宸ユ椂闂� 灏忎簬 褰撳墠鐨勬椂闂达紝濡傛灉瀛樺湪鍚庣画璁剧疆涓哄綋鍓嶆椂闂�*/
+            boolean hasBefore = false;
+            for (int i = 0; i <statPerOrder.size(); i++) {
+                ApsGasPipingRouteStat stat = statPerOrder.get(i);
+                stat.setId(String.valueOf(IdUtil.getSnowflakeNextId()));
+                stat.setBatchNumber(batchNum);
+                stat.setCreateTime(DateUtils.getNowDate());
+                stat.setCreateBy(SecurityUtils.getUsername());
+                stat.setWarning(false);
+                stat.setDelFlag("0");
+                if(i==0){
+                    Date orderPlanEndDay = stat.getOrderPlanEndDay();
+                    LocalDateTime transLocalDateTime = transLocalDateTime(orderPlanEndDay);
+                    LocalTime endOfDay = LocalTime.of(23, 59, 59);
+                    LocalDateTime orderPlanEndDayLocalDateTime =  LocalDateTime.of( transLocalDateTime.toLocalDate(), endOfDay);
+                    if(orderPlanEndDayLocalDateTime.isBefore(now)){
+                        hasBefore = true;
+                        stat.setWarning(true);
+                        stat.setProcessPlanEndDay(transDate(now));
+                        stat.setProcessPlanStartDay(transDate(now));
+                    }else {
+                        /*璁″垝瀹屽伐鏃�=閽i噾璁″垝宸ュ崟瀹屾垚鏃堕棿*/
+                        stat.setProcessPlanEndDay(transDate(orderPlanEndDayLocalDateTime));
+                        /*璁″垝寮�宸ユ棩=閽i噾璁″垝宸ュ崟瀹屾垚鏃堕棿 -  宸ュ簭鎬诲伐鏃�*/
+                        long seconds = stat.getProcessTotalTime().multiply(new BigDecimal(60)).multiply(new BigDecimal(60)).longValue();
+                        LocalDateTime lastPlanStartDt = orderPlanEndDayLocalDateTime.minusSeconds(seconds);
+                        if(lastPlanStartDt.isBefore(now)){
+                            hasBefore = true;
+                            stat.setProcessPlanStartDay(transDate(now));
+                        }else {
+                            stat.setProcessPlanStartDay(transDate(lastPlanStartDt));
+                        }
+                    }
+                }
+                /*褰撳伐鑹哄伐搴忓彿 >= 宸ュ崟褰撳墠宸ュ簭 浠h〃鏄湭鏉ュ伐搴忥紝鎵嶈繘琛岃鍒掑紑宸ユ棩 鍜岃鍒掑畬宸ユ棩鐨勮绠�
+                 * 褰撳伐鑹哄伐搴忓彿 < 宸ュ崟褰撳墠宸ュ簭  杩囧幓宸ュ簭锛屼笉杩涜璁$畻
+                 * */
+                if( stat.getRoadProcessNumber().compareTo(stat.getCurrentProcessNumber())>=0){
+                    /*鍊掓帓鏃� 涓嬩竴閬撳伐搴忓瓨鍦� 姣斿綋鍓嶆椂闂村皬鐨勮鍒掓椂闂达紝鍒欏綋鍓嶈鍒掑紑濮嬪拰缁撴潫鏃堕棿閮芥槸褰撳墠鏃堕棿*/
+                    if(hasBefore){
+                        stat.setWarning(true);
+                        stat.setProcessPlanEndDay(transDate(now));
+                        stat.setProcessPlanStartDay(transDate(now));
+                    }else{
+                        /*涓嬩竴閬撳伐搴忚鍒掓椂闂撮兘姝e父鏃讹紝*/
+                        if (last != null) {
+                            /*褰撳墠宸ュ簭缁撴潫鏃堕棿=涓嬩竴閬撳伐搴忕殑寮�濮嬫椂闂�*/
+                            stat.setProcessPlanEndDay(last.getProcessPlanStartDay());
+                            /*寮�濮嬫椂闂�=缁撴潫鏃堕棿-鎬诲伐鏃�*/
+                            long seconds = stat.getProcessTotalTime().multiply(new BigDecimal(60)).multiply(new BigDecimal(60)).longValue();
+                            LocalDateTime crtStartDt = transLocalDateTime(last.getProcessPlanStartDay()).minusSeconds(seconds);
+                            /*濡傛灉寮�濮嬫椂闂村皬浜庡綋鍓嶆椂闂�*/
+                            if(crtStartDt.isBefore(now)){
+                                hasBefore=true;
+                                stat.setWarning(true);
+                                stat.setProcessPlanStartDay(transDate(now));
+                            }else {
+                                stat.setProcessPlanStartDay(transDate(crtStartDt));
+                            }
+                        }
+                    }
+                }
+               if(stat.getProcessPlanStartDay()!=null){
+                   Date processPlanStartDay = stat.getProcessPlanStartDay();
+                   stat.setPlanStartYear(processPlanStartDay.getYear()+"");
+                   stat.setPlanStartMonth(processPlanStartDay.getMonth()+"");
+                   stat.setPlanStartDay(processPlanStartDay.getDay()+"");
+               }
+                last = stat;
+                cptStateList.add(stat);
+            }
+        }
+        // 鎵归噺鎻掑叆浠ユ彁楂樻�ц兘
+        if (!cptStateList.isEmpty()) {
+            int batchSize = 500;
+            int size = cptStateList.size();
+            for (int i = 0; i < size; i += batchSize) {
+                int end = Math.min(i + batchSize, size);
+                List<ApsGasPipingRouteStat> batch = cptStateList.subList(i, end);
+                apsGasPipingRouteStatMapper.insertApsGasPipingRouteStatBatch(batch);
+                log.info("鎵归噺鎻掑叆鏁版嵁锛屽紑濮嬩綅缃細{}锛岀粨鏉熶綅缃細{}", i, end);
+            }
+        }
+        apsGasPipingRouteStatMapper.deleteApsGasPipingRouteStatByBatchNum(batchNum);
+        log.info("鎵归噺鎻掑叆鏁版嵁瀹屾垚,batchNum:"+batchNum);
+    }
+
 }

--
Gitblit v1.9.3