feat: 增加搬运任务业务防重能力(任务3)
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
@@ -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()));
|
||||||
|
|||||||
@@ -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)
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user