TASK: 批量生成获取任务序号

This commit is contained in:
2025-07-02 16:16:15 +08:00
parent e8ad241653
commit a447cde05b
5 changed files with 58 additions and 23 deletions

View File

@@ -146,7 +146,7 @@ public class ProjectController {
@GetMapping("/getNextSequence")
public Response<Integer> getNextSequence(){
return Response.success(projectService.getNextSequence());
return Response.success(projectService.getOrCreateSequence());
}

View File

@@ -12,5 +12,7 @@ public class BatchTaskSequence extends BaseEntity{
private Long accountId;
private Integer currentSequence;
private Integer nextSeq;
private Integer lockedSeq;
}

View File

@@ -28,5 +28,7 @@ public interface ProjectService extends IService<Project> {
List<Project> getByProjectNameLike(String projectName);
Integer getNextSequence();
Integer getOrCreateSequence();
void clearLockedSequence(Long accountId);
}

View File

@@ -1943,6 +1943,9 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> 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<DesignMapper, Design> 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<DesignMapper, Design> impleme
cloudTask.setUpdateTime(now);
cloudTask.setStatus(0);
cloudTaskMapper.insert(cloudTask);
// 解除锁后可以获取下一个序号
projectService.clearLockedSequence(userHolder.getId());
List<PoseTransformBatchDTO> poseTransformList = cloudTaskDTO.getPoseTransform();
if (CollectionUtil.isNotEmpty(poseTransformList)) {
@@ -2545,6 +2552,8 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
cloudTask.setStatus(0);
cloudTask.setAccountId(userInfo.getId());
cloudTaskMapper.insert(cloudTask);
// 解除锁后可以获取下一个序号
projectService.clearLockedSequence(userHolder.getId());
return taskId;
}

View File

@@ -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<ProjectMapper, Project> 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.<BatchTaskSequence>lambdaQuery()
.eq(BatchTaskSequence::getAccountId, accountId));
try {
batchTaskSequenceMapper.insert(newCounter);
return 1;
} catch (DuplicateKeyException e) {
// 2. 用户已存在,执行递增操作
batchTaskSequenceMapper.incrementSequence(accountId);
Integer sequence = batchTaskSequenceMapper.getLastInsertId();
if (sequence != null && sequence.getLockedSeq() != null) {
return sequence.getLockedSeq();
}
// 3. 验证获取序号
// 2. 没有锁定序号,创建新记录或获取序号
if (sequence == null) {
throw new RuntimeException("获取序号失败");
sequence = new BatchTaskSequence();
sequence.setAccountId(accountId);
sequence.setNextSeq(2); // 第一次返回1下次从2开始
sequence.setLockedSeq(1);
sequenceMapper.insert(sequence);
return 1;
} else {
Integer seq = sequence.getNextSeq();
sequence.setLockedSeq(seq);
sequence.setNextSeq(seq + 1);
sequenceMapper.updateById(sequence);
return seq;
}
return sequence;
}
/**
* 清除锁定序号状态(用于确认使用或取消操作)
* @param accountId 用户ID
*/
@Transactional
public void clearLockedSequence(Long accountId) {
sequenceMapper.update(null,
Wrappers.<BatchTaskSequence>lambdaUpdate()
.set(BatchTaskSequence::getLockedSeq, null)
.eq(BatchTaskSequence::getAccountId, accountId));
}
}