From a447cde05b79c4dac8c0f1e92e3a4533f90161bc Mon Sep 17 00:00:00 2001 From: xupei Date: Wed, 2 Jul 2025 16:16:15 +0800 Subject: [PATCH] =?UTF-8?q?TASK:=20=E6=89=B9=E9=87=8F=E7=94=9F=E6=88=90?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E4=BB=BB=E5=8A=A1=E5=BA=8F=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/da/controller/ProjectController.java | 2 +- .../primary/entity/BatchTaskSequence.java | 4 +- .../com/ai/da/service/ProjectService.java | 4 +- .../ai/da/service/impl/DesignServiceImpl.java | 9 +++ .../da/service/impl/ProjectServiceImpl.java | 62 +++++++++++++------ 5 files changed, 58 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/ai/da/controller/ProjectController.java b/src/main/java/com/ai/da/controller/ProjectController.java index 4d76935c..f4611956 100644 --- a/src/main/java/com/ai/da/controller/ProjectController.java +++ b/src/main/java/com/ai/da/controller/ProjectController.java @@ -146,7 +146,7 @@ public class ProjectController { @GetMapping("/getNextSequence") public Response getNextSequence(){ - return Response.success(projectService.getNextSequence()); + return Response.success(projectService.getOrCreateSequence()); } diff --git a/src/main/java/com/ai/da/mapper/primary/entity/BatchTaskSequence.java b/src/main/java/com/ai/da/mapper/primary/entity/BatchTaskSequence.java index d8a90feb..69908e28 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/BatchTaskSequence.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/BatchTaskSequence.java @@ -12,5 +12,7 @@ public class BatchTaskSequence extends BaseEntity{ private Long accountId; - private Integer currentSequence; + private Integer nextSeq; + + private Integer lockedSeq; } diff --git a/src/main/java/com/ai/da/service/ProjectService.java b/src/main/java/com/ai/da/service/ProjectService.java index 7920c3f8..ef40585c 100644 --- a/src/main/java/com/ai/da/service/ProjectService.java +++ b/src/main/java/com/ai/da/service/ProjectService.java @@ -28,5 +28,7 @@ public interface ProjectService extends IService { List getByProjectNameLike(String projectName); - Integer getNextSequence(); + Integer getOrCreateSequence(); + + void clearLockedSequence(Long accountId); } diff --git a/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java index 7c2f7784..cb977120 100644 --- a/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java @@ -1943,6 +1943,9 @@ public class DesignServiceImpl extends ServiceImpl impleme cloudTask.setStatus(0); cloudTask.setAccountId(userInfo.getId()); cloudTaskMapper.insert(cloudTask); + // 解除锁后可以获取下一个序号 + projectService.clearLockedSequence(userHolder.getId()); + UserLikeGroup userLikeGroup = userLikeGroupService.getByProjectId(projectId); Long userLikeGroupId = null; ToProductImageRecord toProductImageRecord = new ToProductImageRecord(); @@ -2123,6 +2126,8 @@ public class DesignServiceImpl extends ServiceImpl impleme cloudTask.setStatus(0); cloudTask.setAccountId(userInfo.getId()); cloudTaskMapper.insert(cloudTask); + // 解除锁后可以获取下一个序号 + projectService.clearLockedSequence(userHolder.getId()); UserLikeGroup userLikeGroup = userLikeGroupService.getByProjectId(projectId); Long userLikeGroupId = null; @@ -2288,6 +2293,8 @@ public class DesignServiceImpl extends ServiceImpl impleme cloudTask.setUpdateTime(now); cloudTask.setStatus(0); cloudTaskMapper.insert(cloudTask); + // 解除锁后可以获取下一个序号 + projectService.clearLockedSequence(userHolder.getId()); List poseTransformList = cloudTaskDTO.getPoseTransform(); if (CollectionUtil.isNotEmpty(poseTransformList)) { @@ -2545,6 +2552,8 @@ public class DesignServiceImpl extends ServiceImpl impleme cloudTask.setStatus(0); cloudTask.setAccountId(userInfo.getId()); cloudTaskMapper.insert(cloudTask); + // 解除锁后可以获取下一个序号 + projectService.clearLockedSequence(userHolder.getId()); return taskId; } diff --git a/src/main/java/com/ai/da/service/impl/ProjectServiceImpl.java b/src/main/java/com/ai/da/service/impl/ProjectServiceImpl.java index 43c396ef..112bf572 100644 --- a/src/main/java/com/ai/da/service/impl/ProjectServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/ProjectServiceImpl.java @@ -6,6 +6,7 @@ import com.ai.da.mapper.primary.*; import com.ai.da.mapper.primary.entity.*; import com.ai.da.service.*; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.springframework.dao.DuplicateKeyException; @@ -44,30 +45,51 @@ public class ProjectServiceImpl extends ServiceImpl impl } @Resource - private BatchTaskSequenceMapper batchTaskSequenceMapper; + private BatchTaskSequenceMapper sequenceMapper; + + /** + * 获取或创建用户的任务序号 + * @return 当前可用的序号 + */ + @Transactional + public synchronized Integer getOrCreateSequence() { - @Transactional(rollbackFor = Exception.class) - public Integer getNextSequence() { Long accountId = UserContext.getUserHolder().getId(); - // 1. 尝试插入新记录(如果用户不存在) - BatchTaskSequence newCounter = new BatchTaskSequence(); - newCounter.setAccountId(accountId); - newCounter.setCurrentSequence(1); - newCounter.setCreateTime(LocalDateTime.now()); + // 1. 检查是否已有锁定序号 + BatchTaskSequence sequence = sequenceMapper.selectOne( + Wrappers.lambdaQuery() + .eq(BatchTaskSequence::getAccountId, accountId)); - try { - batchTaskSequenceMapper.insert(newCounter); + if (sequence != null && sequence.getLockedSeq() != null) { + return sequence.getLockedSeq(); + } + + // 2. 没有锁定序号,创建新记录或获取新序号 + if (sequence == null) { + sequence = new BatchTaskSequence(); + sequence.setAccountId(accountId); + sequence.setNextSeq(2); // 第一次返回1,下次从2开始 + sequence.setLockedSeq(1); + sequenceMapper.insert(sequence); return 1; - } catch (DuplicateKeyException e) { - // 2. 用户已存在,执行递增操作 - batchTaskSequenceMapper.incrementSequence(accountId); - Integer sequence = batchTaskSequenceMapper.getLastInsertId(); - - // 3. 验证获取的序号 - if (sequence == null) { - throw new RuntimeException("获取序号失败"); - } - return sequence; + } else { + Integer seq = sequence.getNextSeq(); + sequence.setLockedSeq(seq); + sequence.setNextSeq(seq + 1); + sequenceMapper.updateById(sequence); + return seq; } } + + /** + * 清除锁定序号状态(用于确认使用或取消操作) + * @param accountId 用户ID + */ + @Transactional + public void clearLockedSequence(Long accountId) { + sequenceMapper.update(null, + Wrappers.lambdaUpdate() + .set(BatchTaskSequence::getLockedSeq, null) + .eq(BatchTaskSequence::getAccountId, accountId)); + } } \ No newline at end of file