From 26dc5221f84b6cbb3a03f04423ef1736f657f293 Mon Sep 17 00:00:00 2001
From: zhanghl <253316343@qq.com>
Date: 星期一, 19 五月 2025 15:06:00 +0800
Subject: [PATCH] 钣金工单计划:增加Redis锁 和 业务幂等判断
---
aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlanTaskServiceImpl.java | 55 ++++++++++++++++++++++++++-
aps-modules/aps-core/src/main/java/com/aps/core/service/ApsPlanTaskService.java | 3 +
aps-modules/aps-core/src/main/java/com/aps/core/enums/REDIS_LOCK_KEY.java | 17 ++++++++
aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsPlate/ApsPlateStandardRequireController.java | 7 +--
aps-common/aps-common-redis/src/main/java/com/aps/common/redis/service/RedisLockUtils.java | 7 +++
5 files changed, 82 insertions(+), 7 deletions(-)
diff --git a/aps-common/aps-common-redis/src/main/java/com/aps/common/redis/service/RedisLockUtils.java b/aps-common/aps-common-redis/src/main/java/com/aps/common/redis/service/RedisLockUtils.java
index 659c1fe..4460773 100644
--- a/aps-common/aps-common-redis/src/main/java/com/aps/common/redis/service/RedisLockUtils.java
+++ b/aps-common/aps-common-redis/src/main/java/com/aps/common/redis/service/RedisLockUtils.java
@@ -26,6 +26,13 @@
/**
+ * 鍒ゆ柇鏄惁瀛樺湪閿�
+ * */
+ public boolean existLock(String key,String value){
+ return this.redisTemplate.opsForValue().get(key).equals(value);
+ }
+
+ /**
* 鍔犻攣
**/
public Boolean getLock(String key,String value,Long timeoutSeconds){
diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsPlate/ApsPlateStandardRequireController.java b/aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsPlate/ApsPlateStandardRequireController.java
index b9da482..80fdbaf 100644
--- a/aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsPlate/ApsPlateStandardRequireController.java
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsPlate/ApsPlateStandardRequireController.java
@@ -138,14 +138,11 @@
/**
* 鐢熸垚閽i噾璁″垝
* */
+
@PostMapping("/generatorPlan")
public AjaxResult generatorPlan()
{
- String batchNum= requireBatchService.getNewBatchNumber();
- planTaskService.savePlanTask(batchNum);
- apsPlateStandardRequireService.generatorPlan(batchNum);
- planTaskService.updateTaskStatus(batchNum, PLAN_TASK_STATUS.FINISHED);
- return success();
+ return planTaskService.generatorPlan();
}
}
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
new file mode 100644
index 0000000..3efba69
--- /dev/null
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/enums/REDIS_LOCK_KEY.java
@@ -0,0 +1,17 @@
+package com.aps.core.enums;
+
+public enum REDIS_LOCK_KEY {
+
+ /*閽i噾宸ュ崟璁″垝浠诲姟*/
+ PLATE_ORDER_PLAN("PLAN_TASK:PLATE_ORDER_PLAN");
+
+ private String key;
+
+ public String getKey() {
+ return key;
+ }
+
+ REDIS_LOCK_KEY(String key) {
+ this.key = key;
+ }
+}
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 217acc1..ae44ce9 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
@@ -1,5 +1,6 @@
package com.aps.core.service;
+import com.aps.common.core.web.domain.AjaxResult;
import com.aps.core.domain.ApsPlanTask;
import com.aps.core.enums.PLAN_TASK_STATUS;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -20,4 +21,6 @@
void savePlanTask(String batchNum);
void updateTaskStatus(String batchNum, PLAN_TASK_STATUS status);
+
+ AjaxResult generatorPlan();
}
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 36fd10b..383f5f6 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,34 +1,52 @@
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;
import com.aps.common.security.utils.SecurityUtils;
import com.aps.core.enums.PLAN_TASK_STATUS;
import com.aps.core.enums.PLAN_TASK_TYPE;
+import com.aps.core.enums.REDIS_LOCK_KEY;
+import com.aps.core.service.ApsPlate.IApsPlateStandardRequireBatchService;
+import com.aps.core.service.ApsPlate.IApsPlateStandardRequireService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.aps.core.domain.ApsPlanTask;
import com.aps.core.service.ApsPlanTaskService;
import com.aps.core.mapper.ApsPlanTaskMapper;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
-import java.util.List;
+import static com.aps.common.core.web.domain.AjaxResult.success;
+import static com.aps.core.enums.REDIS_LOCK_KEY.PLATE_ORDER_PLAN;
/**
* @author zhl
* @description 閽堝琛ㄣ�恆ps_plan_task(璁″垝鐢熸垚鏃ュ織琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
* @createDate 2025-05-16 14:41:49
*/
+
+@Slf4j
@Service
public class ApsPlanTaskServiceImpl extends ServiceImpl<ApsPlanTaskMapper, ApsPlanTask> implements ApsPlanTaskService{
@Autowired
ApsPlanTaskMapper mapper;
+ @Autowired
+ private IApsPlateStandardRequireService apsPlateStandardRequireService;
+ @Resource
+ IApsPlateStandardRequireBatchService requireBatchService;
+ @Resource
+ RedisLockUtils redisLockUtils;
+
+ @Override
public Page<ApsPlanTask> pagingList(Page<ApsPlanTask> page ,ApsPlanTask task){
LambdaQueryWrapper<ApsPlanTask> queryWrapper=new LambdaQueryWrapper<>();
queryWrapper.like( !task.getTaskType().isEmpty(), ApsPlanTask::getTaskType,task.getTaskType());
@@ -65,6 +83,39 @@
.build();
baseMapper.update(task,queryWrapper);
}
+
+ @Override
+ public AjaxResult generatorPlan()
+ {
+ String plateOrderPlanKey = PLATE_ORDER_PLAN.getKey();
+ boolean existsLock = redisLockUtils.existLock(plateOrderPlanKey, PLAN_TASK_TYPE.PLATE_PLAN.getCode());
+ if (existsLock){
+ return AjaxResult.warn("閽i噾宸ュ崟璁″垝浠诲姟姝e湪鎵ц涓�!");
+ }
+ LambdaQueryWrapper<ApsPlanTask> queryWrapper=new LambdaQueryWrapper<>();
+ queryWrapper.eq(ApsPlanTask::getTaskType,PLAN_TASK_TYPE.PLATE_PLAN.getCode());
+ queryWrapper.eq(ApsPlanTask::getTaskStatus,PLAN_TASK_STATUS.IN_PROCESS.getCode());
+ boolean existsDbTask = mapper.exists(queryWrapper);
+ if (existsDbTask){
+ return AjaxResult.warn("閽i噾宸ュ崟璁″垝浠诲姟姝e湪鎵ц涓�!!");
+ }
+ try {
+ redisLockUtils.getLock(plateOrderPlanKey,PLAN_TASK_TYPE.PLATE_PLAN.getCode(), 3*60L);
+ String batchNum= requireBatchService.getNewBatchNumber();
+ this.savePlanTask(batchNum);
+ apsPlateStandardRequireService.generatorPlan(batchNum);
+ this.updateTaskStatus(batchNum, PLAN_TASK_STATUS.FINISHED);
+ log.info("璁″垝浠诲姟鎵ц瀹屾垚!"+batchNum);
+ return success();
+ }catch (Exception e){
+ redisLockUtils.releaseLock(plateOrderPlanKey,PLAN_TASK_TYPE.PLATE_PLAN.getCode());
+ log.error("璁″垝浠诲姟鎵ц澶辫触!"+e.getMessage());
+ return AjaxResult.error("璁″垝浠诲姟鎵ц澶辫触!"+e.getMessage());
+ }finally {
+ redisLockUtils.releaseLock(plateOrderPlanKey,PLAN_TASK_TYPE.PLATE_PLAN.getCode());
+ }
+ }
+
}
--
Gitblit v1.9.3