This commit is contained in:
2026-09-20 17:35:59 +08:00
parent 6987a0e790
commit 2f56ca07cb
17 changed files with 419 additions and 5 deletions
+4
View File
@@ -62,6 +62,10 @@
<groupId>org.springblade</groupId>
<artifactId>blade-mk-api</artifactId>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-transport-api</artifactId>
</dependency>
<!-- 其他依赖 -->
<dependency>
@@ -86,4 +86,12 @@ public class BusinessProcessClient implements IBusinessProcessClient {
@RequestParam(value = "loginName", required = false) String loginName) {
return FR.data(businessProcessService.getCurrentNodes(processInstanceId, loginName));
}
@PreAuth(AuthConstant.PERMIT_ALL)
@GetMapping(GET_PROCESS_INFO)
@Override
public FR<Object> getProcessInfo(@RequestParam("processInstanceId") String processInstanceId,
@RequestParam(value = "loginName", required = false) String loginName) {
return FR.data(businessProcessService.getProcessInfo(processInstanceId, loginName));
}
}
@@ -43,6 +43,15 @@ public interface IBusinessProcessService extends IService<BusinessProcess> {
*/
List<?> getCurrentNodes(String processInstanceId, String loginName);
/**
* 获取流程实例详情
*
* @param processInstanceId 流程实例id
* @param loginName MK登录名(手机号),可为空,为空时按流程发起人解析
* @return 流程实例详情
*/
Object getProcessInfo(String processInstanceId, String loginName);
/**
* 修改业务流程状态
* @param param
@@ -15,6 +15,7 @@ import org.springblade.process.pojo.enums.ApproveStatusEnum;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.log.utils.AssertUtils;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.FR;
import org.springblade.core.tool.utils.StringUtil;
import org.springblade.process.convert.ApprovalConvert;
import org.springblade.process.convert.BusinessProcessConvert;
@@ -41,12 +42,15 @@ import org.springblade.thirdparty.mk.pojo.dto.approval.MKProcessDTO;
import org.springblade.thirdparty.mk.pojo.dto.sort.*;
import org.springblade.thirdparty.mk.pojo.vo.*;
import org.springblade.thirdparty.mk.service.IMKService;
import org.springblade.transport.feign.ICustomerArchiveClient;
import org.springblade.transport.pojo.dto.CustomerProcessNodeSyncDTO;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 业务流程关联表 服务实现类
@@ -64,6 +68,7 @@ public class BusinessProcessServiceImpl extends ServiceImpl<BusinessProcessMappe
private final MKProperties mkProperties;
private final ApprovalConvert approvalConvert;
private final IUserService userService;
private final ICustomerArchiveClient customerArchiveClient;
@Transactional(rollbackFor = Exception.class)
@Override
@@ -163,7 +168,8 @@ public class BusinessProcessServiceImpl extends ServiceImpl<BusinessProcessMappe
businessProcess.setProcessInstanceId(processInstanceId);
businessProcess.setApproveStatus(ApproveStatusEnum.APPROVING.getValue());
this.saveOrUpdate(businessProcess);
this.getCurrentNodes(processInstanceId, loginName);
List<?> currentNodes = this.getCurrentNodes(processInstanceId, loginName);
this.syncCustomerArchiveCurrentNode(param.getFormInstanceId(), currentNodes);
return processInstanceId;
}
@@ -193,6 +199,106 @@ public class BusinessProcessServiceImpl extends ServiceImpl<BusinessProcessMappe
}
}
@Override
public Object getProcessInfo(String processInstanceId, String loginName) {
if (StringUtils.isBlank(processInstanceId)) {
log.warn("查询流程实例详情失败,processInstanceId为空");
return null;
}
String resolvedLoginName = loginName;
if (StringUtils.isBlank(resolvedLoginName)) {
BusinessProcess businessProcess = this.getBusinessProcessByProcessInstanceId(processInstanceId);
resolvedLoginName = resolvePromoterLoginName(businessProcess, null);
}
if (StringUtils.isBlank(resolvedLoginName)) {
log.warn("查询流程实例详情失败,loginName为空 processInstanceId={}", processInstanceId);
return null;
}
try {
Object processInfo = mkService.getProcessInfo(processInstanceId, resolvedLoginName);
log.info("获取流程实例详情 processInstanceId={} loginName={} result={}",
processInstanceId, resolvedLoginName, JSON.toJSONString(processInfo));
return processInfo;
} catch (Exception e) {
log.error("查询流程实例详情异常 processInstanceId={} loginName={}", processInstanceId, resolvedLoginName, e);
return null;
}
}
private void syncCustomerArchiveCurrentNode(String formInstanceId, List<?> currentNodes) {
if (StringUtils.isBlank(formInstanceId) || CollectionUtil.isEmpty(currentNodes)) {
log.warn("同步客商当前节点跳过,formInstanceId或节点详情为空 formInstanceId={}", formInstanceId);
return;
}
Long customerId;
try {
customerId = Long.valueOf(formInstanceId);
} catch (NumberFormatException e) {
log.warn("同步客商当前节点失败,表单实例id不是数字:{}", formInstanceId);
return;
}
String currentNode = currentNodes.stream()
.map(this::readMkNodeName)
.filter(StringUtils::isNotBlank)
.distinct()
.collect(Collectors.joining(","));
String currentProcessor = currentNodes.stream()
.flatMap(this::readMkHandlerNames)
.filter(StringUtils::isNotBlank)
.distinct()
.collect(Collectors.joining(","));
if (StringUtils.isBlank(currentNode) && StringUtils.isBlank(currentProcessor)) {
log.warn("同步客商当前节点跳过,未解析到节点名称或处理人 customerId={}", customerId);
return;
}
CustomerProcessNodeSyncDTO param = new CustomerProcessNodeSyncDTO();
param.setId(customerId);
param.setCurrentNode(currentNode);
param.setCurrentProcessor(currentProcessor);
param.setApprovalStatus("reviewing");
try {
FR<Boolean> result = customerArchiveClient.syncProcessNode(param);
log.info("同步客商当前节点完成 customerId={} currentNode={} currentProcessor={} result={}",
customerId, currentNode, currentProcessor, JSON.toJSONString(result));
} catch (Exception e) {
log.error("同步客商当前节点异常 customerId={} currentNode={} currentProcessor={}",
customerId, currentNode, currentProcessor, e);
}
}
private String readMkNodeName(Object node) {
if (node instanceof MKNodeVO vo) {
return vo.getNodeName();
}
if (node instanceof Map<?, ?> map) {
Object value = map.get("nodeName");
return value == null ? null : String.valueOf(value);
}
return null;
}
private Stream<String> readMkHandlerNames(Object node) {
List<MKNodeHandlerVO> handlers = null;
if (node instanceof MKNodeVO vo) {
handlers = vo.getNodeHandlers();
} else if (node instanceof Map<?, ?> map && map.get("nodeHandlers") instanceof List<?> list) {
return list.stream().map(item -> {
if (item instanceof MKNodeHandlerVO handler) {
return handler.getHandlerName();
}
if (item instanceof Map<?, ?> handlerMap) {
Object value = handlerMap.get("handlerName");
return value == null ? null : String.valueOf(value);
}
return null;
});
}
if (CollectionUtil.isEmpty(handlers)) {
return Stream.empty();
}
return handlers.stream().map(MKNodeHandlerVO::getHandlerName);
}
/**
* 从当前登录用户实体读取真实手机号(绕过接口返回脱敏)
*/