feat(workflow): 完善任务日志和安全措施记录功能

- 在 TaskLogUpdateExe 中添加 EightworkInfoE 的导入依赖
- 实现 eightworkInfo.info 字段的更新逻辑,将步骤信息存入 JSON 结构
- 添加 SKIPPED 状态步骤的处理逻辑,将其视为已完成状态
- 优化并行步骤合并节点的前置步骤检查逻辑
- 在 MeasuresLogs 相关类中添加 taskLogId 字段用于步骤关联
- 更新 MeasuresLogsDO 构造函数,支持传入 taskLogId 参数
- 优化日志输出,增加 taskLogId 关联信息的记录
master
fangjiakai 2026-03-16 09:42:34 +08:00
parent 929cab9c05
commit 6f9146dc55
4 changed files with 81 additions and 4 deletions

View File

@ -11,6 +11,7 @@ import com.zcloud.eightwork.domain.gateway.TaskLogGateway;
import com.zcloud.eightwork.domain.gateway.EightworkSupplementaryInfoGateway; import com.zcloud.eightwork.domain.gateway.EightworkSupplementaryInfoGateway;
import com.zcloud.eightwork.domain.model.MeasuresLogsE; import com.zcloud.eightwork.domain.model.MeasuresLogsE;
import com.zcloud.eightwork.domain.model.EightworkSupplementaryInfoE; import com.zcloud.eightwork.domain.model.EightworkSupplementaryInfoE;
import com.zcloud.eightwork.domain.model.EightworkInfoE;
import com.zcloud.eightwork.domain.model.TaskLogE; import com.zcloud.eightwork.domain.model.TaskLogE;
import com.zcloud.eightwork.domain.model.enums.BranchFlag; import com.zcloud.eightwork.domain.model.enums.BranchFlag;
import com.zcloud.eightwork.domain.model.enums.StepType; import com.zcloud.eightwork.domain.model.enums.StepType;
@ -139,6 +140,9 @@ public class TaskLogUpdateExe {
// 批量更新 // 批量更新
taskLogRepository.updateBatchById(actionLogs); taskLogRepository.updateBatchById(actionLogs);
// 更新 eightworkInfo.info 字段
updateEightworkInfo(cmd.getWorkId(), logs);
log.info("步骤流转完成: workId={}, currentStep={}", cmd.getWorkId(), currentLog.getStepName()); log.info("步骤流转完成: workId={}, currentStep={}", cmd.getWorkId(), currentLog.getStepName());
} }
@ -329,10 +333,11 @@ public class TaskLogUpdateExe {
MeasuresLogsDO measuresLogsDO = new MeasuresLogsDO( MeasuresLogsDO measuresLogsDO = new MeasuresLogsDO(
otherMeasures, otherMeasures,
currentLog.getWorkId(), currentLog.getWorkId(),
currentLog.getWorkType() currentLog.getWorkType(),
currentLog.getTaskLogId()
); );
measuresLogsRepository.save(measuresLogsDO); measuresLogsRepository.save(measuresLogsDO);
log.info("已添加其他安全措施"); log.info("已添加其他安全措施,关联步骤: taskLogId={}", currentLog.getTaskLogId());
} }
} }
} }
@ -414,6 +419,7 @@ public class TaskLogUpdateExe {
/** /**
* *
* *
* SKIPPED
* *
* @param mergeNode * @param mergeNode
* @param allLogs * @param allLogs
@ -426,8 +432,9 @@ public class TaskLogUpdateExe {
// 找出所有指向该合并节点的步骤(通过 nextStep 判断) // 找出所有指向该合并节点的步骤(通过 nextStep 判断)
// 这样可以同时检查主流程和分支步骤 // 这样可以同时检查主流程和分支步骤
if (mergeNode.getStepId().equals(log.getNextStep())) { if (mergeNode.getStepId().equals(log.getNextStep())) {
// 检查是否已完成 // 检查是否已完成APPROVED 或 SKIPPED 都视为已完成)
if (!TaskLogStatus.APPROVED.equalsCode(log.getStatus())) { if (!TaskLogStatus.APPROVED.equalsCode(log.getStatus())
&& !TaskLogStatus.SKIPPED.equalsCode(log.getStatus())) {
pendingSteps.add(log); pendingSteps.add(log);
} }
} }
@ -533,6 +540,12 @@ public class TaskLogUpdateExe {
.orElse(null); .orElse(null);
if (branchStep != null) { if (branchStep != null) {
// 如果分支步骤已标记为跳过,则不激活
if (TaskLogStatus.SKIPPED.equalsCode(branchStep.getStatus())) {
log.info("分支步骤已跳过,不激活: stepName={}", branchStep.getStepName());
return;
}
branchStep.setStatus(TaskLogStatus.IN_PROGRESS.getCode()); branchStep.setStatus(TaskLogStatus.IN_PROGRESS.getCode());
actionLogs.add(TaskLogConvertUtil.toDO(branchStep)); actionLogs.add(TaskLogConvertUtil.toDO(branchStep));
sendTodoAddEvent(getWorkId(currentLog.getWorkId()), branchStep, currentLog.getWorkType()); sendTodoAddEvent(getWorkId(currentLog.getWorkId()), branchStep, currentLog.getWorkType());
@ -626,4 +639,52 @@ public class TaskLogUpdateExe {
.eq(EightworkInfoDO::getWorkId, workId) .eq(EightworkInfoDO::getWorkId, workId)
).getId(); ).getId();
} }
/**
* eightworkInfo.info
* step_${step_id} key info
*/
private void updateEightworkInfo(String workId, List<TaskLogE> logs) {
EightworkInfoDO infoDO = eightworkInfoRepository.getOne(
new LambdaQueryWrapper<EightworkInfoDO>()
.eq(EightworkInfoDO::getWorkId, workId)
);
if (infoDO == null) {
log.warn("未找到作业信息: workId={}", workId);
return;
}
// 解析现有的 info
JSONObject infoJson;
if (StringUtils.isNotBlank(infoDO.getInfo())) {
try {
infoJson = JSONObject.parseObject(infoDO.getInfo());
} catch (Exception e) {
log.warn("解析 info 失败,使用空对象: workId={}", workId, e);
infoJson = new JSONObject();
}
} else {
infoJson = new JSONObject();
}
// 遍历所有步骤,更新 info
for (TaskLogE log : logs) {
JSONObject stepInfo = new JSONObject();
stepInfo.put("stepName", log.getStepName());
stepInfo.put("actUserDepartment", log.getActUserDepartment());
stepInfo.put("actUserDepartmentName", log.getActUserDepartmentName());
stepInfo.put("actUser", log.getActUser());
stepInfo.put("actUserName", log.getActUserName());
stepInfo.put("status", log.getStatus());
infoJson.put("step_" + log.getStepId(), stepInfo);
}
// 更新到数据库
infoDO.setInfo(infoJson.toJSONString());
eightworkInfoRepository.updateById(infoDO);
log.info("已更新作业 info: workId={}", workId);
}
} }

View File

@ -28,6 +28,9 @@ public class MeasuresLogsCO extends ClientObject {
//作业票id //作业票id
@ApiModelProperty(value = "作业票id") @ApiModelProperty(value = "作业票id")
private String workId; private String workId;
//所属步骤id
@ApiModelProperty(value = "所属步骤id")
private String taskLogId;
//答案 &&分割 //答案 &&分割
@ApiModelProperty(value = "答案 &&分割") @ApiModelProperty(value = "答案 &&分割")
private String answer; private String answer;

View File

@ -19,6 +19,8 @@ public class MeasuresLogsE extends BaseE {
private String questions; private String questions;
//作业票id //作业票id
private String workId; private String workId;
//所属步骤id
private String taskLogId;
//答案 &&分割 //答案 &&分割
private String answer; private String answer;
//签字 //签字

View File

@ -31,6 +31,9 @@ public class MeasuresLogsDO extends BaseDO {
//作业票id //作业票id
@ApiModelProperty(value = "作业票id") @ApiModelProperty(value = "作业票id")
private String workId; private String workId;
//所属步骤id
@ApiModelProperty(value = "所属步骤id")
private String taskLogId;
//答案 &&分割 //答案 &&分割
@ApiModelProperty(value = "答案 &&分割") @ApiModelProperty(value = "答案 &&分割")
private String answer; private String answer;
@ -50,5 +53,13 @@ public class MeasuresLogsDO extends BaseDO {
this.workType = workType; this.workType = workType;
this.type = 2; this.type = 2;
} }
public MeasuresLogsDO(String measures, String workId, String workType, String taskLogId) {
this.content = measures;
this.workId = workId;
this.workType = workType;
this.taskLogId = taskLogId;
this.type = 2;
}
} }