|
|
@@ -1,25 +1,208 @@
|
|
|
-package cn.seecoder.seecoderbokserver.service;
|
|
|
-
|
|
|
-import cn.seecoder.bok.common.vo.KnowledgeNodeVO;
|
|
|
-import cn.seecoder.seecoderbokserver.domain.Knowledge;
|
|
|
-import cn.seecoder.seecoderbokserver.repository.KnowledgeRepository;
|
|
|
-import org.springframework.stereotype.Service;
|
|
|
-
|
|
|
-import java.util.List;
|
|
|
-
|
|
|
-/**
|
|
|
- * @author: Leonezhurui
|
|
|
- * @Date: 2021/8/30 - 9:42 上午
|
|
|
- * @Package: SEEC-BOK
|
|
|
- */
|
|
|
-
|
|
|
-@Service
|
|
|
-public class KnowledgeService {
|
|
|
- private final KnowledgeRepository knowledgeRepository;
|
|
|
-
|
|
|
- public KnowledgeService(KnowledgeRepository knowledgeRepository) {this.knowledgeRepository = knowledgeRepository;}
|
|
|
-
|
|
|
- public List<Knowledge> findByAbbreviationLike(String keyPoints){
|
|
|
- return knowledgeRepository.findByAbbreviationLike("%"+keyPoints+"%");
|
|
|
- }
|
|
|
-}
|
|
|
+package cn.seecoder.seecoderbokserver.service;
|
|
|
+
|
|
|
+import cn.seecoder.bok.common.KnowledgeStatus;
|
|
|
+import cn.seecoder.seecoderbokserver.domain.Knowledge;
|
|
|
+import cn.seecoder.seecoderbokserver.repository.KnowledgeRepository;
|
|
|
+import cn.seecoder.seecoderbokserver.utility.EmptyCheck;
|
|
|
+import org.springframework.data.domain.Page;
|
|
|
+import org.springframework.data.domain.PageImpl;
|
|
|
+import org.springframework.data.domain.Pageable;
|
|
|
+import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
|
|
|
+import org.springframework.data.elasticsearch.core.SearchHit;
|
|
|
+import org.springframework.data.elasticsearch.core.SearchHits;
|
|
|
+import org.springframework.data.elasticsearch.core.query.Criteria;
|
|
|
+import org.springframework.data.elasticsearch.core.query.CriteriaQuery;
|
|
|
+import org.springframework.data.elasticsearch.core.query.Query;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.util.List;
|
|
|
+import java.util.UUID;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+@Service
|
|
|
+public class KnowledgeService {
|
|
|
+
|
|
|
+ private final KnowledgeRepository knowledgeRepository;
|
|
|
+
|
|
|
+ private final ElasticsearchOperations elasticsearchOperations;
|
|
|
+
|
|
|
+ public KnowledgeService(KnowledgeRepository knowledgeRepository, ElasticsearchOperations elasticsearchOperations) {
|
|
|
+ this.knowledgeRepository = knowledgeRepository;
|
|
|
+ this.elasticsearchOperations = elasticsearchOperations;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 创建知识。将知识状态设置为CREATING
|
|
|
+ *
|
|
|
+ * @param knowledge 知识
|
|
|
+ * @return 创建的知识
|
|
|
+ */
|
|
|
+ public Knowledge create(Knowledge knowledge) {
|
|
|
+ knowledge.setStatus(KnowledgeStatus.CREATING.getName());
|
|
|
+ knowledge.setUuid(UUID.randomUUID().toString());
|
|
|
+ return knowledgeRepository.save(knowledge);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据uuid删除知识。将知识状态设置为DELETING
|
|
|
+ *
|
|
|
+ * @param uuid 知识uuid
|
|
|
+ * @return 是否删除成功
|
|
|
+ */
|
|
|
+ public boolean delete(String uuid) {
|
|
|
+ Knowledge knowledge = this.findByUUID(uuid);
|
|
|
+ if (knowledge != null) {
|
|
|
+ knowledge.setStatus(KnowledgeStatus.DELETING.getName());
|
|
|
+ knowledgeRepository.save(knowledge);
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新知识。将旧知识状态设置为DELETING,新知识状态设置为UPDATING
|
|
|
+ *
|
|
|
+ * @param knowledge 新知识
|
|
|
+ * @return 更新后的知识
|
|
|
+ */
|
|
|
+ public Knowledge update(Knowledge knowledge) {
|
|
|
+ Knowledge oldKnowledge = knowledgeRepository.findById(knowledge.getOldUuid()).orElse(null);
|
|
|
+ if (oldKnowledge != null) {
|
|
|
+ oldKnowledge.setStatus(KnowledgeStatus.DELETING.getName());
|
|
|
+ knowledgeRepository.save(oldKnowledge);
|
|
|
+ }
|
|
|
+ knowledge.setUuid(UUID.randomUUID().toString());
|
|
|
+ knowledge.setStatus(KnowledgeStatus.UPDATING.getName());
|
|
|
+ return knowledgeRepository.save(knowledge);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 审批知识。
|
|
|
+ *
|
|
|
+ * @param uuid 知识uuid
|
|
|
+ * @return 是否审批成功
|
|
|
+ */
|
|
|
+ public boolean approve(String uuid) {
|
|
|
+ Knowledge knowledge = knowledgeRepository.findById(uuid).orElse(null);
|
|
|
+ if (knowledge == null) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ KnowledgeStatus oldStatus = KnowledgeStatus.valueOf(knowledge.getStatus());
|
|
|
+ switch (oldStatus) {
|
|
|
+ case CREATING:
|
|
|
+ knowledge.setStatus(KnowledgeStatus.APPROVED.getName());
|
|
|
+ knowledgeRepository.save(knowledge);
|
|
|
+ return true;
|
|
|
+ case DELETING:
|
|
|
+ knowledge.setStatus(KnowledgeStatus.DELETED.getName());
|
|
|
+ knowledgeRepository.save(knowledge);
|
|
|
+ return true;
|
|
|
+ case UPDATING:
|
|
|
+ approve(knowledge.getOldUuid());
|
|
|
+ knowledge.setStatus(KnowledgeStatus.APPROVED.getName());
|
|
|
+ knowledgeRepository.save(knowledge);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 拒绝知识。
|
|
|
+ *
|
|
|
+ * @param uuid 知识uuid
|
|
|
+ * @return 是否拒绝成功
|
|
|
+ */
|
|
|
+ public boolean refuse(String uuid) {
|
|
|
+ Knowledge knowledge = knowledgeRepository.findById(uuid).orElse(null);
|
|
|
+ if (knowledge == null) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ KnowledgeStatus oldStatus = KnowledgeStatus.valueOf(knowledge.getStatus());
|
|
|
+ switch (oldStatus) {
|
|
|
+ case CREATING:
|
|
|
+ knowledge.setStatus(KnowledgeStatus.REFUSED.getName());
|
|
|
+ knowledgeRepository.save(knowledge);
|
|
|
+ return true;
|
|
|
+ case DELETING:
|
|
|
+ knowledge.setStatus(KnowledgeStatus.APPROVED.getName());
|
|
|
+ knowledgeRepository.save(knowledge);
|
|
|
+ return true;
|
|
|
+ case UPDATING:
|
|
|
+ refuse(knowledge.getOldUuid());
|
|
|
+ knowledge.setStatus(KnowledgeStatus.REFUSED.getName());
|
|
|
+ knowledgeRepository.save(knowledge);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ public Iterable<Knowledge> saveAll(Iterable<Knowledge> knowledges) {
|
|
|
+ return knowledgeRepository.saveAll(knowledges);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查找未审批的知识
|
|
|
+ *
|
|
|
+ * @param pageable 分页信息
|
|
|
+ * @param status 知识状态
|
|
|
+ * @return 未审批的知识
|
|
|
+ */
|
|
|
+ public Page<Knowledge> findUnChecked(Pageable pageable, KnowledgeStatus status) {
|
|
|
+ Criteria criteria = new Criteria();
|
|
|
+ if (!EmptyCheck.instance.isEmpty(status.getName())) {
|
|
|
+ criteria = criteria.and("status").matches(status);
|
|
|
+ }
|
|
|
+ return findByCriteria(pageable, criteria);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查找知识
|
|
|
+ *
|
|
|
+ * @param keyword 关键字
|
|
|
+ * @param knowledgePoint 知识点
|
|
|
+ * @param pageable 分页信息
|
|
|
+ * @return 知识
|
|
|
+ */
|
|
|
+ public Page<Knowledge> find(String keyword, List<String> knowledgePoint, Pageable pageable) {
|
|
|
+ Criteria criteria = new Criteria();
|
|
|
+ if (!EmptyCheck.instance.isEmpty(keyword)) {
|
|
|
+ criteria = criteria.and("abstract").matches(keyword)
|
|
|
+ .or("title").matches(keyword);
|
|
|
+ }
|
|
|
+ if (!EmptyCheck.instance.isEmpty(knowledgePoint)) {
|
|
|
+ criteria = criteria.and("knowledge_point").matchesAll(knowledgePoint);
|
|
|
+ }
|
|
|
+ return findByCriteria(pageable, criteria);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据uuid查找知识
|
|
|
+ *
|
|
|
+ * @param uuid 知识uuid
|
|
|
+ * @return 知识
|
|
|
+ */
|
|
|
+ public Knowledge findByUUID(String uuid) {
|
|
|
+ return knowledgeRepository.findById(uuid).orElse(null);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据条件查找知识
|
|
|
+ *
|
|
|
+ * @param pageable 分页信息
|
|
|
+ * @param criteria 条件
|
|
|
+ * @return 知识
|
|
|
+ */
|
|
|
+ private Page<Knowledge> findByCriteria(Pageable pageable, Criteria criteria) {
|
|
|
+ Query query = new CriteriaQuery(criteria);
|
|
|
+ query.setPageable(pageable);
|
|
|
+ SearchHits<Knowledge> searchHits = elasticsearchOperations.search(query, Knowledge.class);
|
|
|
+ List<Knowledge> knowledges = searchHits.stream()
|
|
|
+ .map(SearchHit::getContent)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ return new PageImpl<>(knowledges, pageable, searchHits.getTotalHits());
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|