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