diff --git a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/config/ExecutorConfig.java b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/config/ExecutorConfig.java new file mode 100644 index 00000000..1c962e36 --- /dev/null +++ b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/config/ExecutorConfig.java @@ -0,0 +1,29 @@ +package cn.axzo.nanopart.visa.server.config; + +import cn.hutool.core.thread.NamedThreadFactory; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +@Configuration +@Slf4j +public class ExecutorConfig { + + /** + * 异步处理线程池 - 不需要等待处理结束 + * @return + */ + @Bean("asyncExecutor") + public ExecutorService asyncExecutor() { + int coreSize = 5; + ThreadPoolExecutor executor = new ThreadPoolExecutor(coreSize, 10, 60, TimeUnit.SECONDS, + new ArrayBlockingQueue<>(500), new NamedThreadFactory("sync-task-", false), new ThreadPoolExecutor.CallerRunsPolicy()); + executor.prestartCoreThread(); + return executor; + } +} diff --git a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/mq/listener/workflow/process/CompleteVisaChangeStampHandler.java b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/mq/listener/workflow/process/CompleteVisaChangeStampHandler.java new file mode 100644 index 00000000..61c62b43 --- /dev/null +++ b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/mq/listener/workflow/process/CompleteVisaChangeStampHandler.java @@ -0,0 +1,117 @@ +package cn.axzo.nanopart.visa.server.mq.listener.workflow.process; + +import cn.axzo.framework.rocketmq.Event; +import cn.axzo.framework.rocketmq.EventConsumer; +import cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum; +import cn.axzo.nanopart.visa.api.request.UpdateVisaChangeReq; +import cn.axzo.nanopart.visa.server.domain.ChangeRecordRelation; +import cn.axzo.nanopart.visa.server.dto.VisaRelationDto; +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.response.mq.ProcessInstanceDTO; +import cn.axzo.workflow.starter.handler.ProcessInstanceEventHandler; +import com.alibaba.fastjson.JSON; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * 完成变更签证用印申请 + * 变更签证下所有用印申请记录都审核通过时,则完成用印 + */ +@Slf4j +@Component +public class CompleteVisaChangeStampHandler implements ProcessInstanceEventHandler { + + @Autowired + private ChangeRecordRelationService changeRecordRelationService; + @Autowired + private ChangeRecordService changeRecordService; + + @Override + public boolean accept(ProcessInstanceDTO dto, Event event, EventConsumer.Context context) { + return Objects.equals(dto.getProcessDefinitionKey(), ""); + } + + @Override + public void onCreated(ProcessInstanceDTO dto) { + } + + @Override + public void onStarted(ProcessInstanceDTO dto) { + } + + @Override + public void onCompleted(ProcessInstanceDTO dto) { + Long visaId = Long.valueOf(dto.getBusinessKey()); + Long operatorId = Optional.ofNullable(dto.getLastOperationAssigner()) + .map(e -> Long.valueOf(e.getPersonId())) + .orElse(null); + + VisaRelationDto visaRelationDto = VisaRelationDto.builder() + .visaId(visaId) + .varName(VisaRelationFieldEnum.PROCESS_INSTANCE_OF_ESS.name()) + .build(); + List allRecordRelations = changeRecordRelationService.findByCondition(visaRelationDto); + + List changeRecordRelations = allRecordRelations.stream() + .filter(e -> Objects.equals(JSON.parseObject(e.getContent()).getString("approvalId"), dto.getProcessInstanceId())) + .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(changeRecordRelations)) { + log.warn("用印审核完成数据异常,未找到对应的用印申请记录,visaId,{}; processInstanceId,{}", visaId, dto.getProcessInstanceId()); + return; + } + + if (changeRecordRelations.size() > 1) { + log.warn("用印审核完成数据异常,找到多条对应的用印申请记录,visaId,{}; processInstanceId,{}", visaId, dto.getProcessInstanceId()); + } + ChangeRecordRelation changeRecordRelation = changeRecordRelations.stream() + .findFirst() + .get(); + + ChangeRecordRelation update = new ChangeRecordRelation(); + update.setId(changeRecordRelation.getId()); + update.setContentExt(BpmnProcessInstanceResultEnum.APPROVED.getStatus()); + update.setUpdateBy(operatorId); + changeRecordRelationService.updateById(update); + + boolean approved = allRecordRelations.stream() + .filter(e -> Objects.equals(e.getId(), changeRecordRelation.getId())) + .allMatch(e -> Objects.equals(BpmnProcessInstanceResultEnum.APPROVED.getStatus(), e.getContentExt())); + if (approved) { + changeRecordService.update(UpdateVisaChangeReq.builder() + .visaId(visaId) + .operatorId(operatorId) + .visaStampAction(UpdateVisaChangeReq.VisaStampAction.COMPLETE) + .scene("用印审批完成,自动完成用印申请") + .build()); + } + } + + @Override + public void onCancelled(ProcessInstanceDTO dto) { + + } + + @Override + public void onRejected(ProcessInstanceDTO dto) { + + } + + @Override + public void onAborted(ProcessInstanceDTO dto) { + + } + + @Override + public int getOrder() { + return 0; + } +} diff --git a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/OperateLogService.java b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/OperateLogService.java new file mode 100644 index 00000000..dda06f47 --- /dev/null +++ b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/OperateLogService.java @@ -0,0 +1,8 @@ +package cn.axzo.nanopart.visa.server.service; + +import cn.axzo.log.platform.client.model.req.LogAddReq; + +public interface OperateLogService { + + void save(LogAddReq param); +} diff --git a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/impl/ChangeRecordServiceImpl.java b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/impl/ChangeRecordServiceImpl.java index a1ba323b..ea9573ad 100644 --- a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/impl/ChangeRecordServiceImpl.java +++ b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/impl/ChangeRecordServiceImpl.java @@ -27,6 +27,7 @@ import cn.axzo.im.center.api.vo.req.SendChatMessageRequest; import cn.axzo.im.center.api.vo.resp.GroupCreateResponse; import cn.axzo.im.center.common.enums.AppTypeEnum; import cn.axzo.im.center.common.enums.GroupType; +import cn.axzo.log.platform.client.model.req.LogAddReq; import cn.axzo.maokai.api.vo.request.OrgNodeUserBriefInfoListReq; import cn.axzo.maokai.api.vo.request.OrganizationalUnitQuery; import cn.axzo.maokai.api.vo.response.OrgNodeUserBriefInfoResp; @@ -92,6 +93,7 @@ import cn.axzo.nanopart.visa.server.service.ChangeRecordConfirmService; import cn.axzo.nanopart.visa.server.service.ChangeRecordLogService; import cn.axzo.nanopart.visa.server.service.ChangeRecordRelationService; import cn.axzo.nanopart.visa.server.service.ChangeRecordService; +import cn.axzo.nanopart.visa.server.service.OperateLogService; import cn.axzo.nanopart.visa.server.service.VisaHelper; import cn.axzo.nanopart.visa.server.utils.Constants; import cn.axzo.orggateway.api.nodeuser.dto.OrgNodeUserDTO; @@ -244,6 +246,8 @@ public class ChangeRecordServiceImpl extends ServiceImpl logApi.addLog(param)); + } catch (Throwable e) { + log.warn("OperateLogServiceImpl save caught exception, msg = {}, param = {}", + e.getMessage(), JSON.toJSONString(param), e); + } + } +}