feat(REQ-5965) - 调整同意功能的日志数据存储

This commit is contained in:
wangli 2025-11-07 15:53:27 +08:00
parent ccf56781fc
commit 8722e5baea
5 changed files with 35 additions and 40 deletions

View File

@ -1,6 +1,5 @@
package cn.axzo.workflow.common.model.dto; package cn.axzo.workflow.common.model.dto;
import cn.axzo.workflow.common.enums.BpmnProcessTaskResultEnum;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@ -41,9 +40,11 @@ public class SignatureDTO implements Serializable {
@Accessors(chain = true) @Accessors(chain = true)
public static class SignDetail implements Serializable { public static class SignDetail implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
//审批人姓名
private String approverName;
private String signature; private String signature;
private String advice; private String advice;
private BpmnProcessTaskResultEnum result; private String result;
private Date operationTime; private Date operationTime;
} }
} }

View File

@ -164,7 +164,7 @@ public class CustomApproveTaskCmd extends AbstractCommand<Void> implements Seria
// 更新流程内的变量 // 更新流程内的变量
runtimeService.setVariables(task.getProcessInstanceId(), variables); runtimeService.setVariables(task.getProcessInstanceId(), variables);
// 记录电子签名的图片 // 记录电子签名的图片
recordSignature(task, runtimeService); recordSignature(task, runtimeService, attachmentList, advice, approver);
resetApproverNode(task.getProcessInstanceId()); resetApproverNode(task.getProcessInstanceId());
@ -192,7 +192,11 @@ public class CustomApproveTaskCmd extends AbstractCommand<Void> implements Seria
approver.setNodeId(logs.get(0).getAssigneeFull().get(0).getNodeId()); approver.setNodeId(logs.get(0).getAssigneeFull().get(0).getNodeId());
} }
private void recordSignature(TaskEntity task, RuntimeService runtimeService) { public static void recordSignature(TaskEntity task,
RuntimeService runtimeService,
List<AttachmentDTO> attachmentList,
String advice,
BpmnTaskDelegateAssigner approver) {
List<SignatureDTO> signatures = runtimeService.getVariable(task.getProcessInstanceId(), SIGNATURE_COLLECTION, List.class); List<SignatureDTO> signatures = runtimeService.getVariable(task.getProcessInstanceId(), SIGNATURE_COLLECTION, List.class);
if (Objects.isNull(signatures)) { if (Objects.isNull(signatures)) {
signatures = new ArrayList<>(); signatures = new ArrayList<>();
@ -208,9 +212,10 @@ public class CustomApproveTaskCmd extends AbstractCommand<Void> implements Seria
.findFirst() .findFirst()
.ifPresent(attachment -> dto.getSignatures().add(0, .ifPresent(attachment -> dto.getSignatures().add(0,
new SignatureDTO.SignDetail() new SignatureDTO.SignDetail()
.setApproverName(approver.getAssignerName())
.setSignature(attachment.getUrl()) .setSignature(attachment.getUrl())
.setAdvice(advice) .setAdvice(advice)
.setResult(BpmnProcessTaskResultEnum.APPROVED) .setResult(BpmnProcessTaskResultEnum.APPROVED.getDesc())
.setOperationTime(new Date()))); .setOperationTime(new Date())));
if (!any.isPresent()) { if (!any.isPresent()) {
signatures.add(dto); signatures.add(dto);

View File

@ -1,9 +1,7 @@
package cn.axzo.workflow.core.engine.cmd; package cn.axzo.workflow.core.engine.cmd;
import cn.axzo.workflow.common.enums.AttachmentTypeEnum;
import cn.axzo.workflow.common.enums.BpmnFlowNodeType; import cn.axzo.workflow.common.enums.BpmnFlowNodeType;
import cn.axzo.workflow.common.exception.WorkflowEngineException; import cn.axzo.workflow.common.exception.WorkflowEngineException;
import cn.axzo.workflow.common.model.dto.SignatureDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO; import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditWithFormDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditWithFormDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
@ -14,7 +12,6 @@ import cn.axzo.workflow.core.repository.entity.ExtAxProcessLog;
import cn.axzo.workflow.core.service.ExtAxBpmnFormRelationService; import cn.axzo.workflow.core.service.ExtAxBpmnFormRelationService;
import cn.axzo.workflow.core.service.ExtAxProcessLogService; import cn.axzo.workflow.core.service.ExtAxProcessLogService;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import org.apache.commons.collections4.ListUtils;
import org.flowable.common.engine.impl.identity.Authentication; import org.flowable.common.engine.impl.identity.Authentication;
import org.flowable.common.engine.impl.interceptor.CommandContext; import org.flowable.common.engine.impl.interceptor.CommandContext;
import org.flowable.engine.RuntimeService; import org.flowable.engine.RuntimeService;
@ -34,12 +31,10 @@ import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.io.Serializable; import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Optional;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -48,10 +43,10 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.CLOSE_PROCESS_ASSIG
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_ADVICE; import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_ADVICE;
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_OPERATION_DESC; import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_OPERATION_DESC;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_SPECIFY_NEXT_APPROVER; import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_SPECIFY_NEXT_APPROVER;
import static cn.axzo.workflow.common.constant.BpmnConstants.SIGNATURE_COLLECTION;
import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_COMPLETE_OPERATION_TYPE; import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_COMPLETE_OPERATION_TYPE;
import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_SUBMIT_FORM_VARIABLE; import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_SUBMIT_FORM_VARIABLE;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.APPROVED; import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.APPROVED;
import static cn.axzo.workflow.core.engine.cmd.CustomApproveTaskCmd.recordSignature;
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.addComment; import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.addComment;
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.batchAddAttachment; import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.batchAddAttachment;
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTask; import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTask;
@ -183,7 +178,7 @@ public class CustomApproveTaskWithFormCmd extends AbstractCommand<Void> implemen
// 更新流程实例变量 // 更新流程实例变量
runtimeService.setVariables(task.getProcessInstanceId(), variables); runtimeService.setVariables(task.getProcessInstanceId(), variables);
// 记录电子签名的图片 // 记录电子签名的图片
recordSignature(task, runtimeService); recordSignature(task, runtimeService, attachmentList, advice, approver);
resetApproverNode(task.getProcessInstanceId()); resetApproverNode(task.getProcessInstanceId());
@ -262,30 +257,4 @@ public class CustomApproveTaskWithFormCmd extends AbstractCommand<Void> implemen
} }
} }
private void recordSignature(TaskEntity task, RuntimeService runtimeService) {
List<SignatureDTO> signatures = runtimeService.getVariable(task.getProcessInstanceId(), SIGNATURE_COLLECTION, List.class);
if (Objects.isNull(signatures)) {
signatures = new ArrayList<>();
}
Optional<SignatureDTO> any = signatures.stream()
.filter(i -> Objects.equals(i.getActivityId(), task.getTaskDefinitionKey())).findAny();
SignatureDTO dto = any.orElse(new SignatureDTO()
.setActivityId(task.getTaskDefinitionKey())
.setActivityName(task.getName())
.setSignatures(new ArrayList<>()));
ListUtils.emptyIfNull(attachmentList).stream()
.filter(i -> Objects.equals(i.getType(), AttachmentTypeEnum.signature))
.findFirst()
.ifPresent(attachment -> dto.getSignatures().add(0,
new SignatureDTO.SignDetail()
.setSignature(attachment.getUrl())
.setAdvice(advice)));
if (!any.isPresent()) {
signatures.add(dto);
}
if (!CollectionUtils.isEmpty(signatures)) {
runtimeService.setVariable(task.getProcessInstanceId(), SIGNATURE_COLLECTION, signatures);
}
}
} }

View File

@ -18,6 +18,7 @@ import cn.axzo.workflow.common.model.dto.UploadFieldDTO;
import cn.axzo.workflow.common.model.dto.VariableObjectDTO; import cn.axzo.workflow.common.model.dto.VariableObjectDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.core.engine.cmd.CustomGetProcessInstanceVariablesToObjectCmd; import cn.axzo.workflow.core.engine.cmd.CustomGetProcessInstanceVariablesToObjectCmd;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException; import com.alibaba.fastjson.JSONException;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
@ -113,6 +114,18 @@ public class WpsUtil {
List<SignatureDTO.SignDetail> signDetails = (List<SignatureDTO.SignDetail>) variableObjectDTO.getValue(); List<SignatureDTO.SignDetail> signDetails = (List<SignatureDTO.SignDetail>) variableObjectDTO.getValue();
if (!CollectionUtils.isEmpty(signDetails)) { if (!CollectionUtils.isEmpty(signDetails)) {
SignatureDTO.SignDetail signDetail = signDetails.get(0); SignatureDTO.SignDetail signDetail = signDetails.get(0);
signatureAndAdvices.add(VariableObjectDTO.builder()
.key(variableObjectDTO.getKey() + "_approverName")
.desc(variableObjectDTO.getDesc() + "姓名")
.value(signDetail.getApproverName())
.type(VariableObjectDTO.Type.text)
.build());
signatureAndAdvices.add(VariableObjectDTO.builder()
.key(variableObjectDTO.getKey() + "_activityResult")
.desc(variableObjectDTO.getDesc() + "审批结果")
.value(signDetail.getResult())
.type(VariableObjectDTO.Type.text)
.build());
ApiSignUrlDownloadRequest request = ApiSignUrlDownloadRequest.builder() ApiSignUrlDownloadRequest request = ApiSignUrlDownloadRequest.builder()
.fileKeys(Lists.newArrayList(signDetail.getSignature())).build(); .fileKeys(Lists.newArrayList(signDetail.getSignature())).build();
List<ApiSignUrlDownloadResponse> signUrl = RpcExternalUtil.rpcProcessor(() -> serverFileServiceApi.signUrlFetchDownload(request), "获取手写签图片地址", request); List<ApiSignUrlDownloadResponse> signUrl = RpcExternalUtil.rpcProcessor(() -> serverFileServiceApi.signUrlFetchDownload(request), "获取手写签图片地址", request);
@ -128,6 +141,12 @@ public class WpsUtil {
.value(signDetail.getAdvice()) .value(signDetail.getAdvice())
.type(VariableObjectDTO.Type.text) .type(VariableObjectDTO.Type.text)
.build()); .build());
signatureAndAdvices.add(VariableObjectDTO.builder()
.key(variableObjectDTO.getKey() + "_activityOperationTime")
.desc(variableObjectDTO.getDesc() + "日期")
.value(DateUtil.format(signDetail.getOperationTime(), "yyyy.MM.dd"))
.type(VariableObjectDTO.Type.text)
.build());
} }
}); });
wpsVariables.addAll(signatureAndAdvices); wpsVariables.addAll(signatureAndAdvices);

View File

@ -36,6 +36,7 @@ import com.alibaba.fastjson.JSON;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.ListUtils; import org.apache.commons.collections4.ListUtils;
import org.apache.commons.collections4.MapUtils;
import org.flowable.form.api.FormInfo; import org.flowable.form.api.FormInfo;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
@ -115,7 +116,7 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
} }
// 移除 variable value null key // 移除 variable value null key
dto.getVariables().entrySet().removeIf(entry -> Objects.isNull(entry.getValue())); MapUtils.emptyIfNull(dto.getVariables()).entrySet().removeIf(entry -> Objects.isNull(entry.getValue()));
List<AttachmentDTO> tempAttachments = ListUtils.defaultIfNull(dto.getAttachmentList(), new ArrayList<>()); List<AttachmentDTO> tempAttachments = ListUtils.defaultIfNull(dto.getAttachmentList(), new ArrayList<>());
if (StringUtils.hasText(dto.getSignatureUrl())) { if (StringUtils.hasText(dto.getSignatureUrl())) {
@ -145,7 +146,7 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
} }
// 移除 variable value null key // 移除 variable value null key
dto.getVariables().entrySet().removeIf(entry -> Objects.isNull(entry.getValue())); MapUtils.emptyIfNull(dto.getVariables()).entrySet().removeIf(entry -> Objects.isNull(entry.getValue()));
List<AttachmentDTO> tempAttachments = ListUtils.defaultIfNull(dto.getAttachmentList(), new ArrayList<>()); List<AttachmentDTO> tempAttachments = ListUtils.defaultIfNull(dto.getAttachmentList(), new ArrayList<>());
if (StringUtils.hasText(dto.getSignatureUrl())) { if (StringUtils.hasText(dto.getSignatureUrl())) {