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;