提交流程提交相关代码

release_1.0.0
liu 10 months ago
parent e34786f505
commit 01273bbaa6

@ -1,6 +1,8 @@
package com.supervision.knowsub.controller.knowledge;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.supervision.knowsub.entity.vo.knowledge.KnowledgeFlowRecordResVO;
import com.supervision.knowsub.entity.vo.knowledge.ProcessFlowReqVO;
import com.supervision.knowsub.model.KnowledgeFlowRecord;
import com.supervision.knowsub.service.KnowledgeFlowService;
import com.supervision.knowsub.vo.knowledge.KnowledgeFlowResVO;
@ -12,9 +14,12 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.servlet.mvc.condition.RequestConditionHolder;
import java.time.Instant;
import java.time.LocalDateTime;
import java.util.List;
@Slf4j
@RestController
@ -54,14 +59,18 @@ public class KnowledgeFlowController {
@Operation(summary = "审批知识流程")
@PostMapping("processKnowledgeFlow")
public void processKnowledgeFlow() {
public void processKnowledgeFlow(@RequestBody ProcessFlowReqVO reqVO) {
knowledgeFlowService.processKnowledgeFlow(reqVO);
}
@Operation(summary = "查询知识库流转记录")
@Parameters({
@Parameter(name = "knowledgeId", description = "审批状态 1未审批 2已审批", in = ParameterIn.QUERY),
@Parameter(name = "flowId", description = "标题,支持模糊", in = ParameterIn.QUERY)
})
@GetMapping("queryKnowledgeFlowRecord")
public void queryKnowledgeFlowRecord(String knowledgeId) {
public List<KnowledgeFlowRecordResVO> queryKnowledgeFlowRecord(String knowledgeId, @RequestParam(required = false) String flowId) {
return knowledgeFlowService.queryKnowledgeFlowRecord(knowledgeId, flowId);
}

@ -0,0 +1,29 @@
package com.supervision.knowsub.entity.vo.knowledge;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class KnowledgeFlowRecordResVO {
private String id;
private String knowledgeId;
private String processName;
private String remark;
private LocalDateTime processTime;
private String processUserId;
private String processDeptId;
private String processUserName;
private String processDeptName;
private Integer processOrder;
}

@ -0,0 +1,17 @@
package com.supervision.knowsub.entity.vo.knowledge;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class ProcessFlowReqVO {
@Schema(description = "操作类型 1通过 2驳回")
private Integer operate;
private String todoId;
private String knowledgeId;
private String remark;
}

@ -1,14 +1,17 @@
package com.supervision.knowsub.enums;
/**
* 1 2 3
*/
public enum FlowTypeEnum {
SUBMIT(1, "知识报送"),
RECALL(2, "知识撤回"),
DELETE(3, "知识删除");
private Integer flowType;
private final Integer flowType;
private String desc;
private final String desc;
FlowTypeEnum(Integer flowType, String desc) {
this.flowType = flowType;

@ -1,14 +1,18 @@
package com.supervision.knowsub.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
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.model.Knowledge;
import com.supervision.knowsub.model.KnowledgeFlowRecord;
import com.supervision.knowsub.vo.knowledge.KnowledgeFlowResVO;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.time.Instant;
import java.time.LocalDateTime;
import java.util.List;
public interface KnowledgeFlowService {
@ -17,4 +21,8 @@ public interface KnowledgeFlowService {
Integer pageNum, Integer pageSize);
void submitFlowProcess(Knowledge knowledge, FlowTypeEnum flowTypeEnum, String userId, String deptId, String remark);
void processKnowledgeFlow(ProcessFlowReqVO reqVO);
List<KnowledgeFlowRecordResVO> queryKnowledgeFlowRecord(String knowledgeId, String flowId);
}

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

@ -3,6 +3,7 @@ package com.supervision.knowsub.model;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import lombok.AllArgsConstructor;
@ -51,11 +52,21 @@ public class KnowledgeFlowRecord implements Serializable {
*/
private String flowRuleId;
/**
*
*/
private Integer flowRuleOrder;
/**
*
*/
private String processName;
/**
* ,1 2
*/
private Integer processStatus;
/**
* ID
*/
@ -69,7 +80,7 @@ public class KnowledgeFlowRecord implements Serializable {
/**
*
*/
private Date processTime;
private LocalDateTime processTime;
/**
*

@ -9,6 +9,8 @@ public class KnowledgeFlowResVO {
@Schema(description = "待办ID")
private String todoId;
@Schema(description = "流程ID")
private String flowId;
@Schema(description = "知识ID")
private String knowledgeId;
@Schema(description = "标题")

@ -32,6 +32,7 @@
<select id="queryKnowledgeFlowTodoPage" resultType="com.supervision.knowsub.vo.knowledge.KnowledgeFlowResVO">
select t1.id as todoId,
t1.flow_id as flowId,
t2.id as knowledgeId,
t2.title as title,
t1.flow_type as flowType,
@ -75,7 +76,8 @@
<select id="queryKnowledgeFlowCompletePage"
resultType="com.supervision.knowsub.vo.knowledge.KnowledgeFlowResVO">
select t1.id as todoId,
select
t1.flow_id as flowId,
t2.id as knowledgeId,
t2.title as title,
t1.flow_type as flowType,

Loading…
Cancel
Save