|
|
|
@ -1,22 +1,30 @@
|
|
|
|
|
package com.supervision.knowsub.service.impl;
|
|
|
|
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
|
|
import com.supervision.knowsub.domain.UserInfo;
|
|
|
|
|
import com.supervision.knowsub.entity.vo.knowledge.KnowledgeFlowRecordResVO;
|
|
|
|
|
import com.supervision.knowsub.entity.vo.knowledge.ProcessFlowReqVO;
|
|
|
|
|
import com.supervision.knowsub.enums.FlowTypeEnum;
|
|
|
|
|
import com.supervision.knowsub.enums.StatusEnum;
|
|
|
|
|
import com.supervision.knowsub.exception.BusinessException;
|
|
|
|
|
import com.supervision.knowsub.mapper.KnowledgeFlowRecordMapper;
|
|
|
|
|
import com.supervision.knowsub.model.*;
|
|
|
|
|
import com.supervision.knowsub.service.*;
|
|
|
|
|
import com.supervision.knowsub.util.UserUtil;
|
|
|
|
|
import com.supervision.knowsub.vo.knowledge.KnowledgeFlowResVO;
|
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.apache.commons.lang3.ObjectUtils;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
|
|
|
|
import java.time.Instant;
|
|
|
|
|
import java.time.LocalDateTime;
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.Comparator;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Optional;
|
|
|
|
@ -34,6 +42,12 @@ public class KnowledgeFlowServiceImpl implements KnowledgeFlowService {
|
|
|
|
|
|
|
|
|
|
private final SystemFlowRuleUserService systemFlowRuleUserService;
|
|
|
|
|
|
|
|
|
|
private final KnowledgeFlowTodoService knowledgeFlowTodoService;
|
|
|
|
|
|
|
|
|
|
private final SystemFlowService systemFlowService;
|
|
|
|
|
|
|
|
|
|
private final KnowledgeService knowledgeService;
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public IPage<KnowledgeFlowResVO> queryKnowledgeFlowPage(Integer processStatus, String title, String publishDeptId, String baseId,
|
|
|
|
|
String submittedDeptId, Instant flowType,
|
|
|
|
@ -68,25 +82,16 @@ public class KnowledgeFlowServiceImpl implements KnowledgeFlowService {
|
|
|
|
|
.eq(SystemFlowTypeRelation::getFlowType, flowTypeEnum.getFlowType())
|
|
|
|
|
.last(" limit 1").oneOpt();
|
|
|
|
|
SystemFlowTypeRelation systemFlowTypeRelation = systemFlowTypeRelationOpt.orElseThrow(() -> new BusinessException("未找到审批流程,请联系管理员配置审批流程"));
|
|
|
|
|
List<SystemFlowRule> ruleList = systemFlowRuleService.lambdaQuery().eq(SystemFlowRule::getFlowId, systemFlowTypeRelation.getFlowId()).list();
|
|
|
|
|
if (CollUtil.isEmpty(ruleList)) {
|
|
|
|
|
throw new BusinessException("审批流节点为空,请联系管理员配置审批流节点");
|
|
|
|
|
}
|
|
|
|
|
// 根据rule_order进行升序排序
|
|
|
|
|
List<SystemFlowRule> orderList = ruleList.stream().sorted(Comparator.comparingInt(SystemFlowRule::getRuleOrder)).toList();
|
|
|
|
|
// 应该最少有两个节点,一个是起始节点,一个是审批节点才行
|
|
|
|
|
if (orderList.size() < 2) {
|
|
|
|
|
throw new BusinessException("审批流节点数量不足,请联系管理员确认审批流节点是否正确");
|
|
|
|
|
}
|
|
|
|
|
List<SystemFlowRule> roleOrderList = queryFlowRuleWithOrder(systemFlowTypeRelation.getFlowId());
|
|
|
|
|
// 首先获取第一个节点,校验当前用户是否有权限提交
|
|
|
|
|
SystemFlowRule firstRule = orderList.get(0);
|
|
|
|
|
SystemFlowRule firstRule = roleOrderList.get(0);
|
|
|
|
|
Optional<SystemFlowRuleUser> systemFlowRuleUserOpt = systemFlowRuleUserService.lambdaQuery().eq(SystemFlowRuleUser::getFlowId, firstRule.getId())
|
|
|
|
|
.eq(SystemFlowRuleUser::getUserId, userId).eq(SystemFlowRuleUser::getRuleId, firstRule.getId()).oneOpt();
|
|
|
|
|
if (systemFlowRuleUserOpt.isEmpty()) {
|
|
|
|
|
throw new BusinessException("当前用户没有权限提交:" + flowTypeEnum.getDesc() + " 流程,请联系管理员确认");
|
|
|
|
|
}
|
|
|
|
|
// 然后找到下一个节点
|
|
|
|
|
SystemFlowRule nextRule = orderList.get(1);
|
|
|
|
|
SystemFlowRule nextRule = roleOrderList.get(1);
|
|
|
|
|
List<SystemFlowRuleUser> nextRuleUserList = systemFlowRuleUserService.lambdaQuery().eq(SystemFlowRuleUser::getFlowId, nextRule.getId()).eq(SystemFlowRuleUser::getRuleId, nextRule.getId()).list();
|
|
|
|
|
if (CollUtil.isEmpty(nextRuleUserList)) {
|
|
|
|
|
throw new BusinessException("审批节点未配置审批用户,流程提交失败");
|
|
|
|
@ -98,6 +103,7 @@ public class KnowledgeFlowServiceImpl implements KnowledgeFlowService {
|
|
|
|
|
.flowId(systemFlowTypeRelation.getFlowId())
|
|
|
|
|
.flowType(flowTypeEnum.getFlowType())
|
|
|
|
|
.flowRuleId(firstRule.getId())
|
|
|
|
|
.flowRuleOrder(firstRule.getRuleOrder())
|
|
|
|
|
.processName(firstRule.getRuleName())
|
|
|
|
|
.remark(remark)
|
|
|
|
|
.submitUserId(userId)
|
|
|
|
@ -115,4 +121,147 @@ public class KnowledgeFlowServiceImpl implements KnowledgeFlowService {
|
|
|
|
|
todo.insert();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<SystemFlowRule> queryFlowRuleWithOrder(String flowId) {
|
|
|
|
|
List<SystemFlowRule> ruleList = systemFlowRuleService.lambdaQuery().eq(SystemFlowRule::getFlowId, flowId).list();
|
|
|
|
|
if (CollUtil.isEmpty(ruleList)) {
|
|
|
|
|
throw new BusinessException("审批流节点为空,请联系管理员配置审批流节点");
|
|
|
|
|
}
|
|
|
|
|
// 根据rule_order进行升序排序
|
|
|
|
|
List<SystemFlowRule> ruleOrderList = ruleList.stream().sorted(Comparator.comparingInt(SystemFlowRule::getRuleOrder)).toList();
|
|
|
|
|
// 应该最少有两个节点,一个是起始节点,一个是审批节点才行
|
|
|
|
|
if (ruleOrderList.size() < 2) {
|
|
|
|
|
throw new BusinessException("审批流节点数量不足,请联系管理员确认审批流节点是否正确");
|
|
|
|
|
}
|
|
|
|
|
return ruleOrderList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
|
public void processKnowledgeFlow(ProcessFlowReqVO reqVO) {
|
|
|
|
|
// 首先获取这个审批任务
|
|
|
|
|
KnowledgeFlowTodo knowledgeFlowTodo = knowledgeFlowTodoService.getOptById(reqVO.getTodoId()).orElseThrow(() -> new BusinessException("审批任务不存在"));
|
|
|
|
|
// 找到最开始的节点
|
|
|
|
|
KnowledgeFlowRecord submitFlowRecord = knowledgeFlowRecordService.lambdaQuery().eq(KnowledgeFlowRecord::getKnowledgeId, reqVO.getKnowledgeId())
|
|
|
|
|
.eq(KnowledgeFlowRecord::getFlowId, knowledgeFlowTodo.getFlowId()).eq(KnowledgeFlowRecord::getFlowType, knowledgeFlowTodo.getFlowType())
|
|
|
|
|
.eq(KnowledgeFlowRecord::getType, 1).orderByDesc(KnowledgeFlowRecord::getCreateTime).last(" limit 1").oneOpt().orElse(new KnowledgeFlowRecord());
|
|
|
|
|
UserInfo user = UserUtil.getUser();
|
|
|
|
|
// 将这个任务对应的TODO删除掉
|
|
|
|
|
knowledgeFlowTodoService.lambdaUpdate().eq(KnowledgeFlowTodo::getKnowledgeId, reqVO.getKnowledgeId())
|
|
|
|
|
.eq(KnowledgeFlowTodo::getFlowId, knowledgeFlowTodo.getFlowId())
|
|
|
|
|
.eq(KnowledgeFlowTodo::getFlowType, knowledgeFlowTodo.getFlowType())
|
|
|
|
|
.eq(KnowledgeFlowTodo::getRuleId, knowledgeFlowTodo.getRuleId()).remove();
|
|
|
|
|
// 然后获取下一个节点
|
|
|
|
|
List<SystemFlowRule> ruleOrderList = queryFlowRuleWithOrder(knowledgeFlowTodo.getFlowId());
|
|
|
|
|
// 从list中找到当前节点
|
|
|
|
|
SystemFlowRule currentRule = null;
|
|
|
|
|
// 然后根据order找到当前节点在ruleOrderList中的索引号(根据ID进行查找)
|
|
|
|
|
int index = 0;
|
|
|
|
|
for (int i = 0; i < ruleOrderList.size(); i++) {
|
|
|
|
|
SystemFlowRule rule = ruleOrderList.get(i);
|
|
|
|
|
if (rule.getId().equals(knowledgeFlowTodo.getRuleId())) {
|
|
|
|
|
index = i;
|
|
|
|
|
currentRule = rule;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (ObjectUtils.isEmpty(currentRule)) {
|
|
|
|
|
throw new BusinessException("审批节点不存在");
|
|
|
|
|
}
|
|
|
|
|
if (1 == reqVO.getOperate()) {
|
|
|
|
|
// 如果当前节点的索引号和节点数量相等,说明是最后一个节点,这时说明流程走完了
|
|
|
|
|
if (ruleOrderList.size() == index) {
|
|
|
|
|
// 这时走流程结束的流程
|
|
|
|
|
|
|
|
|
|
KnowledgeFlowRecord newKnowledgeFlowRecord = KnowledgeFlowRecord.builder().type(2)
|
|
|
|
|
.knowledgeId(knowledgeFlowTodo.getKnowledgeId())
|
|
|
|
|
.flowId(knowledgeFlowTodo.getFlowId())
|
|
|
|
|
.flowType(knowledgeFlowTodo.getFlowType())
|
|
|
|
|
.flowRuleId(currentRule.getId())
|
|
|
|
|
.flowRuleOrder(currentRule.getRuleOrder())
|
|
|
|
|
.processName(currentRule.getRuleName())
|
|
|
|
|
.processStatus(1)
|
|
|
|
|
.processUserId(user.getId())
|
|
|
|
|
.processDeptId(user.getDeptId())
|
|
|
|
|
.processTime(LocalDateTime.now())
|
|
|
|
|
.remark(reqVO.getRemark())
|
|
|
|
|
.submitUserId(submitFlowRecord.getSubmitUserId())
|
|
|
|
|
.submitDeptId(submitFlowRecord.getSubmitDeptId()).build();
|
|
|
|
|
knowledgeFlowRecordService.save(newKnowledgeFlowRecord);
|
|
|
|
|
// 将知识的状态进行修改
|
|
|
|
|
knowledgeService.lambdaUpdate().set(Knowledge::getStatus, StatusEnum.PASS.getStatus()).set(Knowledge::getDraftBelongUserId, null)
|
|
|
|
|
.eq(Knowledge::getId, reqVO.getKnowledgeId()).update();
|
|
|
|
|
} else {
|
|
|
|
|
SystemFlowRule nextRule;
|
|
|
|
|
try {
|
|
|
|
|
nextRule = ruleOrderList.get(index + 1);
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
throw new BusinessException("未找到下一个审批节点,请联系管理员解决");
|
|
|
|
|
}
|
|
|
|
|
List<SystemFlowRuleUser> nextRuleUserList = systemFlowRuleUserService.lambdaQuery().eq(SystemFlowRuleUser::getFlowId, nextRule.getId())
|
|
|
|
|
.eq(SystemFlowRuleUser::getRuleId, nextRule.getId()).list();
|
|
|
|
|
if (CollUtil.isEmpty(nextRuleUserList)) {
|
|
|
|
|
throw new BusinessException("下级审批节点未配置审批用户,审批失败,请联系管理员解决");
|
|
|
|
|
}
|
|
|
|
|
// 生成下一个节点的TODO
|
|
|
|
|
for (SystemFlowRuleUser todoUser : nextRuleUserList) {
|
|
|
|
|
KnowledgeFlowTodo todo = new KnowledgeFlowTodo();
|
|
|
|
|
todo.setFlowId(nextRule.getFlowId());
|
|
|
|
|
todo.setKnowledgeId(knowledgeFlowTodo.getKnowledgeId());
|
|
|
|
|
todo.setTodoUserId(todoUser.getUserId());
|
|
|
|
|
todo.setFlowType(knowledgeFlowTodo.getFlowType());
|
|
|
|
|
todo.setRuleId(nextRule.getId());
|
|
|
|
|
todo.insert();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 驳回流程
|
|
|
|
|
else if (2 == reqVO.getOperate()) {
|
|
|
|
|
KnowledgeFlowRecord newKnowledgeFlowRecord = KnowledgeFlowRecord.builder().type(2)
|
|
|
|
|
.knowledgeId(knowledgeFlowTodo.getKnowledgeId())
|
|
|
|
|
.flowId(knowledgeFlowTodo.getFlowId())
|
|
|
|
|
.flowType(knowledgeFlowTodo.getFlowType())
|
|
|
|
|
.flowRuleId(currentRule.getId())
|
|
|
|
|
.flowRuleOrder(currentRule.getRuleOrder())
|
|
|
|
|
.processName(currentRule.getRuleName())
|
|
|
|
|
.processStatus(2)
|
|
|
|
|
.processUserId(user.getId())
|
|
|
|
|
.processDeptId(user.getDeptId())
|
|
|
|
|
.processTime(LocalDateTime.now())
|
|
|
|
|
.remark(reqVO.getRemark())
|
|
|
|
|
.submitUserId(submitFlowRecord.getSubmitUserId())
|
|
|
|
|
.submitDeptId(submitFlowRecord.getSubmitDeptId()).build();
|
|
|
|
|
knowledgeFlowRecordService.save(newKnowledgeFlowRecord);
|
|
|
|
|
// 将知识的状态进行修改
|
|
|
|
|
knowledgeService.lambdaUpdate().set(Knowledge::getStatus, StatusEnum.REJECT.getStatus())
|
|
|
|
|
.eq(Knowledge::getId, reqVO.getKnowledgeId()).update();
|
|
|
|
|
} else {
|
|
|
|
|
throw new BusinessException("暂不支持的审批类型");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public List<KnowledgeFlowRecordResVO> queryKnowledgeFlowRecord(String knowledgeId, String flowId) {
|
|
|
|
|
List<KnowledgeFlowRecord> list = knowledgeFlowRecordService.lambdaQuery().eq(KnowledgeFlowRecord::getKnowledgeId, knowledgeId)
|
|
|
|
|
.eq(StrUtil.isNotBlank(flowId), KnowledgeFlowRecord::getFlowId, flowId).list();
|
|
|
|
|
List<KnowledgeFlowRecordResVO> list1 = list.stream().sorted(Comparator.comparingInt(KnowledgeFlowRecord::getFlowRuleOrder)).map(knowledgeFlowRecord -> {
|
|
|
|
|
KnowledgeFlowRecordResVO node = new KnowledgeFlowRecordResVO();
|
|
|
|
|
node.setKnowledgeId(knowledgeFlowRecord.getKnowledgeId());
|
|
|
|
|
node.setProcessName(knowledgeFlowRecord.getProcessName());
|
|
|
|
|
node.setRemark(knowledgeFlowRecord.getRemark());
|
|
|
|
|
// 判断
|
|
|
|
|
node.setProcessTime(knowledgeFlowRecord.getProcessTime());
|
|
|
|
|
// node.setProcessUserId();
|
|
|
|
|
// node.setProcessDeptId();
|
|
|
|
|
// node.setProcessUserName();
|
|
|
|
|
// node.setProcessDeptName();
|
|
|
|
|
// node.setProcessOrder();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return node;
|
|
|
|
|
}).toList();
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|