diff --git a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/mq/listener/ess/EssAllEventHandler.java b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/mq/listener/ess/EssAllEventHandler.java new file mode 100644 index 00000000..1db38e63 --- /dev/null +++ b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/mq/listener/ess/EssAllEventHandler.java @@ -0,0 +1,136 @@ +package cn.axzo.nanopart.visa.server.mq.listener.ess; + +import cn.axzo.apollo.workspace.api.workspace.req.GetWorkspaceDetailReq; +import cn.axzo.apollo.workspace.api.workspace.res.GetWorkspaceDetailRes; +import cn.axzo.basics.common.util.AssertUtil; +import cn.axzo.framework.rocketmq.Event; +import cn.axzo.framework.rocketmq.EventConsumer; +import cn.axzo.framework.rocketmq.EventHandler; +import cn.axzo.nanopart.ess.api.domain.contract.EssApproveDetail; +import cn.axzo.nanopart.ess.api.domain.contract.EssContractInfo; +import cn.axzo.nanopart.ess.api.enums.EssContractState; +import cn.axzo.nanopart.ess.api.mq.EssContractStateChangeMessage; +import cn.axzo.nanopart.ess.api.request.SaveContractSnapshotRequest; +import cn.axzo.nanopart.visa.server.domain.ChangeRecord; +import cn.axzo.nanopart.visa.server.domain.ChangeRecordRelation; +import cn.axzo.nanopart.visa.server.dto.VisaRelationDto; +import cn.axzo.nanopart.visa.server.rpc.EssGateway; +import cn.axzo.nanopart.visa.server.rpc.WorkflowGateway; +import cn.axzo.nanopart.visa.server.rpc.WorkspaceGateway; +import cn.axzo.nanopart.visa.server.service.ChangeRecordRelationService; +import cn.axzo.nanopart.visa.server.service.ChangeRecordService; +import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum; +import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO; +import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; +import com.alibaba.fastjson.JSON; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static cn.axzo.nanopart.ess.api.enums.EssContractApproveState.ACCEPT; +import static cn.axzo.nanopart.ess.api.enums.MQEvent.ESS_CONTRACT_DOWNLOAD_PDF; +import static cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum.PROCESS_INSTANCE_OF_ESS; + +/** + * 腾讯电子签的处理器 + * + * @author wangli + * @since 2025-02-26 15:37 + */ +@Slf4j +@Component +public class EssAllEventHandler implements EventHandler, InitializingBean { + @Resource + private EventConsumer eventConsumer; + @Resource + private EssGateway essGateway; + @Resource + private WorkflowGateway workflowGateway; + @Resource + private WorkspaceGateway workspaceGateway; + @Resource + private ChangeRecordService changeRecordService; + @Resource + private ChangeRecordRelationService changeRecordRelationService; + + @Override + public void onEvent(Event event, EventConsumer.Context context) { + if (Objects.isNull(event) || Objects.isNull(event.getEventCode())) { + log.warn("illegal event code: {}", JSON.toJSONString(event)); + return; + } + log.info("all ess event handle : {}", JSON.toJSONString(event)); + EssContractStateChangeMessage essContractStateChangeMessage = event.normalizedData(EssContractStateChangeMessage.class); + EssContractInfo contract = essContractStateChangeMessage.getContract(); + AssertUtil.isTrue(Objects.nonNull(essContractStateChangeMessage) && Objects.nonNull(contract), "腾讯电子签事件对象异常"); + + if (Objects.equals(EssContractState.ALL, contract.getState())) { + // 所有单位都完成签署 + SaveContractSnapshotRequest request = new SaveContractSnapshotRequest(); + request.setEssContractId(contract.getEssContractId()); + essGateway.saveContractSnapshot(request); + } + Optional optVisa = changeRecordService.lambdaQuery().eq(ChangeRecord::getContractId, contract.getEssContractId()) + .oneOpt(); + // 取消用印会清空合同 id,这里兼容该情况 + optVisa.ifPresent(changeRecord -> { + log.info("change record : {}", JSON.toJSONString(changeRecord)); + Map ouStampStateMap = contract.getApproveDetails().stream() + .filter(i -> Objects.nonNull(i.getSignPerson())) + .collect(Collectors.toMap(i -> i.getSignPerson().getOuId(), Function.identity(), (s, t) -> s)); + + List essInstances = changeRecordRelationService.findByCondition(VisaRelationDto.builder() + .visaId(changeRecord.getId()) + .varName(PROCESS_INSTANCE_OF_ESS.name()) + .contentExt(BpmnProcessInstanceResultEnum.PROCESSING.getStatus()) + .build()); + + essInstances.forEach(i -> { + EssApproveDetail approveDetail = ouStampStateMap.get(Long.valueOf(i.getVarExt())); + if (Objects.nonNull(approveDetail) && Objects.equals(ACCEPT, approveDetail.getState())) { + + // 获取单位的企业工作台 + List workspaces = workspaceGateway.getWorkspace(GetWorkspaceDetailReq.builder() + .organizationUnitId(approveDetail.getOuId()) + .type(1) + .build()); + AssertUtil.isTrue(CollectionUtils.isNotEmpty(workspaces) && workspaces.size() == 1, "未获取到企业工作台信息"); + GetWorkspaceDetailRes entWorkspace = workspaces.get(0); + + // 同意审批和待办 + BpmnTaskAuditDTO auditDTO = new BpmnTaskAuditDTO(); + auditDTO.setTaskId(findTaskId(i.getContentExt(), String.valueOf(approveDetail.getSignPerson().getPersonId()))); + auditDTO.setApprover(BpmnTaskDelegateAssigner.builder() + .tenantId(String.valueOf(entWorkspace.getId())) + .ouId(String.valueOf(approveDetail.getOuId())) + .personId(String.valueOf(approveDetail.getSignPerson().getPersonId())) + .build()); + log.info("audit info : {}", JSON.toJSONString(auditDTO)); + workflowGateway.approveProcessInstance(auditDTO); + log.info("audit info success"); + } + }); + + + }); + log.info("all ess event handle success: {}", JSON.toJSONString(event)); + } + + private String findTaskId(String processInstanceId, String personId) { + return workflowGateway.findTaskIdByInstanceIdAndPersonId(processInstanceId, personId); + } + + @Override + public void afterPropertiesSet() throws Exception { + eventConsumer.registerHandler(ESS_CONTRACT_DOWNLOAD_PDF.getEventCode(), this); + } +} diff --git a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/rpc/EssGateway.java b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/rpc/EssGateway.java index 0d252b03..1715e760 100644 --- a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/rpc/EssGateway.java +++ b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/rpc/EssGateway.java @@ -4,6 +4,7 @@ import cn.axzo.nanopart.ess.api.EssApi; import cn.axzo.nanopart.ess.api.domain.EssOrgAndSealInfo; import cn.axzo.nanopart.ess.api.request.CreateContractByFileRequest; import cn.axzo.nanopart.ess.api.request.GetSealsRequest; +import cn.axzo.nanopart.ess.api.request.SaveContractSnapshotRequest; import cn.axzo.nanopart.ess.api.response.CreateContractByFileResponse; import cn.axzo.pokonyan.util.RpcUtil; import lombok.RequiredArgsConstructor; @@ -32,4 +33,8 @@ public class EssGateway { public List getOrgEnabledSeals(GetSealsRequest request) { return RpcUtil.rpcApiResultProcessor(() -> essApi.getOrgEnabledSeals(request), "查询单位已启用的印章以及授权人员列表", request); } + + public void saveContractSnapshot(SaveContractSnapshotRequest request) { + RpcUtil.rpcApiResultProcessor(() -> essApi.saveContractSnapshot(request), "从腾讯电子签下载合同PDF文件", request); + } } diff --git a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/rpc/WorkflowGateway.java b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/rpc/WorkflowGateway.java index 55e38ae9..77e43ddc 100644 --- a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/rpc/WorkflowGateway.java +++ b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/rpc/WorkflowGateway.java @@ -4,6 +4,7 @@ import cn.axzo.workflow.common.model.request.bpmn.process.BeforeProcessInstanceC import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCheckApproverDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCreateDTO; +import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO; import cn.axzo.workflow.common.model.request.form.instance.FormVariablesUpdateDTO; import cn.axzo.workflow.common.model.response.bpmn.process.NodesByModelVO; import cn.axzo.workflow.starter.api.WorkflowCoreService; @@ -70,4 +71,14 @@ public class WorkflowGateway { public List nodesBeforeCreateProcessInstance(BeforeProcessInstanceCreateDTO dto) { return workflowCoreService.nodesBeforeCreateProcessInstance(dto); } + + @MethodAroundLog(target = "workflow-engine", source = "nanopart", value = "同意任务") + public void approveProcessInstance(BpmnTaskAuditDTO dto) { + workflowCoreService.approveTask(dto); + } + + @MethodAroundLog(target = "workflow-engine", source = "nanopart", value = "查询指定人在指定审批中的任务 ID") + public String findTaskIdByInstanceIdAndPersonId(String processInstanceId, String personId) { + return workflowManageService.findTaskIdByInstanceIdAndPersonId(processInstanceId, personId); + } }