diff --git a/know_sub_business/src/main/java/com/supervision/knowsub/controller/knowledge/KnowledgeFlowController.java b/know_sub_business/src/main/java/com/supervision/knowsub/controller/knowledge/KnowledgeFlowController.java index b5777bb..9841c64 100644 --- a/know_sub_business/src/main/java/com/supervision/knowsub/controller/knowledge/KnowledgeFlowController.java +++ b/know_sub_business/src/main/java/com/supervision/knowsub/controller/knowledge/KnowledgeFlowController.java @@ -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 queryKnowledgeFlowRecord(String knowledgeId, @RequestParam(required = false) String flowId) { + return knowledgeFlowService.queryKnowledgeFlowRecord(knowledgeId, flowId); } diff --git a/know_sub_business/src/main/java/com/supervision/knowsub/entity/vo/knowledge/KnowledgeFlowRecordResVO.java b/know_sub_business/src/main/java/com/supervision/knowsub/entity/vo/knowledge/KnowledgeFlowRecordResVO.java new file mode 100644 index 0000000..bedfc3d --- /dev/null +++ b/know_sub_business/src/main/java/com/supervision/knowsub/entity/vo/knowledge/KnowledgeFlowRecordResVO.java @@ -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; +} diff --git a/know_sub_business/src/main/java/com/supervision/knowsub/entity/vo/knowledge/ProcessFlowReqVO.java b/know_sub_business/src/main/java/com/supervision/knowsub/entity/vo/knowledge/ProcessFlowReqVO.java new file mode 100644 index 0000000..d1a2039 --- /dev/null +++ b/know_sub_business/src/main/java/com/supervision/knowsub/entity/vo/knowledge/ProcessFlowReqVO.java @@ -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; +} diff --git a/know_sub_business/src/main/java/com/supervision/knowsub/enums/FlowTypeEnum.java b/know_sub_business/src/main/java/com/supervision/knowsub/enums/FlowTypeEnum.java index da164c4..d573450 100644 --- a/know_sub_business/src/main/java/com/supervision/knowsub/enums/FlowTypeEnum.java +++ b/know_sub_business/src/main/java/com/supervision/knowsub/enums/FlowTypeEnum.java @@ -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; diff --git a/know_sub_business/src/main/java/com/supervision/knowsub/service/KnowledgeFlowService.java b/know_sub_business/src/main/java/com/supervision/knowsub/service/KnowledgeFlowService.java index 31d025b..90e77d5 100644 --- a/know_sub_business/src/main/java/com/supervision/knowsub/service/KnowledgeFlowService.java +++ b/know_sub_business/src/main/java/com/supervision/knowsub/service/KnowledgeFlowService.java @@ -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 queryKnowledgeFlowRecord(String knowledgeId, String flowId); } diff --git a/know_sub_business/src/main/java/com/supervision/knowsub/service/impl/KnowledgeFlowServiceImpl.java b/know_sub_business/src/main/java/com/supervision/knowsub/service/impl/KnowledgeFlowServiceImpl.java index 0404927..8ede3ba 100644 --- a/know_sub_business/src/main/java/com/supervision/knowsub/service/impl/KnowledgeFlowServiceImpl.java +++ b/know_sub_business/src/main/java/com/supervision/knowsub/service/impl/KnowledgeFlowServiceImpl.java @@ -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 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 ruleList = systemFlowRuleService.lambdaQuery().eq(SystemFlowRule::getFlowId, systemFlowTypeRelation.getFlowId()).list(); - if (CollUtil.isEmpty(ruleList)) { - throw new BusinessException("审批流节点为空,请联系管理员配置审批流节点"); - } - // 根据rule_order进行升序排序 - List orderList = ruleList.stream().sorted(Comparator.comparingInt(SystemFlowRule::getRuleOrder)).toList(); - // 应该最少有两个节点,一个是起始节点,一个是审批节点才行 - if (orderList.size() < 2) { - throw new BusinessException("审批流节点数量不足,请联系管理员确认审批流节点是否正确"); - } + List roleOrderList = queryFlowRuleWithOrder(systemFlowTypeRelation.getFlowId()); // 首先获取第一个节点,校验当前用户是否有权限提交 - SystemFlowRule firstRule = orderList.get(0); + SystemFlowRule firstRule = roleOrderList.get(0); Optional 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 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 queryFlowRuleWithOrder(String flowId) { + List ruleList = systemFlowRuleService.lambdaQuery().eq(SystemFlowRule::getFlowId, flowId).list(); + if (CollUtil.isEmpty(ruleList)) { + throw new BusinessException("审批流节点为空,请联系管理员配置审批流节点"); + } + // 根据rule_order进行升序排序 + List 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 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 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 queryKnowledgeFlowRecord(String knowledgeId, String flowId) { + List list = knowledgeFlowRecordService.lambdaQuery().eq(KnowledgeFlowRecord::getKnowledgeId, knowledgeId) + .eq(StrUtil.isNotBlank(flowId), KnowledgeFlowRecord::getFlowId, flowId).list(); + List 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; + } } diff --git a/know_sub_model/src/main/java/com/supervision/knowsub/model/KnowledgeFlowRecord.java b/know_sub_model/src/main/java/com/supervision/knowsub/model/KnowledgeFlowRecord.java index ffe34e5..7db7af8 100644 --- a/know_sub_model/src/main/java/com/supervision/knowsub/model/KnowledgeFlowRecord.java +++ b/know_sub_model/src/main/java/com/supervision/knowsub/model/KnowledgeFlowRecord.java @@ -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; /** * 备注 diff --git a/know_sub_model/src/main/java/com/supervision/knowsub/vo/knowledge/KnowledgeFlowResVO.java b/know_sub_model/src/main/java/com/supervision/knowsub/vo/knowledge/KnowledgeFlowResVO.java index 9241888..f3c01ff 100644 --- a/know_sub_model/src/main/java/com/supervision/knowsub/vo/knowledge/KnowledgeFlowResVO.java +++ b/know_sub_model/src/main/java/com/supervision/knowsub/vo/knowledge/KnowledgeFlowResVO.java @@ -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 = "标题") diff --git a/know_sub_model/src/main/resources/mapper/KnowledgeFlowRecordMapper.xml b/know_sub_model/src/main/resources/mapper/KnowledgeFlowRecordMapper.xml index e2de2b8..c0ee610 100644 --- a/know_sub_model/src/main/resources/mapper/KnowledgeFlowRecordMapper.xml +++ b/know_sub_model/src/main/resources/mapper/KnowledgeFlowRecordMapper.xml @@ -32,6 +32,7 @@ - select t1.id as todoId, + select + t1.flow_id as flowId, t2.id as knowledgeId, t2.title as title, t1.flow_type as flowType,