From e70dec0b370563c443d426624829a4fc481895d7 Mon Sep 17 00:00:00 2001
From: guoyujie <guoyujie@ng.com>
Date: 星期二, 18 十一月 2025 15:37:52 +0800
Subject: [PATCH] 更新先保存在redis中再使用定时任务向mysql传递完工任务

---
 north-glass-erp/src/main/java/com/example/erp/service/pp/ReportingWorkService.java |  929 +++++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 788 insertions(+), 141 deletions(-)

diff --git a/north-glass-erp/src/main/java/com/example/erp/service/pp/ReportingWorkService.java b/north-glass-erp/src/main/java/com/example/erp/service/pp/ReportingWorkService.java
index 1eb8bb5..82791e5 100644
--- a/north-glass-erp/src/main/java/com/example/erp/service/pp/ReportingWorkService.java
+++ b/north-glass-erp/src/main/java/com/example/erp/service/pp/ReportingWorkService.java
@@ -3,13 +3,18 @@
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.example.erp.common.AsyncQueryExecutor;
 import com.example.erp.common.Constants;
+import com.example.erp.common.Result;
 import com.example.erp.dto.pp.OrderNumberTransferDTO;
+import com.example.erp.dto.sd.OrderProcessSortDTO;
 import com.example.erp.entity.pp.*;
+import com.example.erp.entity.sd.BasicData;
 import com.example.erp.entity.sd.Order;
 import com.example.erp.entity.sd.OrderDetail;
 import com.example.erp.entity.sd.OrderProcessDetail;
@@ -18,30 +23,34 @@
 import com.example.erp.exception.ServiceException;
 import com.example.erp.mapper.mm.FinishedOperateLogMapper;
 import com.example.erp.mapper.pp.*;
-import com.baomidou.dynamic.datasource.annotation.DS;
-import com.example.erp.mapper.sd.OrderDetailMapper;
-import com.example.erp.mapper.sd.OrderGlassDetailMapper;
-import com.example.erp.mapper.sd.OrderMapper;
-import com.example.erp.mapper.sd.OrderProcessDetailMapper;
+import com.example.erp.mapper.sd.*;
 import com.example.erp.mapper.userInfo.LogMapper;
+import com.example.erp.service.mm.FinishedGoodsInventoryService;
 import com.example.erp.service.sd.OrderProcessDetailService;
 import com.example.erp.service.userInfo.LogService;
 import com.example.erp.service.userInfo.SysErrorService;
+import com.example.erp.tools.JacksonUtil;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import lombok.RequiredArgsConstructor;
-import org.springframework.http.HttpEntity;
-import org.springframework.http.HttpMethod;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
+import org.springframework.data.redis.core.RedisCallback;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import org.springframework.web.client.RestTemplate;
 
+import javax.annotation.Resource;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 @Service
 @DS("pp")
@@ -55,13 +64,9 @@
     private final ReportingWorkDetailMapper reportingWorkDetailMapper;
     private final OrderMapper  orderMapper;
     private final OrderDetailMapper orderDetailMapper;
-
     private final FlowCardMapper flowCardMapper;
-
     private final OrderProcessDetailService orderProcessDetailService;
-
     private final LogService logService;
-
     private final LogMapper logMapper;
     private final OrderGlassDetailMapper orderGlassDetailMapper;
     private final SysErrorService sysErrorService;
@@ -69,8 +74,12 @@
     private final RestTemplate restTemplate;
     private final PatchLogMapper patchLogMapper;
     private final ReworkMapper reworkMapper;
+    private final BasicDataMapper basicDataMapper;
+    private final FinishedGoodsInventoryService finishedGoodsInventoryService;
+    private final StringRedisTemplate stringRedisTemplate;
 
-
+    @Resource
+    private AsyncQueryExecutor asyncExecutor;
     /*public ReportingWorkService(ReportingWorkMapper reportingWorkMapper, BasicDateProduceMapper basicDateProduceMapper, DamageDetailsMapper damageDetailsMapper, ReportingWorkDetailMapper reportingWorkDetailMapper, OrderProcessDetailMapper orderProcessDetailMapper, OrderProcessDetailService orderProcessDetailService, OrderMapper orderMapper, FlowCardMapper flowCardMapper, LogService logService, LogMapper logMapper, OrderGlassDetailMapper orderGlassDetailMapper, SysErrorService sysErrorService, OrderDetailMapper orderDetailMapper, FinishedOperateLogMapper finishedOperateLogMapper, ReportingWorkTransferMapper reportingWorkTransferMapper) {
         this.reportingWorkMapper = reportingWorkMapper;
         this.basicDateProduceMapper = basicDateProduceMapper;
@@ -89,12 +98,32 @@
         this.reportingWorkTransferMapper = reportingWorkTransferMapper;
     }*/
 
+    //灏嗗眰鏁板瓧绗︿覆鐢ㄩ�楀彿闅斿紑
+    public static String splitTechNumbers(String input) {
+        if (input == null || input.isEmpty()) {
+            return "";
+        }
+
+        List<String> result = new ArrayList<>();
+        for (int i = 0; i < input.length(); i++) {
+            // 鐗规畩澶勭悊 "10"
+            if (input.charAt(i) == '1' && i + 1 < input.length() && input.charAt(i + 1) == '0') {
+                result.add("10");
+                i++; // 璺宠繃涓嬩竴涓瓧绗�
+            } else {
+                result.add(String.valueOf(input.charAt(i)));
+            }
+        }
+
+        return String.join(",", result);
+    }
+
     public Map<String, Object> AddSelectLastWorkSv(String processIdStr, String technologyStr, String process, String reportType) {
         Map<String, Object> map = new HashMap<>();
         //鑾峰彇鎶ュ伐宸ュ簭鏄惁涓哄鍚堝伐绋�
         String laminating = reportingWorkMapper.getProcessLaminating(process);
         //鏌ヨ娴佺▼鍗″伐鑹烘祦绋�
-        String technologicalProcess = reportingWorkMapper.SelectTechnologicalProcess(processIdStr,technologyStr);
+        String technologicalProcess = reportingWorkMapper.SelectTechnologicalProcess(processIdStr,splitTechNumbers(technologyStr));
 
         if (technologicalProcess!=null || !technologicalProcess.equals("")){
             String[] processList = technologicalProcess.split("->");
@@ -123,7 +152,7 @@
                         nextProcess = processList[i + 1];
                     }
                     //鏌ヨ褰撳墠宸ュ簭鐨勮〃澶存暟鎹�
-                    map.put("data", reportingWorkMapper.AddSelectLastWorkMp(processIdStr, technologyStr, previousProcess, nextProcess, process,reportType));
+                    map.put("data", reportingWorkMapper.AddSelectLastWorkMp(processIdStr, splitTechNumbers(technologyStr), previousProcess, nextProcess, process,reportType));
                     map.put("thisProcess", processList);
                     break;
                 }
@@ -144,12 +173,12 @@
             //鏌ヨ鏈伐搴忔姤宸ラ渶瑕佸摢鍑犲眰锛屼笂宸ュ簭鏄粈涔�
             String obtainTechnology = reportingWorkMapper.SelectWorkTechnologyMp(processIdStr);
 
-            map.put("numberList", flowCardMapper.getGlassNumber(technologyStr,processIdStr));
+            map.put("numberList", flowCardMapper.getGlassNumber(splitTechNumbers(technologyStr),processIdStr));
 
             //鍒ゆ柇鏈伐搴忔槸涓嶆槸绗竴閬撳伐搴�
             if (interceptProcess.equals(process)) {
                 //鏄涓�閬撳伐搴忥紝鏌ヨ娴佺▼鍗℃暟鎹�
-                map.put("Detail", reportingWorkMapper.SelectTechnologicalNumMp(processIdStr, technologyStr, process,reportType));
+                map.put("Detail", reportingWorkMapper.SelectTechnologicalNumMp(processIdStr, splitTechNumbers(technologyStr), process,reportType));
             } else {
                 ReportingWork retrievedData = (ReportingWork) map.get("data");
                 if (retrievedData!=null){
@@ -157,7 +186,7 @@
                     //鏍规嵁瀹℃牳鐘舵�佹煡璇㈡湭瀹℃牳鏁版嵁
                    // if (reviewedState==1){//宸插鏍�
                         //涓嶆槸绗竴閬撳伐搴忥紝鏌ヨ鎶ュ伐鏁版嵁
-                        List<Map<String,String>>  details = reportingWorkMapper.SelectReworlDetailMp(processIdStr, technologyStr, process,previousProcess,laminating);
+                        List<Map<String,String>>  details = reportingWorkMapper.SelectReworlDetailMp(processIdStr, splitTechNumbers(technologyStr), process,previousProcess,laminating);
                         if(process.equals("涓┖")){
                             //鑾峰彇璇ユ祦绋嬪崱璁㈠崟鍙�
                             String orderId = reportingWorkMapper.selectOrderid(processIdStr);
@@ -216,6 +245,8 @@
     public Map<String, Object> SelectProcessSv(String userId) {
         Map<String, Object> map = new HashMap<>();
         String process = reportingWorkMapper.selectUserProcess(userId);
+        //宸ュ簭鍒楄〃
+        List<Map<String, Object>> processNameList = flowCardMapper.getProcessNameList();
         if (process==null) {
             map.put("process", reportingWorkMapper.SelectProcessMp());
         }
@@ -228,84 +259,133 @@
                 map.put("process",reportingWorkMapper.getSelectProcessDuoqu() );
             }
         }
-
+        map.put("processNameList", processNameList);
         return map;
     }
 
-    //鎶ュ伐鏂板
+
     @Transactional(rollbackFor = Exception.class)
     public boolean SaveReportingWorkSv(Map<String, Object> reportingWorkMap) {
-        //鎺ユ敹瑙f瀽涓婚檮琛ㄤ俊鎭�
+        // 鎺ユ敹瑙f瀽涓婚檮琛ㄤ俊鎭�
         JSONObject reportingWorkJson = new JSONObject(reportingWorkMap);
-        ReportingWork reportingWork = JSONObject.parseObject(JSONObject.toJSONString(reportingWorkJson.get("title")), ReportingWork.class);
-        List<ReportingWorkDetail> reportingWorkDetails = JSONArray.parseArray(JSONObject.toJSONString(reportingWorkJson.get("detail")), ReportingWorkDetail.class);
-        //鑾峰彇褰撳墠鏈�澶ф姤宸ュ崟鍙风敓鎴愭姤宸ュ崟鍙�
-        String formattedNumber = String.format("%04d", reportingWorkMapper.selectMaxReportingWorkId() + 1);
-        //鏍煎紡鍖栧綋鍓嶆棩鏈�
-        Date currentDate = new Date();
-        SimpleDateFormat dateFormat = new SimpleDateFormat("yyMMdd");
-        String formattedDate = dateFormat.format(currentDate);
-        String reportingWorkId = "BG" + formattedDate + formattedNumber;
-        reportingWork.setReportingWorkId(reportingWorkId);
-        String[] processIdStr = reportingWork.getProcessId().split("/");
-        reportingWork.setProcessId(processIdStr[0]);
+        ReportingWork reportingWork = JSONObject.parseObject(
+                JSONObject.toJSONString(reportingWorkJson.get("title")), ReportingWork.class);
+        List<ReportingWorkDetail> reportingWorkDetails = JSONArray.parseArray(
+                JSONObject.toJSONString(reportingWorkJson.get("detail")), ReportingWorkDetail.class);
 
-        int reviewState = (int) reportingWorkJson.get("type");
-        if (reviewState == 1) {//瀹℃牳閫氳繃
+
+
+        // 澶勭悊宸ュ簭 ID
+        String[] processIdStr = reportingWork.getProcessId() != null
+                ? reportingWork.getProcessId().split("/")
+                : new String[]{""};
+        reportingWork.setProcessId(processIdStr[0]); // 淇濆簳鍙彇绗竴涓�
+        reportingWork.setThisWornQuantity(0);
+        reportingWork.setThisCompletedQuantity(0);
+
+        // 瀹℃牳鐘舵��
+        Integer reviewState = reportingWorkJson.getInteger("type");
+        if (reviewState != null && reviewState == 1) { // 瀹℃牳閫氳繃
             reportingWork.setReviewed(reportingWork.getCreator());
             reportingWork.setReviewedState(1);
         } else {
             reportingWork.setReviewedState(0);
         }
-        if(reportingWork.getReportingWorkTime()==null){
-            LocalDateTime localDateTime = LocalDateTime.now();
-            reportingWork.setReportingWorkTime(localDateTime);
+
+        // 鏃堕棿涓虹┖鍒欒ˉ涓婂綋鍓嶆椂闂�
+        if (reportingWork.getReportingWorkTime() == null) {
+            reportingWork.setReportingWorkTime(LocalDateTime.now());
         }
-        //鏄惁绾胯ˉ 1鐜拌ˉ 0鏈幇琛�
-        int isPatch = (reportingWorkJson.get("isPatch") != null) ? (int) reportingWorkJson.get("isPatch") : 0;
 
-        reportingWork.setNextProcess(orderProcessDetailMapper.selectNextProcess(processIdStr[0],processIdStr[1],reportingWork.getThisProcess()));
-        //涓昏〃鎻掑叆
+        // 鏄惁鐜拌ˉ 1鐜拌ˉ 0鏈幇琛�
+        int isPatch = reportingWorkJson.getInteger("isPatch") != null
+                ? reportingWorkJson.getInteger("isPatch") : 0;
+
+        // 鎶ュ伐缂栧彿
+        Integer maxId = reportingWorkMapper.selectMaxReportingWorkId();
+        if (maxId == null) {
+            maxId = 0;
+        }
+        String formattedNumber = String.format("%04d", maxId + 1);
+
+        // 鏍煎紡鍖栧綋鍓嶆棩鏈�
+        Date currentDate = new Date();
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyMMdd");
+        String formattedDate = dateFormat.format(currentDate);
+        String reportingWorkId = "BG" + formattedDate + formattedNumber;
+        reportingWork.setReportingWorkId(reportingWorkId);
+
+        // 涓昏〃鎻掑叆
         reportingWorkMapper.insert(reportingWork);
-        //鍓〃寰幆鎻掑叆锛屽苟涓旀彃鍏ユ鐮翠俊鎭〃銆傚啀鏍规嵁娆$牬淇℃伅淇敼璁㈠崟鐜荤拑娴佺▼琛ㄧ殑瀹屽伐鏁伴噺涓庡埡鐮存暟閲�
-        reportingWorkDetails.forEach(reportingWorkDetail -> {
 
-            int qualityInsStatus = (int) reportingWorkJson.get("qualityInsStatus");
+        // 鍓〃寰幆鎻掑叆锛屽苟澶勭悊娆$牬閫昏緫
+        final Integer[] maxTechnologyNumber = {0, 0};
+        reportingWorkDetails.forEach(reportingWorkDetail -> {
+            if (reportingWorkDetail == null) return;
+
+            // 缁熶竴鐢ㄥ畨鍏ㄦ暟鍊硷紝閬垮厤 null 鎶ラ敊
+            int completedQty = Optional.ofNullable(reportingWorkDetail.getCompletedQuantity()).orElse(0);
+            int breakageQty = Optional.ofNullable(reportingWorkDetail.getBreakageQuantity()).orElse(0);
+
+            // 鍚堢墖鏁伴噺姹囨�诲噺灏�
+            try {
+                int techNum = Integer.parseInt(reportingWorkDetail.getTechnologyNumber());
+                if (techNum > maxTechnologyNumber[0]) {
+                    maxTechnologyNumber[0] = techNum;
+                    maxTechnologyNumber[1] += 1;
+                }
+            } catch (NumberFormatException ignored) {
+            }
+
+            reportingWork.setThisCompletedQuantity(reportingWork.getThisCompletedQuantity() + completedQty);
+            reportingWork.setThisWornQuantity(reportingWork.getThisWornQuantity() + breakageQty);
+
+            int qualityInsStatus = reportingWorkJson.getInteger("qualityInsStatus") != null
+                    ? reportingWorkJson.getInteger("qualityInsStatus") : 0;
+
             reportingWorkDetail.setReportingWorkId(reportingWorkId);
             List<DamageDetails> damageDetails = reportingWorkDetail.getDamageDetails();
-            //娆$牬鏄庣粏琛ㄦ彃鍏ユ暟鎹�
+
+            reportingWork.setNextProcess(orderProcessDetailMapper.selectNextProcess(
+                    processIdStr[0],
+                    processIdStr.length > 1 ? processIdStr[1] : "",
+                    reportingWork.getThisProcess(),
+                    reportingWorkDetail.getOrderNumber()
+            ));
+
+            // 娆$牬鏄庣粏琛ㄦ彃鍏ユ暟鎹�
             if (damageDetails != null && !damageDetails.isEmpty()) {
                 damageDetails.forEach(damageDetail -> {
+                    if (damageDetail == null) return;
                     damageDetail.setReportingWorkId(reportingWorkId);
                     damageDetail.setOrderNumber(reportingWorkDetail.getOrderNumber());
                     damageDetail.setProcessId(reportingWork.getProcessId());
                     damageDetail.setTechnologyNumber(reportingWorkDetail.getTechnologyNumber());
-                    //璺ㄥ伐搴忔鐮翠慨鏀硅川妫�鐘舵��
-                    if (!damageDetail.getResponsibleProcess().equals(reportingWork.getThisProcess()) && qualityInsStatus==2) {
+
+                    if (!Objects.equals(damageDetail.getResponsibleProcess(), reportingWork.getThisProcess())
+                            && qualityInsStatus == 2) {
                         damageDetail.setQualityInsStatus(1);
                     }
-                    if (isPatch == 1){
+                    if (isPatch == 1) {
                         damageDetail.setQualityInsStatus(2);
                     }
                     damageDetailsMapper.insert(damageDetail);
                 });
             }
-            //鏌ヨ娴佺▼鍗″伐鑹烘祦绋�
-            String technologicalProcess = reportingWorkMapper.SelectTechnologicalProcess(reportingWork.getProcessId(), reportingWorkDetail.getTechnologyNumber());
 
-            int index = technologicalProcess.indexOf("-");
-            String interceptProcess = "";
-            if (index <0){
-                 interceptProcess = technologicalProcess;
-            }
-            else {
-                //鑾峰彇宸ヨ壓娴佺▼绗竴涓伐搴�
-                 interceptProcess = technologicalProcess.substring(0, index);
+            // 鏌ヨ宸ヨ壓娴佺▼
+            String technologicalProcess = reportingWorkMapper.SelectTechnologicalProcess(
+                    reportingWork.getProcessId(), reportingWorkDetail.getTechnologyNumber());
+            String interceptProcess;
+            if (technologicalProcess != null) {
+                int index = technologicalProcess.indexOf("-");
+                interceptProcess = (index < 0) ? technologicalProcess : technologicalProcess.substring(0, index);
+            } else {
+                interceptProcess = "";
             }
 
-
-            //鍒ゆ柇褰撳墠宸ュ簭鏄惁涓虹涓�閬撳伐搴忓伐搴忥紝浣跨敤娴佺▼鍗¤〃鏁伴噺鎴栬�呭皬鐗囨祦绋嬭〃涓婂伐搴忔暟閲�
-            int processNum = 0;
+            // 鍒ゆ柇鏄惁绗竴閬撳伐搴�
+            int processNum;
             if (interceptProcess.equals(reportingWork.getThisProcess())) {
                 processNum = reportingWorkMapper.selectFlowCardNum(
                         reportingWorkDetail.getOrderNumber(),
@@ -322,68 +402,244 @@
                 );
             }
 
-
-            //鍒ゆ柇鏄惁澶т簬褰撳墠鏁伴噺骞朵笖鎶涘嚭寮傚父
-            if (processNum < (reportingWorkDetail.getBreakageQuantity() + reportingWorkDetail.getCompletedQuantity())) {
+            // 鏍¢獙鏁伴噺鍚堟硶鎬�
+            if (processNum < (breakageQty + completedQty)) {
                 Map<String, Object> map = new HashMap<>();
                 map.put("orderNumber", reportingWorkDetail.getOrderNumber());
-                map.put("technologyNumber", reportingWorkDetail.getOrderNumber());
+                map.put("technologyNumber", reportingWorkDetail.getTechnologyNumber()); // 淇閿欒
                 map.put("processNum", processNum);
-                map.put("sumNum", reportingWorkDetail.getBreakageQuantity() + reportingWorkDetail.getCompletedQuantity());
+                map.put("sumNum", breakageQty + completedQty);
                 String msg = JSON.toJSONString(map);
                 throw new ServiceException(Constants.Code_600, msg);
             }
 
             OrderProcessDetail orderProcessDetail = new OrderProcessDetail();
-            orderProcessDetail.setBrokenNum(reportingWorkDetail.getBreakageQuantity());
-            orderProcessDetail.setReportingWorkNum(reportingWorkDetail.getCompletedQuantity());
-            orderProcessDetail.setReportingWorkNumCount(reportingWorkDetail.getCompletedQuantity());
+            orderProcessDetail.setBrokenNum(breakageQty);
+            orderProcessDetail.setReportingWorkNum(completedQty);
+            orderProcessDetail.setReportingWorkNumCount(completedQty);
 
-
-            if (isPatch == 0){//鏈幇琛�
-                //鏍规嵁璁㈠崟id锛岃鍗曞簭鍙凤紝浠ュ強灏忕墖搴忓彿 鏇存柊灏忕墖娴佺▼鐨勫畬宸ユ暟閲忎互鍙婂埡鐮存暟閲�
+            // 鏈幇琛ワ細鏇存柊灏忕墖娴佺▼鏁伴噺
+            if (isPatch == 0) {
                 LambdaUpdateWrapper<OrderProcessDetail> updateWrapper = new LambdaUpdateWrapper<>();
                 updateWrapper.eq(OrderProcessDetail::getOrderNumber, reportingWorkDetail.getOrderNumber())
                         .eq(OrderProcessDetail::getProcessId, reportingWork.getProcessId())
                         .eq(OrderProcessDetail::getOrderId, reportingWork.getOrderId())
                         .eq(OrderProcessDetail::getProcess, reportingWork.getThisProcess())
                         .eq(OrderProcessDetail::getTechnologyNumber, reportingWorkDetail.getTechnologyNumber())
-                        .setSql("reporting_work_num_count = reporting_work_num_count +" + orderProcessDetail.getReportingWorkNum())
-                        .setSql("reporting_work_num =reporting_work_num +" + orderProcessDetail.getReportingWorkNum())
+                        .setSql("reporting_work_num_count = reporting_work_num_count +" + completedQty)
+                        .setSql("reporting_work_num = reporting_work_num +" + completedQty)
                         .setSql("update_time = now()")
-                        .setSql("broken_num =broken_num +" + orderProcessDetail.getBrokenNum());
+                        .setSql("broken_num = broken_num +" + breakageQty);
                 orderProcessDetailMapper.update(null, updateWrapper);
             }
 
-            //鍒ゆ柇瀹屽伐鏁伴噺鍜屽埡鐮存暟閲忔槸鍚︿负0锛屼负0鍒欎笉鎻掑叆鍒版暟鎹簱
-            if (!(reportingWorkDetail.getCompletedQuantity() == 0 && reportingWorkDetail.getBreakageQuantity() == 0)) {
+            // 鍒ゆ柇瀹屽伐鏁伴噺鍜屾鐮存暟閲忔槸鍚︿负0锛屼负0鍒欎笉鎻掑叆
+            if (!(completedQty == 0 && breakageQty == 0)) {
                 reportingWorkDetailMapper.insert(reportingWorkDetail);
             }
 
-            //鏇存柊娴佺▼鍗¤〃鐨勬姤宸ユ暟閲�
-            if (Objects.equals(reportingWork.getNextProcess(), "")|| Objects.equals(reportingWork.getNextProcess(), null)) {
-                LambdaUpdateWrapper<FlowCard> flowCardLambdaUpdateWrapper =
-                        new LambdaUpdateWrapper<>();
+            // 鍒ゆ柇鏈�鍚庝竴閬撳伐搴忥紝鏇存柊娴佺▼鍗℃姤宸ユ暟閲�
+            if (reportingWork.getNextProcess() == null || reportingWork.getNextProcess().isEmpty()) {
+                LambdaUpdateWrapper<FlowCard> flowCardLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
                 flowCardLambdaUpdateWrapper
                         .eq(FlowCard::getProcessId, reportingWork.getProcessId())
                         .eq(FlowCard::getOrderNumber, reportingWorkDetail.getOrderNumber())
                         .eq(FlowCard::getTechnologyNumber, reportingWorkDetail.getTechnologyNumber())
-                        .setSql("inventory_quantity = inventory_quantity +" + orderProcessDetail.getReportingWorkNum());
+                        .setSql("inventory_quantity = inventory_quantity +" + completedQty);
                 flowCardMapper.update(null, flowCardLambdaUpdateWrapper);
             }
-
-
         });
 
-        //淇濆瓨鏃ュ織
+        // 鑾峰彇鎶ュ伐宸ュ簭鏄惁涓哄鍚堝伐绋�
+        if (maxTechnologyNumber[1] != 0) {
+            reportingWork.setThisCompletedQuantity(
+                    reportingWork.getThisCompletedQuantity() / maxTechnologyNumber[1]);
+        }
+
+        reportingWorkMapper.update(reportingWork, new LambdaUpdateWrapper<ReportingWork>()
+                .eq(ReportingWork::getId, reportingWork.getId()));
+
+        // 淇濆瓨鏃ュ織
         Log log = new Log();
-        log.setContent(reportingWorkMap.toString());
+        log.setContent(JSON.toJSONString(reportingWorkMap));
         log.setFunction("saveReportingWork鎶ュ伐鏂板");
-        log.setOperatorId((String) reportingWorkJson.get("userId"));
-        log.setOperator((String) reportingWorkJson.get("userName"));
+        log.setOperatorId(reportingWorkJson.getString("userId"));
+        log.setOperator(reportingWorkJson.getString("userName"));
         logService.saveLog(log);
+
         return true;
     }
+
+
+    //鎶ュ伐鏂板
+//    @Transactional(rollbackFor = Exception.class)
+//    public boolean SaveReportingWorkSv(Map<String, Object> reportingWorkMap) {
+//        //鎺ユ敹瑙f瀽涓婚檮琛ㄤ俊鎭�
+//        JSONObject reportingWorkJson = new JSONObject(reportingWorkMap);
+//        ReportingWork reportingWork = JSONObject.parseObject(JSONObject.toJSONString(reportingWorkJson.get("title")), ReportingWork.class);
+//        List<ReportingWorkDetail> reportingWorkDetails = JSONArray.parseArray(JSONObject.toJSONString(reportingWorkJson.get("detail")), ReportingWorkDetail.class);
+//        //鑾峰彇褰撳墠鏈�澶ф姤宸ュ崟鍙风敓鎴愭姤宸ュ崟鍙�
+//        String formattedNumber = String.format("%04d", reportingWorkMapper.selectMaxReportingWorkId() + 1);
+//        //鏍煎紡鍖栧綋鍓嶆棩鏈�
+//        Date currentDate = new Date();
+//        SimpleDateFormat dateFormat = new SimpleDateFormat("yyMMdd");
+//        String formattedDate = dateFormat.format(currentDate);
+//        String reportingWorkId = "BG" + formattedDate + formattedNumber;
+//        reportingWork.setReportingWorkId(reportingWorkId);
+//        String[] processIdStr = reportingWork.getProcessId().split("/");
+//        reportingWork.setProcessId(processIdStr[0]);
+//        reportingWork.setThisWornQuantity(0);
+//        reportingWork.setThisCompletedQuantity(0);
+//
+//        int reviewState = (int) reportingWorkJson.get("type");
+//        if (reviewState == 1) {//瀹℃牳閫氳繃
+//            reportingWork.setReviewed(reportingWork.getCreator());
+//            reportingWork.setReviewedState(1);
+//        } else {
+//            reportingWork.setReviewedState(0);
+//        }
+//        if(reportingWork.getReportingWorkTime()==null){
+//            LocalDateTime localDateTime = LocalDateTime.now();
+//            reportingWork.setReportingWorkTime(localDateTime);
+//        }
+//        //鏄惁绾胯ˉ 1鐜拌ˉ 0鏈幇琛�
+//        int isPatch = (reportingWorkJson.get("isPatch") != null) ? (int) reportingWorkJson.get("isPatch") : 0;
+//
+//        //涓昏〃鎻掑叆
+//        reportingWorkMapper.insert(reportingWork);
+//        //鍓〃寰幆鎻掑叆锛屽苟涓旀彃鍏ユ鐮翠俊鎭〃銆傚啀鏍规嵁娆$牬淇℃伅淇敼璁㈠崟鐜荤拑娴佺▼琛ㄧ殑瀹屽伐鏁伴噺涓庡埡鐮存暟閲�
+//        final Integer[] maxTechnologyNumber = {0,0};
+//        reportingWorkDetails.forEach(reportingWorkDetail -> {
+//            //鍚堢墖鏁伴噺姹囨�诲噺灏�
+//            if(Integer.parseInt(reportingWorkDetail.getTechnologyNumber()) > maxTechnologyNumber[0]){
+//                maxTechnologyNumber[0] = Integer.valueOf(reportingWorkDetail.getTechnologyNumber());
+//                maxTechnologyNumber[1]+=1;
+//            }
+//            reportingWork.setThisCompletedQuantity(reportingWork.getThisCompletedQuantity() + reportingWorkDetail.getCompletedQuantity());
+//            reportingWork.setThisWornQuantity(reportingWork.getThisWornQuantity() + reportingWorkDetail.getBreakageQuantity());
+//            int qualityInsStatus = (int) reportingWorkJson.get("qualityInsStatus");
+//            reportingWorkDetail.setReportingWorkId(reportingWorkId);
+//            List<DamageDetails> damageDetails = reportingWorkDetail.getDamageDetails();
+//            reportingWork.setNextProcess(orderProcessDetailMapper.selectNextProcess(processIdStr[0],processIdStr[1],reportingWork.getThisProcess(),reportingWorkDetail.getOrderNumber()));
+//
+//            //娆$牬鏄庣粏琛ㄦ彃鍏ユ暟鎹�
+//            if (damageDetails != null && !damageDetails.isEmpty()) {
+//                damageDetails.forEach(damageDetail -> {
+//                    damageDetail.setReportingWorkId(reportingWorkId);
+//                    damageDetail.setOrderNumber(reportingWorkDetail.getOrderNumber());
+//                    damageDetail.setProcessId(reportingWork.getProcessId());
+//                    damageDetail.setTechnologyNumber(reportingWorkDetail.getTechnologyNumber());
+//                    //璺ㄥ伐搴忔鐮翠慨鏀硅川妫�鐘舵��
+//                    if (!damageDetail.getResponsibleProcess().equals(reportingWork.getThisProcess()) && qualityInsStatus==2) {
+//                        damageDetail.setQualityInsStatus(1);
+//                    }
+//                    if (isPatch == 1){
+//                        damageDetail.setQualityInsStatus(2);
+//                    }
+//                    damageDetailsMapper.insert(damageDetail);
+//                });
+//            }
+//            //鏌ヨ娴佺▼鍗″伐鑹烘祦绋�
+//            String technologicalProcess = reportingWorkMapper.SelectTechnologicalProcess(reportingWork.getProcessId(), reportingWorkDetail.getTechnologyNumber());
+//
+//            int index = technologicalProcess.indexOf("-");
+//            String interceptProcess = "";
+//            if (index <0){
+//                 interceptProcess = technologicalProcess;
+//            }
+//            else {
+//                //鑾峰彇宸ヨ壓娴佺▼绗竴涓伐搴�
+//                 interceptProcess = technologicalProcess.substring(0, index);
+//            }
+//
+//
+//            //鍒ゆ柇褰撳墠宸ュ簭鏄惁涓虹涓�閬撳伐搴忓伐搴忥紝浣跨敤娴佺▼鍗¤〃鏁伴噺鎴栬�呭皬鐗囨祦绋嬭〃涓婂伐搴忔暟閲�
+//            int processNum = 0;
+//            if (interceptProcess.equals(reportingWork.getThisProcess())) {
+//                processNum = reportingWorkMapper.selectFlowCardNum(
+//                        reportingWorkDetail.getOrderNumber(),
+//                        reportingWorkDetail.getTechnologyNumber(),
+//                        reportingWork.getProcessId(),
+//                        reportingWork.getThisProcess()
+//                );
+//            } else {
+//                processNum = reportingWorkMapper.selectGlassProcessNum(
+//                        reportingWorkDetail.getOrderNumber(),
+//                        reportingWorkDetail.getTechnologyNumber(),
+//                        reportingWork.getProcessId(),
+//                        reportingWork.getThisProcess()
+//                );
+//            }
+//
+//
+//            //鍒ゆ柇鏄惁澶т簬褰撳墠鏁伴噺骞朵笖鎶涘嚭寮傚父
+//            if (processNum < (reportingWorkDetail.getBreakageQuantity() + reportingWorkDetail.getCompletedQuantity())) {
+//                Map<String, Object> map = new HashMap<>();
+//                map.put("orderNumber", reportingWorkDetail.getOrderNumber());
+//                map.put("technologyNumber", reportingWorkDetail.getOrderNumber());
+//                map.put("processNum", processNum);
+//                map.put("sumNum", reportingWorkDetail.getBreakageQuantity() + reportingWorkDetail.getCompletedQuantity());
+//                String msg = JSON.toJSONString(map);
+//                throw new ServiceException(Constants.Code_600, msg);
+//            }
+//
+//            OrderProcessDetail orderProcessDetail = new OrderProcessDetail();
+//            orderProcessDetail.setBrokenNum(reportingWorkDetail.getBreakageQuantity());
+//            orderProcessDetail.setReportingWorkNum(reportingWorkDetail.getCompletedQuantity());
+//            orderProcessDetail.setReportingWorkNumCount(reportingWorkDetail.getCompletedQuantity());
+//
+//
+//            if (isPatch == 0){//鏈幇琛�
+//                //鏍规嵁璁㈠崟id锛岃鍗曞簭鍙凤紝浠ュ強灏忕墖搴忓彿 鏇存柊灏忕墖娴佺▼鐨勫畬宸ユ暟閲忎互鍙婂埡鐮存暟閲�
+//                LambdaUpdateWrapper<OrderProcessDetail> updateWrapper = new LambdaUpdateWrapper<>();
+//                updateWrapper.eq(OrderProcessDetail::getOrderNumber, reportingWorkDetail.getOrderNumber())
+//                        .eq(OrderProcessDetail::getProcessId, reportingWork.getProcessId())
+//                        .eq(OrderProcessDetail::getOrderId, reportingWork.getOrderId())
+//                        .eq(OrderProcessDetail::getProcess, reportingWork.getThisProcess())
+//                        .eq(OrderProcessDetail::getTechnologyNumber, reportingWorkDetail.getTechnologyNumber())
+//                        .setSql("reporting_work_num_count = reporting_work_num_count +" + orderProcessDetail.getReportingWorkNum())
+//                        .setSql("reporting_work_num =reporting_work_num +" + orderProcessDetail.getReportingWorkNum())
+//                        .setSql("update_time = now()")
+//                        .setSql("broken_num =broken_num +" + orderProcessDetail.getBrokenNum());
+//                orderProcessDetailMapper.update(null, updateWrapper);
+//            }
+//
+//            //鍒ゆ柇瀹屽伐鏁伴噺鍜屽埡鐮存暟閲忔槸鍚︿负0锛屼负0鍒欎笉鎻掑叆鍒版暟鎹簱
+//            if (!(reportingWorkDetail.getCompletedQuantity() == 0 && reportingWorkDetail.getBreakageQuantity() == 0)) {
+//                reportingWorkDetailMapper.insert(reportingWorkDetail);
+//            }
+//
+//            //鏇存柊娴佺▼鍗¤〃鐨勬姤宸ユ暟閲�
+//            if (reportingWork.getNextProcess() == null || reportingWork.getNextProcess().isEmpty()) {
+//                LambdaUpdateWrapper<FlowCard> flowCardLambdaUpdateWrapper =
+//                        new LambdaUpdateWrapper<>();
+//                flowCardLambdaUpdateWrapper
+//                        .eq(FlowCard::getProcessId, reportingWork.getProcessId())
+//                        .eq(FlowCard::getOrderNumber, reportingWorkDetail.getOrderNumber())
+//                        .eq(FlowCard::getTechnologyNumber, reportingWorkDetail.getTechnologyNumber())
+//                        .setSql("inventory_quantity = inventory_quantity +" + orderProcessDetail.getReportingWorkNum());
+//                flowCardMapper.update(null, flowCardLambdaUpdateWrapper);
+//            }
+//
+//
+//        });
+//        //鑾峰彇鎶ュ伐宸ュ簭鏄惁涓哄鍚堝伐绋�
+//
+//        reportingWork.setThisCompletedQuantity(reportingWork.getThisCompletedQuantity()/maxTechnologyNumber[1]);
+//
+//
+//        reportingWorkMapper.update(reportingWork, new LambdaUpdateWrapper<ReportingWork>()
+//                .eq(ReportingWork::getId, reportingWork.getId()));
+//
+//        //淇濆瓨鏃ュ織
+//        Log log = new Log();
+//        log.setContent(reportingWorkMap.toString());
+//        log.setFunction("saveReportingWork鎶ュ伐鏂板");
+//        log.setOperatorId((String) reportingWorkJson.get("userId"));
+//        log.setOperator((String) reportingWorkJson.get("userName"));
+//        logService.saveLog(log);
+//        return true;
+//    }
 
     //涓嬪伐搴忓鏍告柟娉�
     public boolean ReviewReportingWorkSv(Map<String, String> reportingWork) {
@@ -398,22 +654,22 @@
         String nowDate = LocalDate.now().toString();
         //鑾峰彇鎶ュ伐宸ュ簭鏄惁涓哄鍚堝伐绋�
         String laminating = reportingWorkMapper.getProcessLaminating(thisProcess);
-//鍚堢墖宸ュ簭
-if (laminating.equals("laminating")){
-    LambdaUpdateWrapper
-                <ReportingWork> updateWrapper = new LambdaUpdateWrapper<>();
-        updateWrapper
-                .eq(ReportingWork::getProcessId, processIdStr[0])
-                .eq(ReportingWork::getThisProcess, reportingWork.get("process"))
-                .eq(ReportingWork::getReviewedState, 0)
-                .setSql("reviewed_state =1")
-                .set(ReportingWork::getReviewed, userName)
-                .set(ReportingWork::getExamineTime, nowDate);
-        reportingWorkMapper.update(null, updateWrapper);
-}else {
-    reportingWorkMapper.ReviewReportingWorkMp(processIdStr[0],reportingWork.get("process"),technologyStr,userName);
+        //鍚堢墖宸ュ簭
+        if (laminating.indexOf("step")!=-1){
+            LambdaUpdateWrapper
+                        <ReportingWork> updateWrapper = new LambdaUpdateWrapper<>();
+                updateWrapper
+                        .eq(ReportingWork::getProcessId, processIdStr[0])
+                        .eq(ReportingWork::getThisProcess, reportingWork.get("process"))
+                        .eq(ReportingWork::getReviewedState, 0)
+                        .setSql("reviewed_state =1")
+                        .set(ReportingWork::getReviewed, userName)
+                        .set(ReportingWork::getExamineTime, nowDate);
+                reportingWorkMapper.update(null, updateWrapper);
+        }else {
+            reportingWorkMapper.ReviewReportingWorkMp(processIdStr[0],reportingWork.get("process"),technologyStr,userName);
 
-}
+        }
         return true;
     }
 
@@ -430,7 +686,8 @@
 
 
 
-        List<Map<String, Object>> reportingWorkDetails = reportingWorkMapper.selectByReportingWorkId(reportingWorkId, reportingWork.getNextProcess());
+
+        List<Map<String, Object>> reportingWorkDetails = reportingWorkMapper.selectByReportingWorkId(reportingWorkId, reportingWork.getNextProcess(),reportingWork.getOrderId());
         reportingWorkDetails.forEach(reportingWorkDetail -> {
             List<DamageDetails> damageDetailsList = new ArrayList<>();
             damageDetailsList = damageDetailsMapper.selectList(new LambdaQueryWrapper<DamageDetails>()
@@ -565,16 +822,92 @@
     }
 
     //鎶ュ伐绠$悊鏌ヨ
-    public Map<String, Object> selectReportingWorkSv(Integer pageNum, Integer pageSize, java.sql.Date selectTime1, java.sql.Date selectTime2, String orderId, ReportingWork reportingWork) {
+//    public Map<String, Object> selectReportingWorkSv(Integer pageNum, Integer pageSize, List<String> selectDate, String orderId, ReportingWork reportingWork) {
+//        Integer offset = (pageNum - 1) * pageSize;
+//        if ("null".equals(orderId)) {
+//            orderId = "";
+//        }
+//        String endDate = LocalDate.now().toString();
+//        String startDate = LocalDate.now().minusDays(3).toString();
+//        if(selectDate !=null && selectDate.size()==2){
+//            if(!selectDate.get(0).isEmpty()){
+//                startDate = selectDate.get(0);
+//            }
+//            if(!selectDate.get(1).isEmpty()){
+//                endDate = selectDate.get(1);
+//            }
+//        }
+//        Map<String, Object> map = new HashMap<>();
+//        map.put("data", reportingWorkMapper.selectReportingWorkMp(offset, pageSize, startDate, endDate, orderId, reportingWork));
+//        map.put("total" ,reportingWorkMapper.getFootSum(offset, pageSize, startDate, endDate, orderId, reportingWork));
+//        List<String> list = new ArrayList<>();
+//        list.add(startDate);
+//        list.add(endDate);
+//        map.put("selectDate",list);
+//        return map;
+//    }
+
+
+    public Map<String, Object> selectReportingWorkSv(
+            Integer pageNum, Integer pageSize,
+            List<String> selectDate, String orderId,
+            ReportingWork reportingWork) {
+
         Integer offset = (pageNum - 1) * pageSize;
+
         if ("null".equals(orderId)) {
             orderId = "";
         }
-        Map<String, Object> map = new HashMap<>();
-        map.put("data", reportingWorkMapper.selectReportingWorkMp(offset, pageSize, selectTime1, selectTime2, orderId, reportingWork));
-        map.put("total", reportingWorkMapper.getPageTotal(offset, pageSize, selectTime1, selectTime2, orderId, reportingWork));
-        map.put("footSum" ,reportingWorkMapper.getFootSum(selectTime1, selectTime2, orderId,reportingWork));
-        return map;
+
+        // 榛樿鏃堕棿锛氭渶杩� 3 澶�
+        String endDate = LocalDate.now().toString();
+        String startDate = LocalDate.now().minusDays(3).toString();
+
+        // 濡傛灉浼犲叆鑷畾涔夋棩鏈�
+        if (selectDate != null && selectDate.size() == 2) {
+            if (!selectDate.get(0).isEmpty()) {
+                startDate = selectDate.get(0);
+            }
+            if (!selectDate.get(1).isEmpty()) {
+                endDate = selectDate.get(1);
+            }
+        }
+
+        Map<String, Object> result = new HashMap<>();
+
+        try {
+            // 骞惰鎵ц涓ゆ潯 SQL 鏌ヨ
+            String finalStartDate = startDate;
+            String finalEndDate = endDate;
+            String finalOrderId = orderId;
+            CompletableFuture<List<ReportingWork>> dataFuture =
+                    asyncExecutor.runAsync(() ->
+                            reportingWorkMapper.selectReportingWorkMp(
+                                    offset, pageSize, finalStartDate, finalEndDate, finalOrderId, reportingWork));
+
+            CompletableFuture<Map<String, Float>> totalFuture =
+                    asyncExecutor.runAsync(() ->
+                            reportingWorkMapper.getFootSum(
+                                    offset, pageSize, finalStartDate, finalEndDate, finalOrderId, reportingWork));
+
+            // 绛夊緟鍏ㄩ儴瀹屾垚
+            CompletableFuture.allOf(dataFuture, totalFuture).join();
+
+            result.put("data", dataFuture.get());
+            result.put("total", totalFuture.get());
+
+            // 鏃ユ湡鑼冨洿
+            List<String> list = new ArrayList<>();
+            list.add(startDate);
+            list.add(endDate);
+            result.put("selectDate", list);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("骞惰鏌ヨ鎶ュ伐璁板綍寮傚父锛�" + e.getMessage(), e);
+        }
+
+        return result;
     }
 
     //鍒犻櫎鎶ュ伐
@@ -593,6 +926,17 @@
             if (transferState !=3){
                 //鍒ゆ柇鏄惁鏈夎ˉ鐗囪繑宸ユ暟鎹�
                 if (countStates==0){
+                    //褰撲笅宸ュ簭鏈鏍稿垯鍒犻櫎鏈伐搴�
+                    ReportingWork reportingWork = reportingWorkMapper.selectOne(new LambdaQueryWrapper<ReportingWork>()
+                            .eq(ReportingWork::getReportingWorkId, reportingWorkId));
+                    //淇濆瓨鏃ュ織
+                    Log log = new Log();
+                    log.setContent(reportingWorkId+"-"+processId+"-"+thisProcess);
+                    log.setFunction("deleteWork鎶ュ伐鍒犻櫎");
+                    log.setOperatorId(userId);
+                    log.setOperator(userName);
+
+
                     //鍒ゆ柇鏄惁鏄叆搴撳伐搴�
                     if (lastProcess.equals(thisProcess)) {//鏄叆搴撳伐搴�
                         //鏌ヨ璇ユ祦绋嬪崱鏁伴噺銆佸彲鍏ュ簱鏁伴噺銆佸凡鍏ュ簱鏁伴噺
@@ -619,12 +963,6 @@
                                 }
                                 //鍒犻櫎鎶ュ伐锛屽皢瀹℃牳鐘舵�佹敼涓�-1
                                 reportingWorkMapper.deleteWork(reportingWorkId);
-                                //淇濆瓨鏃ュ織
-                                Log log = new Log();
-                                log.setContent(reportingWorkId+"-"+processId+"-"+thisProcess);
-                                log.setFunction("deleteWork鎶ュ伐鍏ュ簱鍒犻櫎");
-                                log.setOperatorId(userId);
-                                log.setOperator(userName);
                                 logService.saveLog(log);
                                 return true;
                             } else {
@@ -633,6 +971,19 @@
                         }
 
                     } else {//涓嶆槸鍏ュ簱宸ュ簭
+                        if(reportingWork.getReviewedState()==0){
+                            //鏌ヨ褰撳墠鎶ュ伐缂栧彿瀹屽伐娆$牬鏁伴噺鐨勬暟鎹�
+                            List<Map<String, Object>> workDateList = reportingWorkMapper.reportingWorkDate(reportingWorkId);
+                            for (Map<String, Object> item : workDateList) {
+                                //鏇存柊鎶ュ伐娴佺▼琛ㄦ暟鎹�
+                                reportingWorkMapper.updateWorkProcess(processId, item.get("order_number"), item.get("technology_number"), item.get("completed_quantity"), item.get("breakage_quantity"), thisProcess);
+                            }
+                            //鍒犻櫎鎶ュ伐锛屽皢瀹℃牳鐘舵�佹敼涓�-1
+                            reportingWorkMapper.deleteWork(reportingWorkId);
+                            logService.saveLog(log);
+                            return true;
+                        }
+
                         if (count == 0) {
                             //鏌ヨ褰撳墠鎶ュ伐缂栧彿瀹屽伐娆$牬鏁伴噺鐨勬暟鎹�
                             List<Map<String, Object>> workDateList = reportingWorkMapper.reportingWorkDate(reportingWorkId);
@@ -643,12 +994,7 @@
                             //鍒犻櫎鎶ュ伐锛屽皢瀹℃牳鐘舵�佹敼涓�-1
                             reportingWorkMapper.deleteWork(reportingWorkId);
 
-                            //淇濆瓨鏃ュ織
-                            Log log = new Log();
-                            log.setContent(reportingWorkId+"-"+processId+"-"+thisProcess);
-                            log.setFunction("deleteWork鎶ュ伐鍒犻櫎");
-                            log.setOperatorId(userId);
-                            log.setOperator(userName);
+
                             logService.saveLog(log);
                             return true;
                         } else {
@@ -662,23 +1008,40 @@
             } else {
                 return false;
             }
-
-
         } else {
             return false;
         }
     }
 
     //鏌ヨ璐ㄦ瀹℃牳
-    public Map<String, Object> selectQualityTestingSv(Integer pageNum, Integer pageSize, java.sql.Date selectTime1, java.sql.Date selectTime2, Integer state, String processId, ReportingWork reportingWork) {
+    public Map<String, Object> selectQualityTestingSv(Integer pageNum, Integer pageSize, List<String> selectDate, Integer state, String processId, ReportingWork reportingWork) {
         Integer offset = (pageNum - 1) * pageSize;
         if ("null".equals(processId)) {
             processId = "";
         }
+        String endDate = LocalDate.now().toString();
+        String startDate = LocalDate.now().minusDays(3).toString();
+        if(selectDate !=null && selectDate.size()==2){
+            if(!selectDate.get(0).isEmpty()){
+                startDate = selectDate.get(0);
+            }
+            if(!selectDate.get(1).isEmpty()){
+                endDate = selectDate.get(1);
+            }
+        }
         Map<String, Object> map = new HashMap<>();
-        map.put("data", reportingWorkMapper.selectQualityTestingMp(offset, pageSize, selectTime1, selectTime2, state, processId, reportingWork));
-        map.put("total", reportingWorkMapper.getQualityPageTotal(offset, pageSize, selectTime1, selectTime2, state, processId, reportingWork));
+        map.put("data", reportingWorkMapper.selectQualityTestingMp(offset, pageSize, startDate, endDate, state, processId, reportingWork));
+        map.put("total", reportingWorkMapper.getQualityPageTotal(offset, pageSize, startDate, endDate, state, processId, reportingWork));
+        List<String> list = new ArrayList<>();
+        list.add(startDate);
+        list.add(endDate);
+        map.put("selectDate",list);
+        return map;
+    }
 
+    public Map<String, Object>  qualityReviewSearchSv() {
+        Map<String, Object> map = new HashMap<>();
+        map.put("data", reportingWorkMapper.qualityReviewSearchMp());
         return map;
     }
 
@@ -754,7 +1117,9 @@
             List<ReportingWork> ReportingWorks = reportingWorkMapper.selectJoinList(ReportingWork.class,
                     new MPJLambdaWrapper<ReportingWork>()
                             .select(ReportingWork::getReportingWorkId)
-                            .leftJoin(ReportingWorkDetail.class, ReportingWorkDetail::getReportingWorkId, ReportingWork::getReportingWorkId)
+                            .leftJoin(ReportingWorkDetail.class,
+                                    ReportingWorkDetail::getReportingWorkId,
+                                    ReportingWork::getReportingWorkId)
                             .eq(ReportingWork::getProcessId,reportingWork.getProcessId())
                             .eq(ReportingWork::getThisProcess,reportingWork.getThisProcess())
                             .eq(ReportingWork::getDeviceName,reportingWork.getDeviceName())
@@ -769,12 +1134,7 @@
             //鍒ゆ柇鎶ュ伐琛ㄦ槸鍚﹀瓨鍦紝涓嶅瓨鍦ㄥ垯鏂板鎶ュ伐涓诲壇琛ㄦ暟鎹紝瀛樺湪鍒欎慨鏀瑰壇琛ㄦ暟鎹�
             if(ReportingWorks.isEmpty()){
                 //鑾峰彇褰撳墠鏈�澶ф姤宸ュ崟鍙风敓鎴愭姤宸ュ崟鍙�
-                String formattedNumber = String.format("%04d", reportingWorkMapper.selectMaxReportingWorkId() + 1);
-                //鏍煎紡鍖栧綋鍓嶆棩鏈�
-                Date currentDate = new Date();
-                SimpleDateFormat dateFormat = new SimpleDateFormat("yyMMdd");
-                String formattedDate = dateFormat.format(currentDate);
-                String reportingWorkId = "BG" + formattedDate + formattedNumber;
+                String reportingWorkId = this.getTodayMaxReportingId();
 
                 reportingWork.setReportingWorkId(reportingWorkId);
                 reportingWorkDetail.setReportingWorkId(reportingWorkId);
@@ -837,7 +1197,7 @@
             //灏嗗紓甯镐紶鍏ユ暟鎹簱
             SysError sysError = new SysError();
             sysError.setError(e +Arrays.toString(e.getStackTrace()));
-            sysError.setFunc("姹夌幓mes鎶ュ伐");
+            sysError.setFunc("mes鎶ュ伐");
             sysErrorService.insert(sysError);
             throw new ServiceException(Constants.Code_500, "鏁版嵁璇锋眰寮傚父锛岃妫�鏌�");
 
@@ -984,7 +1344,7 @@
                         .eq("order_sort", reportingWork.get("oldOrderNumber"))
                         .eq("review_status",0)
         );
-        if (patchLogs.isEmpty()){
+        if (!patchLogs.isEmpty()){
             result.put("msg","鏃ц鍗曞瓨鍦ㄨˉ鐗囨湭瀹℃牳鏁版嵁");
             result.put("data",false);
             return result;
@@ -995,7 +1355,7 @@
                     .eq("order_sort", reportingWork.get("oldOrderNumber"))
                     .eq("review_status",0)
         );
-        if (patchLogs.isEmpty()){
+        if (!patchLogs.isEmpty()){
             result.put("msg","鏃ц鍗曞瓨鍦ㄨ繑宸ユ湭瀹℃牳鏁版嵁锛岃鍏堝鏍告姤宸ュ悗鍐嶈繘琛岃浆鍑�");
             result.put("data",false);
             return result;
@@ -1121,7 +1481,7 @@
         //restTemplate.postForObject("http://localhost:8086/order/test",orderNumberTransferList,String.class);
 
         //鍚憁es鍙戦�乭ttp璇锋眰
-        ResponseEntity<OrderNumberTransferDTO> response =restTemplate.exchange(
+        /*ResponseEntity<OrderNumberTransferDTO> response =restTemplate.exchange(
                 "http://localhost:88/api/loadGlass/order/order/orderChange",
                 HttpMethod.POST,
                 new HttpEntity<>(orderNumberTransferList),
@@ -1133,8 +1493,295 @@
         }else{
             result.put("msg","杩炴帴mes鍝嶅簲瓒呮椂");
             result.put("data",false);
-        }
+        }*/
+
+        result.put("data",true);
         return result;
 
     }
+
+    public Map<String, Object> selectShiftQuantitySv(Map<String, Object> reportingWork) {
+        String  creatorId = (String) reportingWork.get("userId");
+        List<LocalDateTime> dateList = (List<LocalDateTime>) reportingWork.get("searchDate");
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        String startDate = LocalDateTime.now().with(LocalTime.MIN).format(formatter);
+        String endDate = LocalDateTime.now().format(formatter);
+        if (dateList.get(0)!=null){
+            startDate = String.valueOf(dateList.get(0));
+        }
+        if (dateList.get(1)!=null){
+            endDate = String.valueOf(dateList.get(1));
+        }
+        List<String> date = new ArrayList<>();
+        date.add(startDate);
+        date.add(endDate);
+        Map<String, Object> result = new HashMap<>();
+        BasicData basicData = basicDataMapper
+                .selectOne(new QueryWrapper<BasicData>()
+                        .eq("basic_name", reportingWork.get("process"))
+                        .last("limit 1")
+                );
+        result.put("data",orderProcessDetailMapper.selectShiftQuantitySv(creatorId, startDate, endDate,basicData==null?null:basicData.getNickname()));
+        result.put("date",date);
+        return result;
+    }
+
+    public Map<String, Object> selectReportingWorkRecordByPhoneSv(Map<String,Object> reportingWork) {
+        List<LocalDateTime> dateList = (List<LocalDateTime>) reportingWork.get("searchDate");
+        String startDate = LocalDate.now().minusDays(14).toString();
+        String endDate = LocalDate.now().toString();
+        if (dateList.get(0)!=null){
+            startDate = String.valueOf(dateList.get(0));
+        }
+        if (dateList.get(1)!=null){
+            endDate = String.valueOf(dateList.get(1));
+        }
+        List<String> date = new ArrayList<>();
+        date.add(startDate);
+        date.add(endDate);
+        Map<String, Object> result = new HashMap<>();
+        List<ReportingWork> reportingWorkList = reportingWorkMapper.selectList(
+                new QueryWrapper<ReportingWork>().nested(
+                                reportingWork.get("process")!=null,
+                                wrapper-> wrapper.eq("creator_id",reportingWork.get("userId"))//褰撳伐搴忎负绌烘椂锛屾煡璇㈡墍鏈夋姤宸ヤ俊鎭�
+                        )
+                        .gt("reviewed_state",-1)
+                        .between("date(reporting_work_time)",startDate,endDate)
+                        .orderByDesc("id"));
+        reportingWorkList.forEach(reportingWork1 -> {
+            String Plies =  reportingWorkDetailMapper.getGlassPliesCount(reportingWork1.getReportingWorkId());
+            reportingWork1.setProcessId(reportingWork1.getProcessId()+'/'+Plies);
+        });
+
+        result.put("data",reportingWorkList);
+        result.put("date",date);
+
+         return result;
+
+    }
+
+    public List<BasicDataProduce> selectEquipmentByProcessSv(String process) {
+           return reportingWorkMapper.SelectWorkBasicDeviceMp(process);
+    }
+
+    public String saveWorkStorage(Map<String, Object> object) {
+            //List<Map<String, Object>> flowCard = reportingWorkMapper.getStorageData();
+            //finishedGoodsInventoryService.addSelectWarehousing(object);
+            return null;
+    }
+
+    public Map<String, Object> mesBasicDataSv() {
+        Map<String, Object> map = new HashMap<>();
+        //宸ュ簭
+        map.put("process",flowCardMapper.getProcessNameList());
+        //璁惧涓嬫媺妗�
+        map.put("device", reportingWorkMapper.mesSelectWorkBasicDeviceMp());
+        //鐝粍涓嬫媺妗�
+        map.put("teams", reportingWorkMapper.mesSelectWorkBasicTeamsMp());
+        //娆$牬绫诲瀷
+        map.put("breakageType", reportingWorkMapper.selectBasicNameByType("breakagetype"));
+        //娆$牬鍘熷洜
+        map.put("breakageReason", reportingWorkMapper.selectBasicNameByType("breakagereason"));
+        return map;
+    }
+
+
+    //@Transactional(rollbackFor = Exception.class , noRollbackFor = ServiceException.class)
+    public Result mesReportingWorkSvToRedis(Map<String, Object> reportingWorkMap) throws JsonProcessingException, InterruptedException {
+
+        //璁剧疆鍥炴粴鐐�
+        //Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
+            //鎺ユ敹瑙f瀽涓婚檮琛ㄤ俊鎭�
+        String titleJson = JacksonUtil.writeValueAsString(reportingWorkMap.get("title"));
+        String detailJson = JacksonUtil.writeValueAsString(reportingWorkMap.get("detail"));
+        ReportingWork reportingWork = JacksonUtil.readValue(titleJson, ReportingWork.class);
+        ReportingWorkDetail reportingWorkDetail = JacksonUtil.readValue(detailJson, ReportingWorkDetail.class);
+        String Base_KEY = "reportingWork:"+reportingWork.getProcessId()+"/"+reportingWorkDetail.getTechnologyNumber()+":"+reportingWork.getThisProcess()+":"+reportingWork.getDeviceName();
+        String reportingWork_KEY = Base_KEY+":title";
+        String reportingWorkDetail_KEY = Base_KEY+":detail:"+reportingWorkDetail.getOrderNumber();
+
+        String process_KEY = "reportingWork:"+reportingWork.getProcessId()+"/"+reportingWorkDetail.getTechnologyNumber()+":process";
+
+        //鍒ゆ柇閿佹槸鍚﹀瓨鍦紝瀛樺湪绛夊緟5绉�
+        if(Boolean.TRUE.equals(stringRedisTemplate.hasKey("lock:reportingWork"))){
+            Thread.sleep(5*1000);
+            if(Boolean.TRUE.equals(stringRedisTemplate.hasKey("lock:reportingWork"))){
+                throw new ServiceException(Constants.Code_600, "褰撳墠鏈嶅姟鍣ㄦ鍦ㄥ鐞嗘姤宸ユ暟鎹紝璇风◢鍚庨噸璇曪紒");
+            }
+        }
+
+
+        //鍒ゆ柇宸ュ簭鏄惁瀛樺湪redis涓�
+        if(!Boolean.TRUE.equals(stringRedisTemplate.hasKey(process_KEY+":"+reportingWork.getThisProcess()))){
+            List<OrderProcessSortDTO> orderProcessSortDTOList  = orderProcessDetailMapper.selectProcessSort(
+                    reportingWork.getOrderId(),
+                    reportingWork.getProcessId(),
+                    reportingWorkDetail.getOrderNumber(),
+                    reportingWorkDetail.getTechnologyNumber()
+            );
+            if (orderProcessSortDTOList.isEmpty()){
+                throw new ServiceException(Constants.Code_600, "鏈娴嬪埌娴佺▼鍗′俊鎭紝璇锋鏌�");
+            }
+
+            orderProcessSortDTOList.forEach(orderProcessSortDTO -> {
+                Map<String, String> map = new HashMap<>();
+                map.put("sort",orderProcessSortDTO.getSort());
+                map.put("recombination",orderProcessSortDTO.getRecombination());
+                stringRedisTemplate.opsForHash().putAll(process_KEY+":"+orderProcessSortDTO.getProcess(), map);
+            });
+        }
+        String recombination = (String) stringRedisTemplate.opsForHash().get(process_KEY+":"+reportingWork.getThisProcess(),"recombination");
+
+        if (!recombination.isEmpty()){
+            throw new ServiceException(Constants.Code_600, "澶嶅悎宸ュ簭璇峰埌ERP涓繘琛屾姤宸�");
+        }
+
+
+
+
+
+        //鍒ゆ柇鏄惁redis姝ゆ姤宸ョ紪鍙穔ey鏄惁瀛樺湪
+        if(Boolean.TRUE.equals(stringRedisTemplate.hasKey(reportingWork_KEY))){
+            stringRedisTemplate.opsForHash().increment(
+                    reportingWork_KEY,
+                    "thisCompletedQuantity",
+                    reportingWork.getThisCompletedQuantity()
+            );
+        }
+        else{
+            stringRedisTemplate.opsForHash().putAll(
+                    reportingWork_KEY,
+                    JacksonUtil.readValueObjectToString(reportingWork,new TypeReference<Map<String, String>>() {})
+            );
+        }
+        //鑾峰彇鍙姤鏁伴噺
+
+        //鍒ゆ柇鏄惁redis姝ゆ姤宸ユ槑缁嗕腑key鏄惁瀛樺湪
+        if(Boolean.TRUE.equals(stringRedisTemplate.hasKey(reportingWorkDetail_KEY))){
+            stringRedisTemplate.opsForHash().increment(
+                    reportingWorkDetail_KEY,
+                    "completedQuantity",
+                    reportingWorkDetail.getCompletedQuantity()
+            );
+        }else {
+            stringRedisTemplate.opsForHash().putAll(
+                    reportingWorkDetail_KEY,
+                    JacksonUtil.readValueObjectToString(reportingWorkDetail,new TypeReference<Map<String, String>>() {})
+            );
+        }
+        return Result.success("鎻愪氦鎴愬姛");
+    }
+
+    public void redisToMysqlReportingWork() throws InterruptedException {
+        if(Boolean.TRUE.equals(stringRedisTemplate.hasKey("lock:reportingWork"))){
+            throw new ServiceException(Constants.Code_600, "瀹氭椂浠诲姟:褰撳墠鏈嶅姟鍣ㄦ鍦ㄥ鐞嗘姤宸ユ暟鎹紝璇风◢鍚庨噸璇曪紒");
+        }
+        //鑾峰彇鎵�鏈塳ey
+        String pattern = "reportingWork:*";
+        Set<String> keys = stringRedisTemplate.keys(pattern);
+
+        //鍒ゆ柇redis涓槸鍚﹀瓨鍦ㄦ姤宸ユ暟鎹�,瀛樺湪鍒欐坊鍔犻攣 骞朵笖淇敼key杞Щ鍒颁笂浼爉ysql鐨刱ey涓�
+        if (keys != null && !keys.isEmpty()) {
+            //娣诲姞閿�
+            stringRedisTemplate.opsForValue().set("lock:reportingWork","1",60, TimeUnit.SECONDS);
+
+            if(Boolean.FALSE.equals(stringRedisTemplate.hasKey("upload:*" ))){
+                keys.forEach(key -> {
+                    stringRedisTemplate.rename(key, "upload:" + key);
+                });
+            }
+        }
+        //娣诲姞鏆傚仠鏃堕棿锛屾柟寮忚幏鍙杕ap鏃讹紝redis涓暟鎹繕鍦ㄥ彉鍖�
+        Thread.sleep(200);
+
+
+        // 淇濆瓨鏃ュ織锛屾妸redis涓殑鏁版嵁淇濆瓨鍒版棩蹇椾腑
+        Map<String, Map<Object, Object>> map = this.getAllHashesByPattern("upload:reportingWork:*");
+        Log log = new Log();
+        log.setContent(JacksonUtil.writeValueAsString(map));
+        log.setFunction("reportingWorkRedisToMysql");
+        log.setOperator("鑷姩瀹氭椂鎶ュ伐");
+        logService.saveLog(log);
+        //鍒犻櫎閿侊紝璁╂帴鍙g户缁帴鏀舵姤宸�
+        stringRedisTemplate.delete("lock:reportingWork");
+
+        //鑾峰彇鍒版墍鏈夊弬鏁板悗娓呯┖redis搴�
+        // stringRedisTemplate.getConnectionFactory().getConnection().flushDb();
+
+        //浠巖edis涓幏鍙栨墍鏈夋姤宸ヤ富琛ㄦ暟鎹�
+        String titleKeyString = "upload:reportingWork:*:title";
+        Set<String> titleKeys = stringRedisTemplate.keys(titleKeyString);
+        if (titleKeys != null) {
+            titleKeys.forEach(titleKey -> {
+                ReportingWork reportingWork = JSON.parseObject(
+                        JSONObject.toJSONString(stringRedisTemplate.opsForHash().entries(titleKey))
+                        , ReportingWork.class
+                );
+                //鑾峰彇褰撳ぉ涓�鍏辨湁澶氬皯涓姤宸ョ紪鍙�
+                String reportingWorkId = this.getTodayMaxReportingId();
+                //娣诲姞鎶ュ伐缂栧彿
+                reportingWork.setReportingWorkId(reportingWorkId);
+                //寰�涓昏〃鎻掑叆鎶ュ伐涓绘暟鎹�
+                reportingWorkMapper.insert(reportingWork);
+
+                String detailKeyString = titleKey.replace(":title", ":detail:*");
+                Set<String> detailKeys = stringRedisTemplate.keys(detailKeyString);
+                if (detailKeys != null) {
+                    detailKeys.forEach(detailKey -> {
+
+                        ReportingWorkDetail reportingWorkDetail = JSON.parseObject(
+                                JSONObject.toJSONString(stringRedisTemplate.opsForHash().entries(detailKey))
+                                , ReportingWorkDetail.class
+                        );
+                        reportingWorkDetail.setReportingWorkId(reportingWorkId);
+                        reportingWorkDetailMapper.insert(reportingWorkDetail);
+
+                        //鏍规嵁璁㈠崟id锛岃鍗曞簭鍙凤紝浠ュ強灏忕墖搴忓彿 鏇存柊灏忕墖娴佺▼鐨勫畬宸ユ暟閲忎互鍙婂埡鐮存暟閲�
+                        LambdaUpdateWrapper<OrderProcessDetail> updateWrapper = new LambdaUpdateWrapper<>();
+                        updateWrapper.eq(OrderProcessDetail::getOrderNumber, reportingWorkDetail.getOrderNumber())
+                                .eq(OrderProcessDetail::getProcessId, reportingWork.getProcessId())
+                                .eq(OrderProcessDetail::getOrderId, reportingWork.getOrderId())
+                                .eq(OrderProcessDetail::getProcess, reportingWork.getThisProcess())
+                                .eq(OrderProcessDetail::getTechnologyNumber, reportingWorkDetail.getTechnologyNumber())
+                                .setSql("reporting_work_num_count = reporting_work_num_count +" + reportingWorkDetail.getCompletedQuantity())
+                                .setSql("reporting_work_num =reporting_work_num +" + reportingWorkDetail.getCompletedQuantity());
+
+                        orderProcessDetailMapper.update(null, updateWrapper);
+                    });
+                }
+
+            });
+        }
+        Set<String> uploadKeys = stringRedisTemplate.keys("upload:reportingWork:*");
+        if (uploadKeys != null) {
+            stringRedisTemplate.delete(uploadKeys);
+        }
+
+    }
+
+    public String getTodayMaxReportingId() {
+        String formattedNumber = String.format("%04d", reportingWorkMapper.selectMaxReportingWorkId() + 1);
+        //鏍煎紡鍖栧綋鍓嶆棩鏈�
+        Date currentDate = new Date();
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyMMdd");
+        String formattedDate = dateFormat.format(currentDate);
+        return "BG" + formattedDate + formattedNumber;
+
+    }
+
+
+/*鑾峰彇鎵�鏈夌殑鍙傛暟杞�*/
+    public Map<String, Map<Object, Object>> getAllHashesByPattern(String pattern) {
+        Set<String> keys = stringRedisTemplate.keys(pattern);
+        Map<String, Map<Object, Object>> result = new HashMap<>();
+
+        if (keys != null) {
+            for (String key : keys) {
+                Map<Object, Object> hashData = stringRedisTemplate.opsForHash().entries(key);
+                result.put(key, hashData);
+            }
+        }
+
+        return result;
+    }
 }

--
Gitblit v1.8.0