diff --git a/doc/知识审批流转.png b/doc/知识审批流转.png new file mode 100644 index 0000000..3db500e Binary files /dev/null and b/doc/知识审批流转.png differ diff --git a/know_sub_business/src/main/java/com/supervision/knowsub/controller/knowledge/KnowledgeManageController.java b/know_sub_business/src/main/java/com/supervision/knowsub/controller/knowledge/KnowledgeManageController.java index 736bf14..5f859cc 100644 --- a/know_sub_business/src/main/java/com/supervision/knowsub/controller/knowledge/KnowledgeManageController.java +++ b/know_sub_business/src/main/java/com/supervision/knowsub/controller/knowledge/KnowledgeManageController.java @@ -2,6 +2,7 @@ package com.supervision.knowsub.controller.knowledge; import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.supervision.knowsub.entity.vo.knowledge.KnowledgeDetailResVO; import com.supervision.knowsub.entity.vo.knowledge.ModifyKnowledgeReqVO; import com.supervision.knowsub.entity.vo.knowledge.SaveKnowledgeReqVO; import com.supervision.knowsub.service.KnowledgeManageService; @@ -26,7 +27,7 @@ public class KnowledgeManageController { @Operation(summary = "查询知识库分页") @Parameters({ - @Parameter(name = "status", description = "流转状态 为空查全部,1草稿 2待审批 3驳回 4通过 5删除 6已失效", in = ParameterIn.QUERY), + @Parameter(name = "status", description = "流转状态 为空查全部,1草稿 2通过 3驳回 4已撤回 5已失效 6已删除 10待审批(新增) 11待审批(删除) 12待审批(撤回)", in = ParameterIn.QUERY), @Parameter(name = "title", description = "标题,支持模糊", in = ParameterIn.QUERY), @Parameter(name = "publishDeptName", description = "发文部门,支持模糊", in = ParameterIn.QUERY), @Parameter(name = "pageNum", description = "分页", in = ParameterIn.QUERY), @@ -55,19 +56,19 @@ public class KnowledgeManageController { @Operation(summary = "撤回知识库") @GetMapping("recallKnowledge") - public void recallKnowledge() { - + public void recallKnowledge(String knowledgeId) { + knowledgeManageService.recallKnowledge(knowledgeId); } @Operation(summary = "查看知识的详细信息") @GetMapping("queryKnowledgeDetail") - public void queryKnowledgeDetail(String knowledgeId) { - + public KnowledgeDetailResVO queryKnowledgeDetail(String knowledgeId) { + return knowledgeManageService.queryKnowledgeDetail(knowledgeId); } - @Operation(summary = "删除知识库") + @Operation(summary = "删除知识库-逻辑删除") @GetMapping("deleteKnowledge") - public void deleteKnowledge() { + public void deleteKnowledge(String knowledgeId) { } diff --git a/know_sub_business/src/main/java/com/supervision/knowsub/entity/vo/knowledge/KnowledgeDetailResVO.java b/know_sub_business/src/main/java/com/supervision/knowsub/entity/vo/knowledge/KnowledgeDetailResVO.java new file mode 100644 index 0000000..ed16966 --- /dev/null +++ b/know_sub_business/src/main/java/com/supervision/knowsub/entity/vo/knowledge/KnowledgeDetailResVO.java @@ -0,0 +1,24 @@ +package com.supervision.knowsub.entity.vo.knowledge; + +import com.supervision.knowsub.model.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class KnowledgeDetailResVO { + + private Knowledge knowledge; + + private KnowledgeBaseInfo knowledgeBaseInfo; + + private KnowledgeContext knowledgeContext; + + private List knowledgeLinkList; + + private List fileInfoList; +} diff --git a/know_sub_business/src/main/java/com/supervision/knowsub/enums/StatusEnum.java b/know_sub_business/src/main/java/com/supervision/knowsub/enums/StatusEnum.java index 9325359..51b7beb 100644 --- a/know_sub_business/src/main/java/com/supervision/knowsub/enums/StatusEnum.java +++ b/know_sub_business/src/main/java/com/supervision/knowsub/enums/StatusEnum.java @@ -1,14 +1,9 @@ package com.supervision.knowsub.enums; /** - * * 1 草稿 - * * 2 通过 - * * 3 驳回 - * * 4 已撤回 - * * 5 已失效 - * * 10 待审批(新增) - * * 11 待审批(删除) - * * 12 待审批(撤回) + * 1草稿 2通过 3驳回 4已撤回 5已失效 6已删除 10待审批(新增) 11待审批(删除) 12待审批(撤回) + * + * */ public enum StatusEnum { diff --git a/know_sub_business/src/main/java/com/supervision/knowsub/service/FileService.java b/know_sub_business/src/main/java/com/supervision/knowsub/service/FileService.java index c54ae5d..d974e51 100644 --- a/know_sub_business/src/main/java/com/supervision/knowsub/service/FileService.java +++ b/know_sub_business/src/main/java/com/supervision/knowsub/service/FileService.java @@ -1,10 +1,15 @@ package com.supervision.knowsub.service; +import com.supervision.knowsub.model.FileInfo; import org.springframework.web.multipart.MultipartFile; +import java.util.List; + public interface FileService { String uploadFile(String fileName, byte[] fileBytes); void deleteFileById(String fileId); + + List listByFileId(List fileIdList); } diff --git a/know_sub_business/src/main/java/com/supervision/knowsub/service/KnowledgeManageService.java b/know_sub_business/src/main/java/com/supervision/knowsub/service/KnowledgeManageService.java index 130612b..2335208 100644 --- a/know_sub_business/src/main/java/com/supervision/knowsub/service/KnowledgeManageService.java +++ b/know_sub_business/src/main/java/com/supervision/knowsub/service/KnowledgeManageService.java @@ -1,6 +1,7 @@ package com.supervision.knowsub.service; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.supervision.knowsub.entity.vo.knowledge.KnowledgeDetailResVO; import com.supervision.knowsub.entity.vo.knowledge.ModifyKnowledgeReqVO; import com.supervision.knowsub.entity.vo.knowledge.SaveKnowledgeReqVO; import com.supervision.knowsub.model.Knowledge; @@ -13,4 +14,10 @@ public interface KnowledgeManageService { void saveKnowledge(SaveKnowledgeReqVO reqVO); void updateKnowledge(ModifyKnowledgeReqVO reqVO); + + void recallKnowledge(String knowledgeId); + + KnowledgeDetailResVO queryKnowledgeDetail(String knowledgeId); + + void deleteKnowledge(String knowledgeId); } diff --git a/know_sub_business/src/main/java/com/supervision/knowsub/service/impl/FileServiceImpl.java b/know_sub_business/src/main/java/com/supervision/knowsub/service/impl/FileServiceImpl.java index 96c36a2..b6763c8 100644 --- a/know_sub_business/src/main/java/com/supervision/knowsub/service/impl/FileServiceImpl.java +++ b/know_sub_business/src/main/java/com/supervision/knowsub/service/impl/FileServiceImpl.java @@ -1,5 +1,6 @@ package com.supervision.knowsub.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.unit.DataSizeUtil; @@ -16,6 +17,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; @Service @Slf4j @@ -57,4 +60,12 @@ public class FileServiceImpl implements FileService { fileInfoService.removeById(fileId); } } + + @Override + public List listByFileId(List fileIdList) { + if (CollUtil.isEmpty(fileIdList)){ + return new ArrayList<>(); + } + return fileInfoService.lambdaQuery().in(FileInfo::getId, fileIdList).list(); + } } diff --git a/know_sub_business/src/main/java/com/supervision/knowsub/service/impl/KnowledgeManageServiceImpl.java b/know_sub_business/src/main/java/com/supervision/knowsub/service/impl/KnowledgeManageServiceImpl.java index d74826c..c44651f 100644 --- a/know_sub_business/src/main/java/com/supervision/knowsub/service/impl/KnowledgeManageServiceImpl.java +++ b/know_sub_business/src/main/java/com/supervision/knowsub/service/impl/KnowledgeManageServiceImpl.java @@ -3,6 +3,7 @@ package com.supervision.knowsub.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.supervision.knowsub.entity.vo.knowledge.KnowledgeDetailResVO; import com.supervision.knowsub.entity.vo.knowledge.KnowledgeLinkVO; import com.supervision.knowsub.entity.vo.knowledge.ModifyKnowledgeReqVO; import com.supervision.knowsub.entity.vo.knowledge.SaveKnowledgeReqVO; @@ -17,6 +18,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; @@ -35,6 +37,8 @@ public class KnowledgeManageServiceImpl implements KnowledgeManageService { private final KnowledgeLinkService knowledgeLinkService; + private final KnowledgeFlowRecordService flowRecordService; + private final FileService fileService; @@ -60,7 +64,7 @@ public class KnowledgeManageServiceImpl implements KnowledgeManageService { knowledge.setPublishDept(reqVO.getPublishDept()); // 目前只有人工添加 knowledge.setKnowledgeFrom(1); - knowledge.setStatus(reqVO.getOperate() == 1 ? StatusEnum.DRAFT.getStatus() : StatusEnum.WAIT_APPROVAL.getStatus()); + knowledge.setStatus(reqVO.getOperate() == 1 ? StatusEnum.DRAFT.getStatus() : StatusEnum.WAIT_APPROVAL.getStatus()); knowledge.setSubmittedDeptId(reqVO.getSubmittedDeptId()); if (1 == reqVO.getOperate()) { knowledge.setDraftBelongUserId(reqVO.getUserId()); @@ -92,14 +96,13 @@ public class KnowledgeManageServiceImpl implements KnowledgeManageService { } /** - * * @param reqVO */ @Override public void updateKnowledge(ModifyKnowledgeReqVO reqVO) { Knowledge knowledge = knowledgeService.getOptById(reqVO.getKnowledgeId()).orElseThrow(() -> new BusinessException("未找到知识")); - // 首先校验状态,草稿/已撤回/已失效/驳回,才能修改 - Set canModifyStatusSet = Set.of(StatusEnum.DRAFT.getStatus(), StatusEnum.RECALL.getStatus(), StatusEnum.INVALID.getStatus(),StatusEnum.REJECT.getStatus()); + // 首先校验状态,草稿/已撤回/已失效/驳回,才能修改(通过的,要先撤回才能修改) + Set canModifyStatusSet = Set.of(StatusEnum.DRAFT.getStatus(), StatusEnum.RECALL.getStatus(), StatusEnum.INVALID.getStatus(), StatusEnum.REJECT.getStatus()); if (!canModifyStatusSet.contains(knowledge.getStatus())) { throw new BusinessException("当前状态不支持修改"); } @@ -112,7 +115,7 @@ public class KnowledgeManageServiceImpl implements KnowledgeManageService { // TODO 这里目前子库设置为空 knowledge.setPublishDept(reqVO.getPublishDept()); knowledge.setSubmittedDeptId(reqVO.getSubmittedDeptId()); - knowledge.setStatus(reqVO.getOperate() == 1 ? StatusEnum.DRAFT.getStatus() : StatusEnum.WAIT_APPROVAL.getStatus()); + knowledge.setStatus(reqVO.getOperate() == 1 ? StatusEnum.DRAFT.getStatus() : StatusEnum.WAIT_APPROVAL.getStatus()); // 如果保存为草稿 if (1 == reqVO.getOperate()) { @@ -121,19 +124,19 @@ public class KnowledgeManageServiceImpl implements KnowledgeManageService { knowledgeService.updateById(knowledge); // 更新基础信息 KnowledgeBaseInfo knowledgeBaseInfo = reqVO.getKnowledgeBaseInfo(); - Assert.notBlank(knowledgeBaseInfo.getKnowledgeId(),"知识ID不能为空"); + Assert.notBlank(knowledgeBaseInfo.getKnowledgeId(), "知识ID不能为空"); // 这里需要用SQL进行更新,不能用封装的updateById,因为前端某些字段可能变为空,用updateById不能让那个想为空的变成空 knowledgeBaseInfoService.lambdaUpdate() - .set(KnowledgeBaseInfo::getPolicyType,knowledgeBaseInfo.getPolicyType()) - .set(KnowledgeBaseInfo::getTerritory,knowledgeBaseInfo.getTerritory()) - .set(KnowledgeBaseInfo::getPublishScope,knowledgeBaseInfo.getPublishScope()) - .set(KnowledgeBaseInfo::getKnowledgeTag,knowledgeBaseInfo.getKnowledgeTag()) - .set(KnowledgeBaseInfo::getAutoLoseEffect,knowledgeBaseInfo.getAutoLoseEffect()) - .set(KnowledgeBaseInfo::getExecTimeBegin,knowledgeBaseInfo.getExecTimeBegin()) - .set(KnowledgeBaseInfo::getExecTimeEnd,knowledgeBaseInfo.getExecTimeEnd()) - .set(KnowledgeBaseInfo::getTimeliness,knowledgeBaseInfo.getTimeliness()) - .set(KnowledgeBaseInfo::getPublishDate,knowledgeBaseInfo.getPublishDate()) - .eq(KnowledgeBaseInfo::getKnowledgeId,knowledgeBaseInfo.getKnowledgeId()).update(); + .set(KnowledgeBaseInfo::getPolicyType, knowledgeBaseInfo.getPolicyType()) + .set(KnowledgeBaseInfo::getTerritory, knowledgeBaseInfo.getTerritory()) + .set(KnowledgeBaseInfo::getPublishScope, knowledgeBaseInfo.getPublishScope()) + .set(KnowledgeBaseInfo::getKnowledgeTag, knowledgeBaseInfo.getKnowledgeTag()) + .set(KnowledgeBaseInfo::getAutoLoseEffect, knowledgeBaseInfo.getAutoLoseEffect()) + .set(KnowledgeBaseInfo::getExecTimeBegin, knowledgeBaseInfo.getExecTimeBegin()) + .set(KnowledgeBaseInfo::getExecTimeEnd, knowledgeBaseInfo.getExecTimeEnd()) + .set(KnowledgeBaseInfo::getTimeliness, knowledgeBaseInfo.getTimeliness()) + .set(KnowledgeBaseInfo::getPublishDate, knowledgeBaseInfo.getPublishDate()) + .eq(KnowledgeBaseInfo::getKnowledgeId, knowledgeBaseInfo.getKnowledgeId()).update(); // 有可能更新附件 updateKnowledgeFile(reqVO, knowledge); // 有可能更新URL @@ -147,7 +150,7 @@ public class KnowledgeManageServiceImpl implements KnowledgeManageService { private void updateKnowledgeLink(ModifyKnowledgeReqVO reqVO, Knowledge knowledge) { // 直接删除原来的 - knowledgeLinkService.lambdaUpdate().eq(KnowledgeLink::getKnowledgeId,knowledge.getId()).remove(); + knowledgeLinkService.lambdaUpdate().eq(KnowledgeLink::getKnowledgeId, knowledge.getId()).remove(); for (KnowledgeLinkVO knowLedgeLinkVO : reqVO.getLinkList()) { KnowledgeLink knowledgeLink = new KnowledgeLink(); knowledgeLink.setLinkName(knowLedgeLinkVO.getLinkName()); @@ -160,28 +163,28 @@ public class KnowledgeManageServiceImpl implements KnowledgeManageService { private void updateKnowledgeFile(ModifyKnowledgeReqVO reqVO, Knowledge knowledge) { // 获取数据库中的附件ID List oldFileList = knowledgeAttachmentService.lambdaQuery().eq(KnowledgeAttachment::getKnowledgeId, knowledge.getId()).list(); - if (CollUtil.isEmpty(reqVO.getFileIdList())){ - if (CollUtil.isNotEmpty(oldFileList)){ - knowledgeAttachmentService.lambdaUpdate().eq(KnowledgeAttachment::getKnowledgeId,knowledge.getId()).remove(); + if (CollUtil.isEmpty(reqVO.getFileIdList())) { + if (CollUtil.isNotEmpty(oldFileList)) { + knowledgeAttachmentService.lambdaUpdate().eq(KnowledgeAttachment::getKnowledgeId, knowledge.getId()).remove(); // 删除文件 for (KnowledgeAttachment knowledgeAttachment : oldFileList) { fileService.deleteFileById(knowledgeAttachment.getFileId()); } } - }else { + } else { List newFileIdList = reqVO.getFileIdList(); // 遍历旧的附件,如果新的附件列表中不包含,则删除 for (KnowledgeAttachment oldFile : oldFileList) { - if (!newFileIdList.contains(oldFile.getId())){ - knowledgeAttachmentService.lambdaUpdate().eq(KnowledgeAttachment::getFileId,oldFile.getId()).remove(); + if (!newFileIdList.contains(oldFile.getId())) { + knowledgeAttachmentService.lambdaUpdate().eq(KnowledgeAttachment::getFileId, oldFile.getId()).remove(); fileService.deleteFileById(oldFile.getFileId()); } } List oldFileIdList = oldFileList.stream().map(KnowledgeAttachment::getFileId).toList(); // 再添加新的附件 for (String fileId : reqVO.getFileIdList()) { - if (!oldFileIdList.contains(fileId)){ + if (!oldFileIdList.contains(fileId)) { KnowledgeAttachment attachment = new KnowledgeAttachment(); attachment.setKnowledgeId(knowledge.getId()); attachment.setFileId(fileId); @@ -193,5 +196,62 @@ public class KnowledgeManageServiceImpl implements KnowledgeManageService { } + @Override + public void recallKnowledge(String knowledgeId) { + Knowledge knowledge = knowledgeService.getOptById(knowledgeId).orElseThrow(() -> new BusinessException("未找到知识")); + // 只有通过状态或已失效状态才支持撤回 + Set canRecallStatusSet = Set.of(StatusEnum.PASS.getStatus(), StatusEnum.INVALID.getStatus()); + if (!canRecallStatusSet.contains(knowledge.getStatus())) { + throw new BusinessException("该知识状态不能撤回"); + } + // TODO 走撤回流程 + + } + + @Override + public KnowledgeDetailResVO queryKnowledgeDetail(String knowledgeId) { + Knowledge knowledge = knowledgeService.getOptById(knowledgeId).orElseThrow(() -> new BusinessException("未找到知识")); + KnowledgeBaseInfo knowledgeBaseInfo = knowledgeBaseInfoService.lambdaQuery().eq(KnowledgeBaseInfo::getKnowledgeId, knowledgeId).oneOpt().orElse(new KnowledgeBaseInfo()); + KnowledgeContext knowledgeContext = knowledgeContextService.getOptById(knowledge.getContentId()).orElse(new KnowledgeContext()); + List knowledgeLinkList = knowledgeLinkService.lambdaQuery().eq(KnowledgeLink::getKnowledgeId, knowledgeId).list(); + List knowledgeAttachmentList = knowledgeAttachmentService.lambdaQuery().eq(KnowledgeAttachment::getKnowledgeId, knowledgeId).list(); + List fileIdList = knowledgeAttachmentList.stream().map(KnowledgeAttachment::getFileId).toList(); + List fileInfos = fileService.listByFileId(fileIdList); + return new KnowledgeDetailResVO(knowledge, knowledgeBaseInfo, knowledgeContext, knowledgeLinkList, fileInfos); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteKnowledge(String knowledgeId) { + // 删除是逻辑删除,如果当前状态是草稿,且没有走过审批流程,则可以直接删除 + Knowledge knowledge = knowledgeService.getOptById(knowledgeId).orElseThrow(() -> new BusinessException("未找到知识")); + if (Objects.equals(StatusEnum.DRAFT.getStatus(), knowledge.getStatus())) { + // 需要判断之前是否走过审批流程 + if (flowRecordService.lambdaQuery().eq(KnowledgeFlowRecord::getKnowledgeId, knowledgeId).count() == 0) { + // 如果没有走过审批的记录,则可以直接删除 + knowledgeService.removeById(knowledgeId); + knowledgeBaseInfoService.lambdaUpdate().eq(KnowledgeBaseInfo::getKnowledgeId, knowledgeId).remove(); + knowledgeContextService.lambdaUpdate().eq(KnowledgeContext::getId, knowledge.getContentId()).remove(); + // 删除文件 + List list = knowledgeAttachmentService.lambdaQuery().eq(KnowledgeAttachment::getKnowledgeId, knowledgeId).list(); + List fileIdList = list.stream().map(KnowledgeAttachment::getFileId).toList(); + fileService.listByFileId(fileIdList); + knowledgeAttachmentService.lambdaUpdate().eq(KnowledgeAttachment::getKnowledgeId, knowledgeId).remove(); + } else { + // 如果有过审批记录,则直接修改状态为删除 + knowledge.setStatus(StatusEnum.DELETE.getStatus()); + knowledgeService.updateById(knowledge); + } + } + // 如果非草稿,则校验是否是通过/驳回/已失效状态,如果是,则需要走审批流程进行删除 + Set canDeleteStatusSet = Set.of(StatusEnum.PASS.getStatus(), StatusEnum.REJECT.getStatus(), StatusEnum.INVALID.getStatus()); + if (canDeleteStatusSet.contains(knowledge.getStatus())) { + // TODO 这时需要走审批流程进行删除 + } else { + throw new BusinessException("审批中的知识不支持删除"); + } + + + } } diff --git a/know_sub_model/src/main/java/com/supervision/knowsub/model/Knowledge.java b/know_sub_model/src/main/java/com/supervision/knowsub/model/Knowledge.java index 7b976cb..8d9b5d1 100644 --- a/know_sub_model/src/main/java/com/supervision/knowsub/model/Knowledge.java +++ b/know_sub_model/src/main/java/com/supervision/knowsub/model/Knowledge.java @@ -55,9 +55,9 @@ public class Knowledge implements Serializable { private Integer knowledgeFrom; /** - * 流转状态 1草稿 2待审批 3驳回 4通过 5已失效 6已撤回 + * 流转状态 */ - @Schema(description = "流转状态 1草稿 2待审批 3驳回 4通过 5已失效 6已撤回") + @Schema(description = "流转状态 1草稿 2通过 3驳回 4已撤回 5已失效 6已删除 10待审批(新增) 11待审批(删除) 12待审批(撤回)") private Integer status; /**