feat(REQ-3581) - 增加监听电子签的事件

This commit is contained in:
wangli 2025-02-26 16:50:23 +08:00
parent b9725fe6a1
commit d63beeb53b
3 changed files with 152 additions and 0 deletions

View File

@ -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<ChangeRecord> optVisa = changeRecordService.lambdaQuery().eq(ChangeRecord::getContractId, contract.getEssContractId())
.oneOpt();
// 取消用印会清空合同 id这里兼容该情况
optVisa.ifPresent(changeRecord -> {
log.info("change record : {}", JSON.toJSONString(changeRecord));
Map<Long, EssApproveDetail> ouStampStateMap = contract.getApproveDetails().stream()
.filter(i -> Objects.nonNull(i.getSignPerson()))
.collect(Collectors.toMap(i -> i.getSignPerson().getOuId(), Function.identity(), (s, t) -> s));
List<ChangeRecordRelation> 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<GetWorkspaceDetailRes> 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);
}
}

View File

@ -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<EssOrgAndSealInfo> getOrgEnabledSeals(GetSealsRequest request) {
return RpcUtil.rpcApiResultProcessor(() -> essApi.getOrgEnabledSeals(request), "查询单位已启用的印章以及授权人员列表", request);
}
public void saveContractSnapshot(SaveContractSnapshotRequest request) {
RpcUtil.rpcApiResultProcessor(() -> essApi.saveContractSnapshot(request), "从腾讯电子签下载合同PDF文件", request);
}
}

View File

@ -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<NodesByModelVO> 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);
}
}