Merge remote-tracking branch 'origin/feature/REQ-3581' into feature/REQ-3581

This commit is contained in:
yanglin 2025-02-21 17:00:40 +08:00
commit 77c4404dd4
5 changed files with 206 additions and 0 deletions

View File

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

View File

@ -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<ChangeRecordRelation> allRecordRelations = changeRecordRelationService.findByCondition(visaRelationDto);
List<ChangeRecordRelation> 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;
}
}

View File

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

View File

@ -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<ChangeRecordDao, Change
private RectifyApiGateway rectifyApiGateway;
@Resource
private ApolloTaskOrderApiGateway taskOrderApiGateway;
@Autowired
private OperateLogService operateLogService;
/**
* 状态变更
@ -1934,6 +1938,17 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
ChangeRecord update = toUpdate(req, oldValue);
this.updateById(update);
operateLogService.save(LogAddReq.builder()
.scene("UPSERT_CHANGE_RECORD")
.level("INFO")
.tags(Lists.newArrayList(req.getVisaId().toString()))
.message(new JSONObject()
.fluentPut("param", req)
.fluentPut("oldValue", oldValue)
.fluentPut("newValue", this.getById(req.getVisaId()))
.toJSONString())
.build());
}
public ChangeRecord toUpdate(UpdateVisaChangeReq req, ChangeRecord oldValue) {

View File

@ -0,0 +1,37 @@
package cn.axzo.nanopart.visa.server.service.impl;
import cn.axzo.framework.jackson.utility.JSON;
import cn.axzo.log.platform.client.feign.LogApi;
import cn.axzo.log.platform.client.model.req.LogAddReq;
import cn.axzo.nanopart.visa.server.service.OperateLogService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import java.util.concurrent.ExecutorService;
@Slf4j
@Service
public class OperateLogServiceImpl implements OperateLogService {
@Autowired
private LogApi logApi;
@Qualifier("asyncExecutor")
@Autowired
private ExecutorService asyncExecutor;
@Override
public void save(LogAddReq param) {
try {
// 目前操作日志的记录不是核心流程这个方法不抛出异常以免影响正常业务流程
// 异步处理
asyncExecutor.submit(() -> logApi.addLog(param));
} catch (Throwable e) {
log.warn("OperateLogServiceImpl save caught exception, msg = {}, param = {}",
e.getMessage(), JSON.toJSONString(param), e);
}
}
}