From 2694888ef4852c3c42cf8426455cdcf5650799df Mon Sep 17 00:00:00 2001 From: fangjiakai <450850793@qq.com> Date: Fri, 20 Mar 2026 15:37:20 +0800 Subject: [PATCH] =?UTF-8?q?feat(task):=20=E6=B7=BB=E5=8A=A0=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E6=9A=82=E5=AD=98=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 TaskLogController 中新增 saveDraft 接口用于暂存作业 - 修改 TaskLogAddExe 将作业创建逻辑拆分为首次提交和暂存转正式两种场景 - 实现从暂存记录转为正式提交的功能,包括状态检查和票号重新生成 - 重构作业信息保存逻辑,提取正式票号生成功能到独立方法 - 更新 TaskLogServiceI 接口定义,添加 saveDraft 方法声明 - 在 TaskLogAddCmd 中新增 id 字段标识暂存转正式操作 - 新增 gasFlag 字段支持其他分析标识功能 --- .../eightwork/web/TaskLogController.java | 9 ++ .../eightwork/command/TaskLogAddExe.java | 137 +++++++++++++----- .../eightwork/service/TaskLogServiceImpl.java | 10 ++ .../zcloud/eightwork/api/TaskLogServiceI.java | 7 + .../zcloud/eightwork/dto/TaskLogAddCmd.java | 5 + 5 files changed, 133 insertions(+), 35 deletions(-) diff --git a/web-adapter/src/main/java/com/zcloud/eightwork/web/TaskLogController.java b/web-adapter/src/main/java/com/zcloud/eightwork/web/TaskLogController.java index 502f24e..618c8c6 100644 --- a/web-adapter/src/main/java/com/zcloud/eightwork/web/TaskLogController.java +++ b/web-adapter/src/main/java/com/zcloud/eightwork/web/TaskLogController.java @@ -2,10 +2,12 @@ package com.zcloud.eightwork.web; import com.zcloud.eightwork.api.TaskLogServiceI; +import com.zcloud.eightwork.dto.EightworkInfoSaveDraftCmd; import com.zcloud.eightwork.dto.TaskLogAddCmd; import com.zcloud.eightwork.dto.TaskLogNextCmd; import com.zcloud.eightwork.dto.TaskLogPageQry; import com.zcloud.eightwork.dto.TaskLogUpdateCmd; +import com.zcloud.eightwork.dto.clientobject.EightworkInfoCO; import com.zcloud.eightwork.dto.clientobject.TaskLogCO; import com.alibaba.cola.dto.MultiResponse; import com.alibaba.cola.dto.PageResponse; @@ -104,5 +106,12 @@ public class TaskLogController { public MultiResponse getTodoCountForWork(@PathVariable("workType") String workType) { return MultiResponse.of(taskLogService.getTodoCountForWork(AuthContext.getOrgId(),AuthContext.getUserId(),workType)); } + + @ApiOperation("暂存作业") + @PostMapping("/saveDraft") + public SingleResponse saveDraft(@Validated @RequestBody EightworkInfoSaveDraftCmd cmd) { + cmd.setDepartmentId(AuthContext.getOrgId()); + return taskLogService.saveDraft(cmd); + } } diff --git a/web-app/src/main/java/com/zcloud/eightwork/command/TaskLogAddExe.java b/web-app/src/main/java/com/zcloud/eightwork/command/TaskLogAddExe.java index d0ff74b..cdfdb72 100644 --- a/web-app/src/main/java/com/zcloud/eightwork/command/TaskLogAddExe.java +++ b/web-app/src/main/java/com/zcloud/eightwork/command/TaskLogAddExe.java @@ -57,31 +57,114 @@ public class TaskLogAddExe { @Transactional(rollbackFor = Exception.class) public List execute(TaskLogAddCmd cmd) { - log.info("开始创建作业流程: workType={}, workLevel={}", cmd.getWorkType(), cmd.getWorkLevel()); + log.info("开始创建作业流程: workType={}, workLevel={}, id={}", + cmd.getWorkType(), cmd.getWorkLevel(), cmd.getId()); try { - // 1. 创建作业信息 - String workId = saveWork(cmd); - log.info("作业信息已创建: workId={}", workId); - - // 2. 获取流程配置 - List flows = taskFlowGateway.listAllByWorkType(cmd.getWorkType(), cmd.getWorkLevel()); - log.info("获取到 {} 个流程步骤", flows.size()); - - // 3. 生成任务日志 - List taskLogs = flows.stream().map(flow -> createTaskLog(flow, workId, cmd)).collect(Collectors.toList()); - - // 4. 批量保存 - taskLogRepository.saveBatch(taskLogs); - - log.info("作业流程创建成功: workId={}, stepCount={}", workId, taskLogs.size()); - return taskLogs; + if (cmd.getId() != null) { + // 从暂存转正式提交 + return submitFromDraft(cmd); + } else { + // 首次正式提交 + return submitNew(cmd); + } } catch (Exception e) { log.error("创建作业流程失败: workType={}", cmd.getWorkType(), e); throw new BizException("保存失败: " + e.getMessage()); } } + /** + * 从暂存转正式提交 + */ + private List submitFromDraft(TaskLogAddCmd cmd) { + log.info("从暂存转正式提交: id={}", cmd.getId()); + + // 1. 查询暂存记录 + EightworkInfoDO existingInfo = eightworkInfoRepository.getById(cmd.getId()); + if (existingInfo == null) { + throw new BizException("暂存记录不存在"); + } + + // 2. 检查状态 + if (!TaskLogStatus.NOT_STARTED.getCode().equals(existingInfo.getStatus())) { + throw new BizException("只能从暂存状态转为正式提交"); + } + + // 3. 删除暂存的 task_log + taskLogRepository.remove(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() + .eq(TaskLogDO::getWorkId, existingInfo.getWorkId())); + + // 4. 生成正式票号并更新主表 + String formalCheckNo = generateFormalCheckNo(cmd.getWorkType()); + existingInfo.setCheckNo(formalCheckNo); + existingInfo.setStatus(TaskLogStatus.IN_PROGRESS.getCode()); + eightworkInfoRepository.updateById(existingInfo); + + log.info("暂存转正式: workId={}, checkNo={}", existingInfo.getWorkId(), formalCheckNo); + + // 5. 获取流程配置 + List flows = taskFlowGateway.listAllByWorkType(cmd.getWorkType(), cmd.getWorkLevel()); + + // 6. 生成所有步骤 task_log + List taskLogs = flows.stream() + .map(flow -> createTaskLog(flow, existingInfo.getWorkId(), cmd)) + .collect(Collectors.toList()); + + // 7. 批量保存 + taskLogRepository.saveBatch(taskLogs); + + log.info("作业流程创建成功(从暂存): workId={}, stepCount={}", existingInfo.getWorkId(), taskLogs.size()); + return taskLogs; + } + + /** + * 首次正式提交 + */ + private List submitNew(TaskLogAddCmd cmd) { + log.info("首次正式提交: workType={}, workLevel={}", cmd.getWorkType(), cmd.getWorkLevel()); + + // 1. 创建作业信息 + String workId = saveWork(cmd); + log.info("作业信息已创建: workId={}", workId); + + // 2. 获取流程配置 + List flows = taskFlowGateway.listAllByWorkType(cmd.getWorkType(), cmd.getWorkLevel()); + log.info("获取到 {} 个流程步骤", flows.size()); + + // 3. 生成任务日志 + List taskLogs = flows.stream().map(flow -> createTaskLog(flow, workId, cmd)).collect(Collectors.toList()); + + // 4. 批量保存 + taskLogRepository.saveBatch(taskLogs); + + log.info("作业流程创建成功: workId={}, stepCount={}", workId, taskLogs.size()); + return taskLogs; + } + + /** + * 生成正式票号 + */ + private String generateFormalCheckNo(String workType) { + String workTypeCode = WorkCodeEnum.getCodeByWorkType(workType); + String date = DateUtil.getDays(); + + // 构建 Redis Key + String redisKey = buildTicketNoKey(workTypeCode, date); + + // Redis 原子递增获取序号 + Long seq = stringRedisTemplate.opsForValue().increment(redisKey); + + if (seq == 1) { + stringRedisTemplate.expire(redisKey, KEY_EXPIRE_HOURS, TimeUnit.HOURS); + } + + log.info("生成正式票号: workType={}, date={}, seq={}", workType, date, seq); + + // 正式票号: QG + 作业类型代码 + 日期 + 4位序号 + return "QG" + workTypeCode + date + String.format("%04d", seq); + } + /** * 创建任务日志记录 */ @@ -159,24 +242,8 @@ public class TaskLogAddExe { * 使用 Redis 原子递增生成票号,确保并发安全 */ private String saveWork(TaskLogAddCmd cmd) { - String workType = cmd.getWorkType(); - String workTypeCode = WorkCodeEnum.getCodeByWorkType(workType); - String date = DateUtil.getDays(); - - // 构建 Redis Key: eightwork:ticket:no:DH:20250312 - String redisKey = buildTicketNoKey(workTypeCode, date); - - // Redis 原子递增获取序号(从1开始) - Long seq = stringRedisTemplate.opsForValue().increment(redisKey); - - if (seq == 1) { - stringRedisTemplate.expire(redisKey, KEY_EXPIRE_HOURS, TimeUnit.HOURS); - } - - log.info("生成票号: workType={}, date={}, seq={}", workType, date, seq); - - // 生成票号: QG + 作业类型代码 + 日期 + 4位序号 - String checkNo = "QG" + workTypeCode + date + String.format("%04d", seq); + // 生成正式票号 + String checkNo = generateFormalCheckNo(cmd.getWorkType()); EightworkInfoDO eightworkInfo = new EightworkInfoDO( Tools.get32UUID(), diff --git a/web-app/src/main/java/com/zcloud/eightwork/service/TaskLogServiceImpl.java b/web-app/src/main/java/com/zcloud/eightwork/service/TaskLogServiceImpl.java index 2bce9f1..7fb9f8e 100644 --- a/web-app/src/main/java/com/zcloud/eightwork/service/TaskLogServiceImpl.java +++ b/web-app/src/main/java/com/zcloud/eightwork/service/TaskLogServiceImpl.java @@ -1,15 +1,18 @@ package com.zcloud.eightwork.service; import com.zcloud.eightwork.api.TaskLogServiceI; +import com.zcloud.eightwork.command.EightworkInfoSaveDraftExe; import com.zcloud.eightwork.command.TaskLogAddExe; import com.zcloud.eightwork.command.TaskLogRemoveExe; import com.zcloud.eightwork.command.TaskLogUpdateExe; import com.zcloud.eightwork.command.query.TaskLogQueryExe; import com.zcloud.eightwork.domain.model.enums.TaskLogStatus; +import com.zcloud.eightwork.dto.EightworkInfoSaveDraftCmd; import com.zcloud.eightwork.dto.TaskLogAddCmd; import com.zcloud.eightwork.dto.TaskLogNextCmd; import com.zcloud.eightwork.dto.TaskLogPageQry; import com.zcloud.eightwork.dto.TaskLogUpdateCmd; +import com.zcloud.eightwork.dto.clientobject.EightworkInfoCO; import com.zcloud.eightwork.dto.clientobject.TaskLogCO; import com.alibaba.cola.dto.PageResponse; @@ -35,6 +38,7 @@ public class TaskLogServiceImpl implements TaskLogServiceI { private final TaskLogUpdateExe taskLogUpdateExe; private final TaskLogRemoveExe taskLogRemoveExe; private final TaskLogQueryExe taskLogQueryExe; + private final EightworkInfoSaveDraftExe eightworkInfoSaveDraftExe; @Override public SingleResponse getInfoById(Long id) { @@ -95,5 +99,11 @@ public class TaskLogServiceImpl implements TaskLogServiceI { public List getTodoCountForWork(Long orgId, Long userId, String workType){ return taskLogQueryExe.getTodoCountForWork(orgId, userId, workType); } + + @Override + public SingleResponse saveDraft(EightworkInfoSaveDraftCmd cmd) { + eightworkInfoSaveDraftExe.execute(cmd); + return SingleResponse.buildSuccess(); + } } diff --git a/web-client/src/main/java/com/zcloud/eightwork/api/TaskLogServiceI.java b/web-client/src/main/java/com/zcloud/eightwork/api/TaskLogServiceI.java index 62f9846..e62dbdd 100644 --- a/web-client/src/main/java/com/zcloud/eightwork/api/TaskLogServiceI.java +++ b/web-client/src/main/java/com/zcloud/eightwork/api/TaskLogServiceI.java @@ -1,9 +1,11 @@ package com.zcloud.eightwork.api; +import com.zcloud.eightwork.dto.EightworkInfoSaveDraftCmd; import com.zcloud.eightwork.dto.TaskLogAddCmd; import com.zcloud.eightwork.dto.TaskLogNextCmd; import com.zcloud.eightwork.dto.TaskLogPageQry; import com.zcloud.eightwork.dto.TaskLogUpdateCmd; +import com.zcloud.eightwork.dto.clientobject.EightworkInfoCO; import com.zcloud.eightwork.dto.clientobject.TaskLogCO; import com.alibaba.cola.dto.PageResponse; @@ -37,5 +39,10 @@ public interface TaskLogServiceI { List getTodoCount(Long orgId, Long userId); List getTodoCountForWork(Long orgId, Long userId, String workType); + + /** + * 暂存作业 + */ + SingleResponse saveDraft(EightworkInfoSaveDraftCmd cmd); } diff --git a/web-client/src/main/java/com/zcloud/eightwork/dto/TaskLogAddCmd.java b/web-client/src/main/java/com/zcloud/eightwork/dto/TaskLogAddCmd.java index 6f92a07..62ec977 100644 --- a/web-client/src/main/java/com/zcloud/eightwork/dto/TaskLogAddCmd.java +++ b/web-client/src/main/java/com/zcloud/eightwork/dto/TaskLogAddCmd.java @@ -22,6 +22,9 @@ import java.util.List; @NoArgsConstructor @AllArgsConstructor public class TaskLogAddCmd extends Command { + @ApiModelProperty(value = "主表ID(有值表示从暂存转正式,无值表示首次正式提交)") + private Long id; + @ApiModelProperty(value = "任务类型", name = "workType",required = true) @NotBlank private String workType; @@ -33,6 +36,8 @@ public class TaskLogAddCmd extends Command { @ApiModelProperty(value = "是否相关方1是", name = "xgfFlag", required = true) private Integer xgfFlag; + @ApiModelProperty(value = "是否其他分析1是", name = "gasFlag", required = true) + private Integer gasFlag; @ApiModelProperty(value = "是否内部作业1是2否", name = "internalOperationFlag") private Integer internalOperationFlag;