From 1c61a282a831cea285ddb503bdb810df9250b191 Mon Sep 17 00:00:00 2001
From: zhanghl <253316343@qq.com>
Date: 星期五, 23 五月 2025 16:44:27 +0800
Subject: [PATCH] [钣金计划大表] 增加分布式锁

---
 aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlanTaskServiceImpl.java                            |   39 ++++++++++++++++++-
 aps-modules/aps-core/src/main/java/com/aps/core/enums/PLAN_TASK_TYPE.java                                           |    4 +-
 aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlate/ApsPlateProcessStatServiceImpl.java           |   11 +++--
 aps-modules/aps-core/src/main/java/com/aps/core/service/ApsPlanTaskService.java                                     |    2 +
 aps-modules/aps-core/src/main/java/com/aps/core/enums/REDIS_LOCK_KEY.java                                           |    5 +-
 aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsPlate/ApsPlateProcessShopStatController.java |   11 +++--
 aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlate/ApsPlateProcessShopStatServiceImpl.java       |    2 
 7 files changed, 58 insertions(+), 16 deletions(-)

diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsPlate/ApsPlateProcessShopStatController.java b/aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsPlate/ApsPlateProcessShopStatController.java
index 931dbc8..74218eb 100644
--- a/aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsPlate/ApsPlateProcessShopStatController.java
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsPlate/ApsPlateProcessShopStatController.java
@@ -6,9 +6,11 @@
 import com.aps.common.log.enums.BusinessType;
 import com.aps.common.security.annotation.RequiresPermissions;
 import com.aps.core.domain.ApsPlate.ApsPlateProcessShopStat;
+import com.aps.core.service.ApsPlanTaskService;
 import com.aps.core.service.ApsPlate.IApsPlateProcessShopStatService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
 import jakarta.servlet.http.HttpServletResponse;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -27,7 +29,8 @@
 {
     @Autowired
     private IApsPlateProcessShopStatService apsPlateProcessShopStatService;
-
+    @Resource
+    ApsPlanTaskService apsPlanTaskService;
 
     /**
      * 瀵煎嚭閽i噾杞﹂棿缁熻鍒楄〃
@@ -48,13 +51,13 @@
 
     @Operation(summary = "閽i噾璁″垝澶ц〃", description = "鏇存柊缁熻鏁版嵁")
     @Log(title = "閽i噾杞﹂棿缁熻", businessType = BusinessType.UPDATE)
-    @RequiresPermissions("plateProcessShopStat:update")
+    //@RequiresPermissions("plateProcessShopStat:update")
     @PostMapping("/update")
     public AjaxResult update()
     {
         try {
-            apsPlateProcessShopStatService.saveShopStat();
-            return toAjax(true);
+
+           return  apsPlanTaskService.generatorPlatePlanTable();
         } catch (Exception e) {
           return AjaxResult.error("鏇存柊澶辫触锛�"+e.getMessage());
         }
diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/enums/PLAN_TASK_TYPE.java b/aps-modules/aps-core/src/main/java/com/aps/core/enums/PLAN_TASK_TYPE.java
index 391655d..329628d 100644
--- a/aps-modules/aps-core/src/main/java/com/aps/core/enums/PLAN_TASK_TYPE.java
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/enums/PLAN_TASK_TYPE.java
@@ -2,8 +2,8 @@
 
 public enum PLAN_TASK_TYPE {
 
-    PLATE_PLAN("PlateOrderPlan","鐢熸垚閽i噾宸ュ崟璁″垝");
-
+    PLATE_PLAN("PlateOrderPlan","鐢熸垚閽i噾宸ュ崟璁″垝"),
+    PLATE_SHOP_PLAN_TABLE("PlateShopPlanTable","鐢熸垚閽i噾璁″垝澶ц〃");
     private String code;
     private String desc;
 
diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/enums/REDIS_LOCK_KEY.java b/aps-modules/aps-core/src/main/java/com/aps/core/enums/REDIS_LOCK_KEY.java
index 3efba69..f26dea0 100644
--- a/aps-modules/aps-core/src/main/java/com/aps/core/enums/REDIS_LOCK_KEY.java
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/enums/REDIS_LOCK_KEY.java
@@ -3,8 +3,9 @@
 public enum REDIS_LOCK_KEY {
 
     /*閽i噾宸ュ崟璁″垝浠诲姟*/
-    PLATE_ORDER_PLAN("PLAN_TASK:PLATE_ORDER_PLAN");
-
+    PLATE_ORDER_PLAN("PLAN_TASK:PLATE_ORDER_PLAN"),
+    /*閽i噾璁″垝澶ц〃*/
+    PLATE_SHOP_PLAN_TABLE("PLAN_TASK:PLATE_SHOP_PLAN_TABLE");
     private String key;
 
     public String getKey() {
diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/service/ApsPlanTaskService.java b/aps-modules/aps-core/src/main/java/com/aps/core/service/ApsPlanTaskService.java
index ae44ce9..c8f0ab4 100644
--- a/aps-modules/aps-core/src/main/java/com/aps/core/service/ApsPlanTaskService.java
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/service/ApsPlanTaskService.java
@@ -23,4 +23,6 @@
     void updateTaskStatus(String batchNum, PLAN_TASK_STATUS status);
 
     AjaxResult generatorPlan();
+
+    AjaxResult generatorPlatePlanTable();
 }
diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlanTaskServiceImpl.java b/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlanTaskServiceImpl.java
index d00d0af..7965f89 100644
--- a/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlanTaskServiceImpl.java
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlanTaskServiceImpl.java
@@ -1,7 +1,6 @@
 package com.aps.core.service.impl;
 
 import cn.hutool.core.util.IdUtil;
-import com.aps.common.core.domain.R;
 import com.aps.common.core.utils.DateUtils;
 import com.aps.common.core.web.domain.AjaxResult;
 import com.aps.common.redis.service.RedisLockUtils;
@@ -10,9 +9,9 @@
 import com.aps.core.enums.PLAN_TASK_TYPE;
 import com.aps.core.enums.REDIS_LOCK_KEY;
 import com.aps.core.mapper.ApsPlateStandardRequireOrderEndDayMapper;
+import com.aps.core.service.ApsPlate.IApsPlateProcessShopStatService;
 import com.aps.core.service.ApsPlate.IApsPlateStandardRequireBatchService;
 import com.aps.core.service.ApsPlate.IApsPlateStandardRequireService;
-import com.aps.core.service.ApsPlateStandardRequireOrderEndDayService;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -26,6 +25,7 @@
 
 import static com.aps.common.core.web.domain.AjaxResult.success;
 import static com.aps.core.enums.REDIS_LOCK_KEY.PLATE_ORDER_PLAN;
+
 
 /**
 * @author zhl
@@ -50,6 +50,9 @@
 
     @Resource
     ApsPlateStandardRequireOrderEndDayMapper  orderEndDayMapper;
+
+    @Resource
+    IApsPlateProcessShopStatService plateProcessShopStatService;
 
     @Override
     public Page<ApsPlanTask> pagingList(Page<ApsPlanTask> page ,ApsPlanTask task){
@@ -123,6 +126,38 @@
             redisLockUtils.releaseLock(plateOrderPlanKey, PLAN_TASK_TYPE.PLATE_PLAN.getCode());
         }
     }
+    @Override
+    public AjaxResult generatorPlatePlanTable() {
+        String plateOrderPlanKey = REDIS_LOCK_KEY.PLATE_SHOP_PLAN_TABLE.getKey();
+        boolean existsLock = redisLockUtils.existLock(plateOrderPlanKey, PLAN_TASK_TYPE.PLATE_SHOP_PLAN_TABLE.getCode());
+        if (existsLock) {
+            return AjaxResult.warn("閽i噾璁″垝澶ц〃璁″垝浠诲姟姝e湪鎵ц涓�!");
+        }
+        LambdaQueryWrapper<ApsPlanTask> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(ApsPlanTask::getTaskType, PLAN_TASK_TYPE.PLATE_SHOP_PLAN_TABLE.getCode());
+        queryWrapper.eq(ApsPlanTask::getTaskStatus, PLAN_TASK_STATUS.IN_PROCESS.getCode());
+        boolean existsDbTask = mapper.exists(queryWrapper);
+        if (existsDbTask) {
+            return AjaxResult.warn("閽i噾璁″垝澶ц〃浠诲姟姝e湪鎵ц涓�!!");
+        }
+        String currentBatchNum =  String.valueOf(IdUtil.getSnowflakeNextId()) ;
+        try {
+            redisLockUtils.getLock(plateOrderPlanKey, PLAN_TASK_TYPE.PLATE_SHOP_PLAN_TABLE.getCode(), 15 * 60L);
+            this.savePlanTask( currentBatchNum);
+            Thread.sleep(60000);
+            plateProcessShopStatService.saveShopStat();
+            this.updateTaskStatus(currentBatchNum, PLAN_TASK_STATUS.FINISHED);
+            log.info("閽i噾璁″垝澶ц〃浠诲姟鎵ц瀹屾垚!" + currentBatchNum);
+            return success();
+        } catch (Exception e) {
+            redisLockUtils.releaseLock(plateOrderPlanKey, PLAN_TASK_TYPE.PLATE_SHOP_PLAN_TABLE.getCode());
+            log.error("閽i噾璁″垝澶ц〃浠诲姟鎵ц澶辫触!" + e.getMessage());
+            this.updateTaskStatus(currentBatchNum, PLAN_TASK_STATUS.ERROR);
+            return AjaxResult.error("閽i噾璁″垝澶ц〃浠诲姟鎵ц澶辫触!" + e.getMessage());
+        } finally {
+            redisLockUtils.releaseLock(plateOrderPlanKey, PLAN_TASK_TYPE.PLATE_SHOP_PLAN_TABLE.getCode());
+        }
+    }
 
 }
 
diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlate/ApsPlateProcessShopStatServiceImpl.java b/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlate/ApsPlateProcessShopStatServiceImpl.java
index 6a23bcf..b492865 100644
--- a/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlate/ApsPlateProcessShopStatServiceImpl.java
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlate/ApsPlateProcessShopStatServiceImpl.java
@@ -304,7 +304,7 @@
         List<SysDictData> documentStatusDic = DictUtils.getDictCache("aps_document_status");
 
         // 鏋勫缓缁撴灉鍒楄〃
-        planList.forEach(
+        planList.stream().parallel().forEach(
                  plan -> {
                     // 鏍规嵁 docNo 鑾峰彇瀵瑰簲鐨� shopStatList
                     List<ApsPlateProcessShopStat> shopStatList = shopStatesByDocNo.getOrDefault(plan.getDocumentNumber(), Collections.emptyList());
diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlate/ApsPlateProcessStatServiceImpl.java b/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlate/ApsPlateProcessStatServiceImpl.java
index 55507be..de1582f 100644
--- a/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlate/ApsPlateProcessStatServiceImpl.java
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlate/ApsPlateProcessStatServiceImpl.java
@@ -112,11 +112,13 @@
         String batchNum = IdUtils.fastSimpleUUID();
         List<ApsPlateProcessStat> tempList = apsPlateProcessStatMapper.queryTempStat();
         Map<String, List<ApsPlateProcessStat>> groupByOrderNo = tempList.stream().collect(groupingBy(ApsPlateProcessStat::getWorkOrderNo));
-        Boolean hasBefore = false;
+
         LocalDateTime now = LocalDateTime.now();
         List<ApsPlateProcessStat> totalList=new ArrayList<>();
-        for (Map.Entry<String, List<ApsPlateProcessStat>> entry : groupByOrderNo.entrySet()) {
-            List<ApsPlateProcessStat> statPerOrder = entry.getValue();
+        ArrayList<Map.Entry<String, List<ApsPlateProcessStat>>> orderProcessRoutes = new ArrayList<>(groupByOrderNo.entrySet());
+        orderProcessRoutes.stream().parallel().forEach(x->{
+            boolean hasBefore = false;
+            List<ApsPlateProcessStat>  statPerOrder = x.getValue();
             /*num 涓烘牴鎹畬宸ユ椂闂存帓搴忓嚭鐨勫簭鍙凤紝鎸夋鎺掑簭锛屽彲淇濊瘉鏄寜瀹屽伐鏃堕棿鍊掑彊鎺掑垪*/
             statPerOrder.sort((a, b)->a.getNum().compareTo(b.getNum()));
             ApsPlateProcessStat last=null;
@@ -180,10 +182,9 @@
                 }
                 last = stat;
                 totalList.add(stat);
-                //apsPlateProcessStatMapper.insertApsPlateProcessStat(stat);
             }
             hasBefore=false;
-        }
+        });
         return totalList;
     }
 

--
Gitblit v1.9.3