feat: 增加搬运任务业务防重能力(任务3)

This commit is contained in:
zhouz
2026-08-17 10:36:13 +08:00
parent 0331aca1a9
commit b55f8dfe13
5 changed files with 61 additions and 1 deletions

View File

@@ -51,6 +51,12 @@ public interface TransportTaskApi {
@Operation(summary = "根据 taskCode 查询任务") @Operation(summary = "根据 taskCode 查询任务")
CommonResult<TaskInfoDTO> getTaskByCode(@RequestParam("taskCode") String taskCode); CommonResult<TaskInfoDTO> getTaskByCode(@RequestParam("taskCode") String taskCode);
@GetMapping(PREFIX + "/getUnfinishedTaskByBiz")
@Operation(summary = "根据业务标识查询未完成任务")
CommonResult<TaskInfoDTO> getUnfinishedTaskByBiz(@RequestParam("ownerService") String ownerService,
@RequestParam("bizType") String bizType,
@RequestParam("bizId") String bizId);
@GetMapping(PREFIX + "/getRunningTaskByMaterialId") @GetMapping(PREFIX + "/getRunningTaskByMaterialId")
@Operation(summary = "根据 materialId 和 ownerService 查询运行中任务") @Operation(summary = "根据 materialId 和 ownerService 查询运行中任务")
CommonResult<List<TaskInfoDTO>> getRunningTaskByMaterialId(@RequestParam("materialId") Long materialId, CommonResult<List<TaskInfoDTO>> getRunningTaskByMaterialId(@RequestParam("materialId") Long materialId,

View File

@@ -60,6 +60,11 @@ public class TransportTaskApiImpl implements TransportTaskApi {
return success(transportTaskService.getTaskInfoByCode(taskCode)); return success(transportTaskService.getTaskInfoByCode(taskCode));
} }
@Override
public CommonResult<TaskInfoDTO> getUnfinishedTaskByBiz(String ownerService, String bizType, String bizId) {
return success(transportTaskService.getUnfinishedTaskInfoByBiz(ownerService, bizType, bizId));
}
@Override @Override
public CommonResult<List<TaskInfoDTO>> getRunningTaskByMaterialId(Long materialId, String ownerService) { public CommonResult<List<TaskInfoDTO>> getRunningTaskByMaterialId(Long materialId, String ownerService) {
return success(transportTaskService.getRunningTaskInfoByMaterialId(materialId, ownerService)); return success(transportTaskService.getRunningTaskInfoByMaterialId(materialId, ownerService));

View File

@@ -80,8 +80,9 @@ public interface TransportTaskMapper extends BaseMapperX<TransportTaskDO> {
/** /**
* 按业务归属查询未完结任务(幂等校验用) * 按业务归属查询未完结任务(幂等校验用)
*/ */
default TransportTaskDO selectUnfinishedByBiz(String bizType, String bizId) { default TransportTaskDO selectUnfinishedByBiz(String ownerService, String bizType, String bizId) {
return selectOne(new LambdaQueryWrapperX<TransportTaskDO>() return selectOne(new LambdaQueryWrapperX<TransportTaskDO>()
.eq(TransportTaskDO::getOwnerService, ownerService)
.eq(TransportTaskDO::getBizType, bizType) .eq(TransportTaskDO::getBizType, bizType)
.eq(TransportTaskDO::getBizId, bizId) .eq(TransportTaskDO::getBizId, bizId)
.lt(TransportTaskDO::getTaskStatus, TransportTaskStatusEnum.FINISHED_CALLBACK_PENDING.getCode())); .lt(TransportTaskDO::getTaskStatus, TransportTaskStatusEnum.FINISHED_CALLBACK_PENDING.getCode()));

View File

@@ -105,6 +105,16 @@ public interface TransportTaskService {
*/ */
TaskInfoDTO getTaskInfoByCode(String taskCode); TaskInfoDTO getTaskInfoByCode(String taskCode);
/**
* 根据业务标识查询未完成任务。
*
* @param ownerService 业务归属服务
* @param bizType 业务类型
* @param bizId 业务标识
* @return 未完成任务,不存在时返回空
*/
TaskInfoDTO getUnfinishedTaskInfoByBiz(String ownerService, String bizType, String bizId);
/** /**
* 根据物料ID和业务归属查询运行中任务状态小于75 * 根据物料ID和业务归属查询运行中任务状态小于75
* *

View File

@@ -32,6 +32,8 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import java.util.List; import java.util.List;
@@ -49,6 +51,8 @@ import static cn.code.nl.module.task.enums.ErrorCodeConstants.*;
@Validated @Validated
public class TransportTaskServiceImpl implements TransportTaskService { public class TransportTaskServiceImpl implements TransportTaskService {
private static final String TASK_BIZ_CREATE_LOCK_KEY = "task:biz:create:";
@Resource @Resource
private TransportTaskMapper transportTaskMapper; private TransportTaskMapper transportTaskMapper;
@@ -67,6 +71,9 @@ public class TransportTaskServiceImpl implements TransportTaskService {
@Resource @Resource
private CodeGenApi codeGenApi; private CodeGenApi codeGenApi;
@Resource
private RedissonClient redissonClient;
@Override @Override
public Long createTransportTask(TransportTaskSaveReqVO createReqVO) { public Long createTransportTask(TransportTaskSaveReqVO createReqVO) {
TransportTaskDO transportTask = BeanUtils.toBean(createReqVO, TransportTaskDO.class); TransportTaskDO transportTask = BeanUtils.toBean(createReqVO, TransportTaskDO.class);
@@ -80,6 +87,31 @@ public class TransportTaskServiceImpl implements TransportTaskService {
bizNo = "{{#_ret}}", bizNo = "{{#_ret}}",
success = TASK_INFO_CREATE_BY_RPC) success = TASK_INFO_CREATE_BY_RPC)
public Long createTransportTaskByRpc(TransportTaskCreateReqDTO reqDTO) { public Long createTransportTaskByRpc(TransportTaskCreateReqDTO reqDTO) {
if (StrUtil.isBlank(reqDTO.getOwnerService()) || StrUtil.isBlank(reqDTO.getBizType())
|| StrUtil.isBlank(reqDTO.getBizId())) {
return insertTransportTaskByRpc(reqDTO);
}
String lockKey = TASK_BIZ_CREATE_LOCK_KEY + reqDTO.getOwnerService() + ":"
+ reqDTO.getBizType() + ":" + reqDTO.getBizId();
RLock lock = redissonClient.getLock(lockKey);
lock.lock();
try {
if (transportTaskMapper.selectUnfinishedByBiz(reqDTO.getOwnerService(),
reqDTO.getBizType(), reqDTO.getBizId()) != null) {
throw exception(TRANSPORT_TASK_EXISTS_UNFINISHED);
}
return insertTransportTaskByRpc(reqDTO);
} finally {
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}
/**
* 插入 RPC 搬运任务。
*/
private Long insertTransportTaskByRpc(TransportTaskCreateReqDTO reqDTO) {
TransportTaskDO task = BeanUtils.toBean(reqDTO, TransportTaskDO.class); TransportTaskDO task = BeanUtils.toBean(reqDTO, TransportTaskDO.class);
CodeGenerateReqDTO codeGenerateReqDTO = new CodeGenerateReqDTO(); CodeGenerateReqDTO codeGenerateReqDTO = new CodeGenerateReqDTO();
codeGenerateReqDTO.setRuleCode("TASK_CODE"); codeGenerateReqDTO.setRuleCode("TASK_CODE");
@@ -218,6 +250,12 @@ public class TransportTaskServiceImpl implements TransportTaskService {
return TransportTaskConvert.INSTANCE.convert(task); return TransportTaskConvert.INSTANCE.convert(task);
} }
@Override
public TaskInfoDTO getUnfinishedTaskInfoByBiz(String ownerService, String bizType, String bizId) {
TransportTaskDO task = transportTaskMapper.selectUnfinishedByBiz(ownerService, bizType, bizId);
return TransportTaskConvert.INSTANCE.convert(task);
}
@Override @Override
public List<TaskInfoDTO> getRunningTaskInfoByMaterialId(Long materialId, String ownerService) { public List<TaskInfoDTO> getRunningTaskInfoByMaterialId(Long materialId, String ownerService) {
List<TransportTaskDO> tasks = transportTaskMapper.selectRunningListByMaterialId(materialId, ownerService); List<TransportTaskDO> tasks = transportTaskMapper.selectRunningListByMaterialId(materialId, ownerService);