Kaynağa Gözat

Merge branch 'master' into 122run

gaodm 3 yıl önce
ebeveyn
işleme
9440ec908e
21 değiştirilmiş dosya ile 1060 ekleme ve 53 silme
  1. 13 16
      cdssman-service/src/main/java/com/diagbot/client/CdssCoreClient.java
  2. 20 16
      cdssman-service/src/main/java/com/diagbot/client/hystrix/CdssCoreHystrix.java
  3. 37 0
      cdssman-service/src/main/java/com/diagbot/dto/ConceptCollectionDTO.java
  4. 9 5
      cdssman-service/src/main/java/com/diagbot/dto/GetAllForRelationDTO.java
  5. 23 1
      cdssman-service/src/main/java/com/diagbot/enums/LexiconEnum.java
  6. 340 0
      cdssman-service/src/main/java/com/diagbot/facade/KlConceptCollectionFacade.java
  7. 28 4
      cdssman-service/src/main/java/com/diagbot/facade/KlConceptFacade.java
  8. 7 2
      cdssman-service/src/main/java/com/diagbot/mapper/KlRelationMapper.java
  9. 6 0
      cdssman-service/src/main/java/com/diagbot/service/KlRelationService.java
  10. 11 4
      cdssman-service/src/main/java/com/diagbot/service/impl/KlRelationServiceImpl.java
  11. 15 0
      cdssman-service/src/main/java/com/diagbot/vo/ConceptCollectionBaseVO.java
  12. 29 0
      cdssman-service/src/main/java/com/diagbot/vo/ConceptCollectionPageVO.java
  13. 16 0
      cdssman-service/src/main/java/com/diagbot/vo/ConceptCollectionSaveVO.java
  14. 6 1
      cdssman-service/src/main/java/com/diagbot/vo/SearchConceptVO.java
  15. 81 0
      cdssman-service/src/main/java/com/diagbot/web/KlConceptCollectionController.java
  16. 24 1
      cdssman-service/src/main/java/com/diagbot/web/KlDiseaseController.java
  17. 57 0
      cdssman-service/src/main/resources/mapper/KlRelationMapper.xml
  18. 9 1
      common/src/main/java/com/diagbot/biz/push/entity/Item.java
  19. 21 1
      common/src/main/java/com/diagbot/biz/push/entity/Lis.java
  20. 9 1
      common/src/main/java/com/diagbot/biz/push/entity/Pacs.java
  21. 299 0
      common/src/main/java/com/diagbot/util/EntityUtil.java

+ 13 - 16
cdssman-service/src/main/java/com/diagbot/client/CdssCoreClient.java

@@ -2,21 +2,7 @@ package com.diagbot.client;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.diagbot.client.hystrix.CdssCoreHystrix;
-import com.diagbot.dto.DiagnosesFindDTO;
-import com.diagbot.dto.DictionaryInfoDTO;
-import com.diagbot.dto.IndexBatchDTO;
-import com.diagbot.dto.IndicationDTO;
-import com.diagbot.dto.KlConceptStaticDTO;
-import com.diagbot.dto.KlDiagnoseInfoDTO;
-import com.diagbot.dto.KlDiagnoseTypeDTO;
-import com.diagbot.dto.KlRuleByIdParDTO;
-import com.diagbot.dto.KlRuleInfoDTO;
-import com.diagbot.dto.RegulationIndexDTO;
-import com.diagbot.dto.RespDTO;
-import com.diagbot.dto.RetrievalDTO;
-import com.diagbot.dto.StaticKnowledgeDTO;
-import com.diagbot.dto.StaticKnowledgeIndexDTO;
-import com.diagbot.dto.TermConceptDTO;
+import com.diagbot.dto.*;
 import com.diagbot.entity.KlRuleMenuWrapper;
 import com.diagbot.vo.*;
 import org.springframework.cloud.openfeign.FeignClient;
@@ -224,4 +210,15 @@ public interface CdssCoreClient {
     @PostMapping("/klRegulation/index")
     public RespDTO<List<RegulationIndexDTO>> index(@RequestBody RegulationIndexVO regulationIndexVO);
 
-}
+    @PostMapping("/klDisease/searchConcept")
+    RespDTO<List<GetAllForRelationDTO>> searchConcept(@Valid @RequestBody SearchConceptVO searchConceptVO);
+
+    //术语集合新增
+    @PostMapping("/klDisease/addConceptClass")
+    RespDTO<List<GetAllForRelationDTO>> addConceptClass(@Valid @RequestBody SearchConceptVO searchConceptVO);
+
+    //规则维护术语查询
+    @PostMapping("/klDisease/searchConceptRuleClass")
+    RespDTO<List<GetAllForRelationDTO>> searchConceptRuleClass(@Valid @RequestBody SearchConceptVO searchConceptVO);
+
+}

+ 20 - 16
cdssman-service/src/main/java/com/diagbot/client/hystrix/CdssCoreHystrix.java

@@ -2,21 +2,7 @@ package com.diagbot.client.hystrix;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.diagbot.client.CdssCoreClient;
-import com.diagbot.dto.DiagnosesFindDTO;
-import com.diagbot.dto.DictionaryInfoDTO;
-import com.diagbot.dto.IndexBatchDTO;
-import com.diagbot.dto.IndicationDTO;
-import com.diagbot.dto.KlConceptStaticDTO;
-import com.diagbot.dto.KlDiagnoseInfoDTO;
-import com.diagbot.dto.KlDiagnoseTypeDTO;
-import com.diagbot.dto.KlRuleByIdParDTO;
-import com.diagbot.dto.KlRuleInfoDTO;
-import com.diagbot.dto.RegulationIndexDTO;
-import com.diagbot.dto.RespDTO;
-import com.diagbot.dto.RetrievalDTO;
-import com.diagbot.dto.StaticKnowledgeDTO;
-import com.diagbot.dto.StaticKnowledgeIndexDTO;
-import com.diagbot.dto.TermConceptDTO;
+import com.diagbot.dto.*;
 import com.diagbot.entity.KlRuleMenuWrapper;
 import com.diagbot.vo.*;
 import lombok.extern.slf4j.Slf4j;
@@ -298,4 +284,22 @@ public class CdssCoreHystrix implements CdssCoreClient {
         log.error("【hystrix】调用{}异常", "index");
         return null;
     }
-}
+
+    @Override
+    public RespDTO<List<GetAllForRelationDTO>> searchConcept(@Valid SearchConceptVO searchConceptVO) {
+        log.error("【hystrix】调用{}异常", "searchConcept");
+        return null;
+    }
+
+    @Override
+    public RespDTO<List<GetAllForRelationDTO>> addConceptClass(@Valid SearchConceptVO searchConceptVO) {
+        log.error("【hystrix】调用{}异常", "addConceptClass");
+        return null;
+    }
+
+    @Override
+    public RespDTO<List<GetAllForRelationDTO>> searchConceptRuleClass(@Valid SearchConceptVO searchConceptVO) {
+        log.error("【hystrix】调用{}异常", "searchConceptRuleClass");
+        return null;
+    }
+}

+ 37 - 0
cdssman-service/src/main/java/com/diagbot/dto/ConceptCollectionDTO.java

@@ -0,0 +1,37 @@
+package com.diagbot.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2021/8/6 9:43
+ */
+@Data
+public class ConceptCollectionDTO {
+    private Long collectionId;
+    private String collectionLibName;
+    private Integer collectionLibType;
+    @ApiModelProperty(hidden = true)
+    private Integer collectionStatus;
+    private String collectionRemark;
+    private Long relationId;
+    @ApiModelProperty(hidden = true)
+    private String concatConceptLibName;
+    private Integer conceptLibType;
+    @ApiModelProperty(hidden = true)
+    private Integer conceptStatus;
+    /**
+     * 修改时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date gmtModified;
+    /**
+     * 修改人
+     */
+    private String modifier;
+}

+ 9 - 5
cdssman-service/src/main/java/com/diagbot/dto/GetAllForRelationDTO.java

@@ -12,13 +12,13 @@ import lombok.Setter;
 @Getter
 @Setter
 public class GetAllForRelationDTO {
-	
+
 	/**
 	 * 概念id
 	 */
 	@ApiModelProperty(value="概念id")
 	private Long conceptId;
-	
+
 	/**
 	 * 概念名称
 	 */
@@ -30,13 +30,17 @@ public class GetAllForRelationDTO {
 	 */
 	@ApiModelProperty(value="概念id")
 	private Integer libType;
-	
+
 	/**
 	 * 概念名称(类型)
 	 */
 	@ApiModelProperty(value="概念名称(类型)")
 	private String conceptNameType;
-	
-	
+
+	/**
+	 * 说明
+	 */
+	@ApiModelProperty(value="说明(remark)")
+	private String remark;
 
 }

+ 23 - 1
cdssman-service/src/main/java/com/diagbot/enums/LexiconEnum.java

@@ -48,6 +48,27 @@ public enum LexiconEnum implements KeyedNamed {
     SymptomClass(305,"症状类别"),
     OperationClass(306,"手术和操作类别"),
     DisSysType(307,"疾病系统分类"),
+    DiseaseCollection(308,"疾病集合"),
+    MedicineCollection(309,"药品通用名集合"),
+    FormCollection(310,"药品剂型集合"),
+    SymptomCollection(311,"症状集合"),
+    VitalCollection(312,"体格检查项目集合"),
+    VitalResultCollection(313,"体格检查结果集合"),
+    OperationCollection(314,"手术和操作集合"),
+    LisNameCollection(315,"实验室检查套餐集合"),
+    PacsNameCollection(316,"辅助检查项目集合"),
+    PacsSubNameCollection(317,"辅助检查子项目集合"),
+    PacsDescribeCollection(318,"辅助检查描述集合"),
+    PacsResultCollection(319,"辅助检查结果集合"),
+    AnesthesiaCollection(320,"麻醉集合"),
+    DeptCollection(321,"科室集合"),
+    FoodCollection(322,"食物集合"),
+    AllergenCollection(323,"其他过敏原集合"),
+    DeviceCollection(324,"医疗器械及物品集合"),
+    PartCollection(325,"部位集合"),
+    TcmdiseaseCollection(326,"中医疾病集合"),
+    TcmsyndromeCollection(327,"中医证候集合"),
+    InducementCollection(328,"诱因集合"),
     ICD10ClassNode(400,"ICD10疾病类别根节点"),
     DeptDiseaseNode(401,"科室疾病类别根节点"),
     MedChemClassNode(402,"药品化学物质类别根节点"),
@@ -58,7 +79,8 @@ public enum LexiconEnum implements KeyedNamed {
     OperationClassNode(407,"手术和操作类别根节点"),
     LisClassNode(408,"实验室检查类别根节点"),
     PacsClassNode(409,"辅助检查类别根节点"),
-    Age(410,"年龄");
+    Age(410,"年龄"),
+    Law(130,"政策法规");
 
 
     @Setter

+ 340 - 0
cdssman-service/src/main/java/com/diagbot/facade/KlConceptCollectionFacade.java

@@ -0,0 +1,340 @@
+package com.diagbot.facade;
+
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.client.UserServiceClient;
+import com.diagbot.dto.ConceptCollectionDTO;
+import com.diagbot.dto.DictionaryInfoDTO;
+import com.diagbot.dto.RespDTO;
+import com.diagbot.entity.KlConcept;
+import com.diagbot.entity.KlLibraryInfo;
+import com.diagbot.entity.KlRelation;
+import com.diagbot.entity.KlRelationOrder;
+import com.diagbot.entity.KlRule;
+import com.diagbot.entity.KlRuleBase;
+import com.diagbot.enums.IsDeleteEnum;
+import com.diagbot.enums.LexiconEnum;
+import com.diagbot.enums.StatusEnum;
+import com.diagbot.exception.CommonErrorCode;
+import com.diagbot.exception.CommonException;
+import com.diagbot.service.KlRelationOrderService;
+import com.diagbot.service.KlRelationService;
+import com.diagbot.service.KlRuleConditionService;
+import com.diagbot.util.ListUtil;
+import com.diagbot.util.RespDTOUtil;
+import com.diagbot.util.UserUtils;
+import com.diagbot.vo.ConceptCollectionBaseVO;
+import com.diagbot.vo.ConceptCollectionPageVO;
+import com.diagbot.vo.ConceptCollectionSaveVO;
+import com.diagbot.vo.IdVO;
+import com.google.common.collect.Lists;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2021/8/5 17:25
+ */
+@Component
+public class KlConceptCollectionFacade {
+    @Autowired
+    KlConceptFacade klConceptFacade;
+    @Autowired
+    KlLibraryInfoFacade klLibraryInfoFacade;
+    @Autowired
+            @Qualifier("klRelationServiceImpl")
+    KlRelationService klRelationService;
+    @Autowired
+    KlRelationFacade klRelationFacade;
+    @Autowired
+    @Qualifier("klRelationOrderServiceImpl")
+    KlRelationOrderService klRelationOrderService;
+    @Autowired
+    KlRelationOrderFacade klRelationOrderFacade;
+
+    @Autowired
+    KlDictionaryInfoFacade klDictionaryInfoFacade;
+    @Autowired
+    KlRuleFacade klRuleFacade;
+    @Autowired
+    KlRuleBaseFacade klRuleBaseFacade;
+    @Autowired
+    KlRuleConditionService klRuleConditionService;
+    @Autowired
+    UserServiceClient userServiceClient;
+
+    /**
+     * 获取术语集合列表
+     *
+     * @param conceptCollectionPageVO
+     * @return
+     */
+    public IPage<ConceptCollectionDTO> getConceptCollectionPage(ConceptCollectionPageVO conceptCollectionPageVO) {
+        if (conceptCollectionPageVO.getCollectionLibType() == null
+                || conceptCollectionPageVO.getCollectionLibType().equals(0)) {
+            conceptCollectionPageVO.setCollectionLibType(null);
+        }
+
+        IPage<ConceptCollectionDTO> page = klRelationFacade.getConceptCollectionPage(conceptCollectionPageVO);
+        List<ConceptCollectionDTO> records = page.getRecords();
+        List<String> userIds = records.stream().map(ConceptCollectionDTO::getModifier)
+                .distinct()
+                .collect(Collectors.toList());
+        if (ListUtil.isEmpty(userIds)) {
+            return page;
+        }
+        RespDTO<Map<String, String>> userRespDTO = userServiceClient.getUserInfoByIds(userIds);
+        if (RespDTOUtil.respIsNG(userRespDTO)) {
+            return page;
+        }
+        Map<String, String> userMap = userRespDTO.data;
+        records.forEach(record -> {
+            if (userMap.containsKey(record.getModifier())) {
+                record.setModifier(userMap.get(record.getModifier()));
+            } else {
+                record.setModifier("");
+            }
+        });
+        page.setRecords(records);
+
+        return page;
+    }
+
+    /**
+     * 保存(新增和修改)
+     * @param conceptCollectionSaveVO
+     * @return
+     */
+    @DSTransactional
+    public Boolean saveOrUpdateRecord(ConceptCollectionSaveVO conceptCollectionSaveVO) {
+        Map<Long, List<DictionaryInfoDTO>> allDictionaryMap = klDictionaryInfoFacade.getListByGroupType();
+        List<DictionaryInfoDTO> dictionary = allDictionaryMap.get(61L);
+        Map<String, String> dictionaryMap
+                = dictionary.stream().collect(Collectors.toMap(DictionaryInfoDTO::getName, DictionaryInfoDTO::getVal));
+        if (null == conceptCollectionSaveVO.getCollectionId()) {
+            throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "术语集合不允许为空,保存失败");
+        }
+        if (ListUtil.isEmpty(conceptCollectionSaveVO.getConcepts())) {
+            throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "保存失败,关联术语不能为空");
+        }
+
+        KlConcept collection = klConceptFacade.getById(conceptCollectionSaveVO.getCollectionId());
+        if (null == collection) {
+            throw new CommonException(CommonErrorCode.NOT_EXISTS, "术语集合不存在,保存失败");
+        } else if (collection.getStatus().equals(StatusEnum.Disable.getKey())) {
+            throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "集合已禁用,保存失败");
+        } else if (!collection.getLibName().equals(conceptCollectionSaveVO.getCollectionLibName())) {
+            throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "术语集合名称不允许修改,保存失败");
+        }
+
+        //校验术语集合和基础术语类型是否对应
+        String dicVal = dictionaryMap.get(LexiconEnum.getName(conceptCollectionSaveVO.getCollectionLibType()));
+        if (StringUtils.isBlank(dicVal)) {
+            throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "术语集合和基础术语关联字典未维护,请维护字典");
+        }
+        Integer conceptLibType = Integer.valueOf(dicVal.split("-")[2]);
+        for (ConceptCollectionBaseVO concept : conceptCollectionSaveVO.concepts) {
+            if (!concept.getConceptLibType().equals(conceptLibType)) {
+                throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
+                        "集合【" + LexiconEnum.getName(conceptCollectionSaveVO.getCollectionLibType())
+                                + "】和基础术语【" + LexiconEnum.getName(conceptLibType) + "】不是对应关系,保存失败");
+            }
+        }
+
+        //检验基础术语是否存在
+        //过滤已禁用基础术语
+        List<Long> conceptIds = conceptCollectionSaveVO.concepts.stream()
+                .map(ConceptCollectionBaseVO::getConceptId)
+                .collect(Collectors.toList());
+        List<KlConcept> concepts = klConceptFacade.list(new QueryWrapper<KlConcept>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("status", StatusEnum.Enable.getKey())
+                .in("id", conceptIds));
+
+        if (ListUtil.isEmpty(concepts)) {
+            throw new CommonException(CommonErrorCode.NOT_EXISTS, "基础术语不存在或已禁用");
+        }
+        List<Long> saveConceptIds = concepts.stream().map(KlConcept::getId).collect(Collectors.toList());
+
+        //删除已有记录
+        List<KlRelation> relationList = klRelationFacade.list(new QueryWrapper<KlRelation>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("start_id", collection.getId())
+                .eq("relation_id", 600));
+
+        if (ListUtil.isNotEmpty(relationList)) {
+            List<Long> tRelationIds = relationList.stream().map(KlRelation::getId).collect(Collectors.toList());
+
+            //删除管理记录
+            klRelationFacade.remove(new QueryWrapper<KlRelation>()
+                    .eq("is_deleted", IsDeleteEnum.N.getKey())
+                    .eq("start_id", collection.getId())
+                    .eq("relation_id", 600));
+            klRelationOrderFacade.remove(new QueryWrapper<KlRelationOrder>()
+                    .eq("is_deleted", IsDeleteEnum.N.getKey())
+                    .in("t_relation_id", tRelationIds));
+        }
+
+        //保存
+        Date now = new Date();
+        String useId = UserUtils.getCurrentPrincipleID();
+        List<KlRelation> saveList = Lists.newLinkedList();
+        for (ConceptCollectionBaseVO concept : conceptCollectionSaveVO.concepts) {
+            if (!saveConceptIds.contains(concept.getConceptId())) {
+                continue;
+            }
+            KlRelation klRelation = new KlRelation();
+            klRelation.setStartId(collection.getId());
+            klRelation.setEndId(concept.getConceptId());
+            klRelation.setRelationId(600);
+
+            klRelation.setCreator(useId);
+            klRelation.setModifier(useId);
+            klRelation.setGmtCreate(now);
+            klRelation.setGmtModified(now);
+
+            saveList.add(klRelation);
+        }
+        klRelationService.saveOrUpdateBatch(saveList);
+
+        List<KlRelationOrder> saveOrderList = Lists.newLinkedList();
+        Integer orderNo = 1;
+        for (KlRelation klRelation : saveList) {
+            KlRelationOrder klRelationOrder = new KlRelationOrder();
+            klRelationOrder.settRelationId(klRelation.getId());
+            klRelationOrder.setOrderNo(orderNo++);
+
+            klRelationOrder.setCreator(useId);
+            klRelationOrder.setModifier(useId);
+            klRelationOrder.setGmtCreate(now);
+            klRelationOrder.setGmtModified(now);
+
+            saveOrderList.add(klRelationOrder);
+        }
+        klRelationOrderService.saveOrUpdateBatch(saveOrderList);
+
+        return true;
+    }
+
+    /**
+     * 根据术语集合id获取集合相关信息
+     *
+     * @param idVO
+     * @return
+     */
+    public ConceptCollectionSaveVO getRecordById(IdVO idVO) {
+        ConceptCollectionSaveVO retItem = new ConceptCollectionSaveVO();
+        KlConcept collection = klConceptFacade.getById(idVO.getId());
+        if (null == collection) {
+            return null;
+        }
+        retItem.setCollectionId(idVO.getId());
+        retItem.setCollectionLibName(collection.getLibName());
+        retItem.setCollectionLibType(collection.getLibType());
+        //remark
+        KlLibraryInfo libraryInfo = klLibraryInfoFacade.getOne(new QueryWrapper<KlLibraryInfo>()
+                .eq("concept_id", collection.getId())
+                .eq("is_concept", 1));
+        if (null != libraryInfo) {
+            retItem.setCollectionRemark(libraryInfo.getRemark());
+        }
+
+        List<KlRelation> relationList = klRelationFacade.list(new QueryWrapper<KlRelation>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("start_id", idVO.getId())
+                .eq("relation_id", 600));
+
+        if (ListUtil.isEmpty(relationList)) {
+            return retItem;
+        }
+
+        Map<Long, KlRelation> relationMap = relationList.stream().collect(Collectors.toMap(KlRelation::getId, v -> v));
+        List<Long> conceptIds = relationList.stream().map(KlRelation::getEndId).collect(Collectors.toList());
+        List<Long> relationIds = relationList.stream().map(KlRelation::getId).collect(Collectors.toList());
+        List<KlRelationOrder> relationOrderList = klRelationOrderFacade.list(new QueryWrapper<KlRelationOrder>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .in("t_relation_id", relationIds)
+                .orderByAsc("order_no"));
+
+        List<KlConcept> conceptList = klConceptFacade.list(new QueryWrapper<KlConcept>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("status", StatusEnum.Enable.getKey())
+                .in("id", conceptIds));
+        Map<Long, KlConcept> conceptMap = conceptList.stream().collect(Collectors.toMap(KlConcept::getId, v -> v));
+
+        List<ConceptCollectionBaseVO> subConceptList = Lists.newLinkedList();
+        if (ListUtil.isNotEmpty(relationOrderList)) {
+            for (KlRelationOrder order : relationOrderList) {
+                KlConcept concept = conceptMap.get(relationMap.get(order.gettRelationId()).getEndId());
+                if (null != concept) {
+                    ConceptCollectionBaseVO conceptVO = new ConceptCollectionBaseVO();
+                    conceptVO.setConceptId(concept.getId());
+                    conceptVO.setConceptLibName(concept.getLibName());
+                    conceptVO.setConceptLibType(concept.getLibType());
+                    subConceptList.add(conceptVO);
+                }
+            }
+        } else {
+            for (KlConcept concept : conceptList) {
+                ConceptCollectionBaseVO conceptVO = new ConceptCollectionBaseVO();
+                conceptVO.setConceptId(concept.getId());
+                conceptVO.setConceptLibName(concept.getLibName());
+                conceptVO.setConceptLibType(concept.getLibType());
+                subConceptList.add(conceptVO);
+            }
+        }
+
+        retItem.setConcepts(subConceptList);
+
+        return retItem;
+    }
+
+    /**
+     * 删除术语集合关联关系
+     *
+     * @param idVO
+     * @return
+     */
+    public Boolean deleteById(IdVO idVO) {
+        KlConcept collection = klConceptFacade.getById(idVO.getId());
+        if (null == collection) {
+            throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "术语集合不存在");
+        }
+
+        //校验术语集合是否被使用
+        List<KlRule> ruleList = klRuleFacade.list(new QueryWrapper<KlRule>()
+                .eq("concept_id", collection.getId()));
+        if (ListUtil.isNotEmpty(ruleList)) {
+            throw new CommonException(CommonErrorCode.FAIL, "删除失败,【" + collection.getLibName() + "】已在规则中使用");
+        }
+        List<KlRuleBase> baseRuleList = klRuleBaseFacade.list(new QueryWrapper<KlRuleBase>()
+                .eq("concept_id", collection.getId()));
+        if (ListUtil.isNotEmpty(baseRuleList)) {
+            throw new CommonException(CommonErrorCode.FAIL, "删除失败,【" + collection.getLibName() + "】已在规则中使用");
+        }
+
+        List<KlRelation> relationList = klRelationFacade.list(new QueryWrapper<KlRelation>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("start_id", idVO.getId())
+                .eq("relation_id", 600));
+
+        if (ListUtil.isEmpty(relationList)) {
+            return true;
+        }
+
+        List<Long> relationIds = relationList.stream().map(KlRelation::getId).collect(Collectors.toList());
+
+        klRelationFacade.remove(new QueryWrapper<KlRelation>().in("id", relationIds));
+        klRelationOrderFacade.remove(new QueryWrapper<KlRelationOrder>().in("t_relation_id", relationIds));
+        return true;
+    }
+}

+ 28 - 4
cdssman-service/src/main/java/com/diagbot/facade/KlConceptFacade.java

@@ -3,6 +3,7 @@ package com.diagbot.facade;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.client.CdssCoreClient;
 import com.diagbot.client.UserServiceClient;
 import com.diagbot.dto.GetAllForRelationDTO;
 import com.diagbot.dto.KlConceptAllDTO;
@@ -71,6 +72,8 @@ public class KlConceptFacade extends KlConceptServiceImpl {
     @Autowired
     private UserServiceClient userServiceClient;
     @Autowired
+    private CdssCoreClient cdssCoreClient;
+    @Autowired
     private KlLibraryInfoFacade klLibraryInfoFacade;
     @Autowired
     private KlConceptCommonFacade klConceptCommonFacade;
@@ -429,6 +432,7 @@ public class KlConceptFacade extends KlConceptServiceImpl {
                     .eq(getAllForRelationVO.getTypeId() != null, "lib_type", getAllForRelationVO.getTypeId())
                     .eq("status", StatusEnum.Enable.getKey())
                     .notIn(ListUtil.isNotEmpty(getAllForRelationVO.getExcludedConceptIds()), "id", getAllForRelationVO.getExcludedConceptIds())
+                    .last("limit 100")
             );
             //            retList = BeanUtil.listCopyTo(conceptList, GetAllForRelationDTO.class);
             if (ListUtil.isNotEmpty(conceptList)) {
@@ -453,7 +457,10 @@ public class KlConceptFacade extends KlConceptServiceImpl {
      * @return
      */
     public List<GetAllForRelationDTO> searchConceptByNameAndLibType(SearchConceptVO searchConceptVO) {
-        List<GetAllForRelationDTO> getAllForRelationDTOS = Lists.newArrayList();
+        RespDTO<List<GetAllForRelationDTO>> relationDTORespDTO = cdssCoreClient.searchConcept(searchConceptVO);
+        RespDTOUtil.respNGDeal(relationDTORespDTO, "查询术语失败");
+        return relationDTORespDTO.data;
+        /*List<GetAllForRelationDTO> getAllForRelationDTOS = Lists.newArrayList();
         String name = searchConceptVO.getName();
         Integer libType = searchConceptVO.getLibType();
         List<Long> excludedConceptIds = searchConceptVO.getExcludedConceptIds();
@@ -475,7 +482,7 @@ public class KlConceptFacade extends KlConceptServiceImpl {
                 }).collect(Collectors.toList());
             }
         }
-        return getAllForRelationDTOS;
+        return getAllForRelationDTOS;*/
     }
 
     /**
@@ -485,7 +492,12 @@ public class KlConceptFacade extends KlConceptServiceImpl {
      * @return
      */
     public List<GetAllForRelationDTO> searchConceptByNameAndLibType(SearchVO SearchVO) {
-        List<GetAllForRelationDTO> getAllForRelationDTOS = Lists.newArrayList();
+        SearchConceptVO searchConceptVO = new SearchConceptVO();
+        BeanUtil.copyProperties(SearchVO,searchConceptVO);
+        RespDTO<List<GetAllForRelationDTO>> relationDTORespDTO = cdssCoreClient.searchConcept(searchConceptVO);
+        RespDTOUtil.respNGDeal(relationDTORespDTO, "查询术语失败");
+        return relationDTORespDTO.data;
+        /*List<GetAllForRelationDTO> getAllForRelationDTOS = Lists.newArrayList();
         List<Long> excludedConceptIds = SearchVO.getExcludedConceptIds();
         List<KlConcept> conceptList = this.list(new QueryWrapper<KlConcept>()
                 .eq("is_deleted", IsDeleteEnum.N.getKey())
@@ -503,7 +515,19 @@ public class KlConceptFacade extends KlConceptServiceImpl {
                 return getAllForRelationDTO;
             }).collect(Collectors.toList());
         }
-        return getAllForRelationDTOS;
+        return getAllForRelationDTOS;*/
+    }
+
+    public List<GetAllForRelationDTO> addConceptClass(SearchConceptVO searchConceptVO) {
+        RespDTO<List<GetAllForRelationDTO>> relationDTORespDTO = cdssCoreClient.addConceptClass(searchConceptVO);
+        RespDTOUtil.respNGDeal(relationDTORespDTO, "术语集合新增失败");
+        return relationDTORespDTO.data;
+    }
+
+    public List<GetAllForRelationDTO> searchConceptRuleClass(SearchConceptVO searchConceptVO) {
+        RespDTO<List<GetAllForRelationDTO>> relationDTORespDTO = cdssCoreClient.searchConceptRuleClass(searchConceptVO);
+        RespDTOUtil.respNGDeal(relationDTORespDTO, "查询规则维护术语查询术语失败");
+        return relationDTORespDTO.data;
     }
 
     /**

+ 7 - 2
cdssman-service/src/main/java/com/diagbot/mapper/KlRelationMapper.java

@@ -1,11 +1,14 @@
 package com.diagbot.mapper;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.dto.ConceptCollectionDTO;
 import com.diagbot.dto.GetAllForRelationDTO;
 import com.diagbot.dto.RelationDTO;
 import com.diagbot.dto.RelationNameDTO;
 import com.diagbot.dto.RelationNodeDTO;
 import com.diagbot.entity.KlRelation;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.diagbot.vo.ConceptCollectionPageVO;
 import com.diagbot.vo.DisNameFindVO;
 import com.diagbot.vo.KlRelationVO;
 import com.diagbot.vo.RelationVO;
@@ -26,13 +29,15 @@ import java.util.List;
  * @since 2021-03-01
  */
 public interface KlRelationMapper extends BaseMapper<KlRelation> {
-    List<RelationNodeDTO> getRelationNodeDTOs(@Param(value="conceptId")Long conceptId, @Param(value="relationId")Long relationId, @Param(value="endTypeId")Long endTypeId);
+    List<RelationNodeDTO> getRelationNodeDTOs(@Param(value = "conceptId") Long conceptId, @Param(value = "relationId") Long relationId, @Param(value = "endTypeId") Long endTypeId);
 
     List<MedClassMedDTO> getMedClassMedList();
 
     List<RelationDTO> getRelations(RelationVO relationVO);
 
-    List<RelationNameDTO> getRelationNameDTOs(@Param(value="conceptIds")List<Long> conceptIds,@Param(value="relationId")Integer relationId);
+    List<RelationNameDTO> getRelationNameDTOs(@Param(value = "conceptIds") List<Long> conceptIds, @Param(value = "relationId") Integer relationId);
 
     List<GetAllForRelationDTO> findDisNameAll(DisNameFindVO disNameFindVO);
+
+    IPage<ConceptCollectionDTO> getConceptCollectionPage(@Param("conceptCollectionPageVO") ConceptCollectionPageVO conceptCollectionPageVO);
 }

+ 6 - 0
cdssman-service/src/main/java/com/diagbot/service/KlRelationService.java

@@ -1,15 +1,19 @@
 package com.diagbot.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.dto.ConceptCollectionDTO;
 import com.diagbot.dto.GetAllForRelationDTO;
 import com.diagbot.dto.MedClassMedDTO;
 import com.diagbot.dto.RelationDTO;
 import com.diagbot.dto.RelationNameDTO;
 import com.diagbot.entity.KlRelation;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.diagbot.vo.ConceptCollectionPageVO;
 import com.diagbot.vo.DisNameFindVO;
 import com.diagbot.vo.KlRelationVO;
 import com.diagbot.vo.RelationVO;
 import io.swagger.models.auth.In;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -29,4 +33,6 @@ public interface KlRelationService extends IService<KlRelation> {
     List<RelationNameDTO> getRelationNameDTOs(List<Long> conceptIds, Integer relationId);
 
     List<GetAllForRelationDTO> findDisNameAll(DisNameFindVO disNameFindVO);
+
+    IPage<ConceptCollectionDTO> getConceptCollectionPage(@Param("conceptCollectionPageVO") ConceptCollectionPageVO conceptCollectionPageVO);
 }

+ 11 - 4
cdssman-service/src/main/java/com/diagbot/service/impl/KlRelationServiceImpl.java

@@ -1,7 +1,9 @@
 package com.diagbot.service.impl;
 
 import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.diagbot.dto.ConceptCollectionDTO;
 import com.diagbot.dto.GetAllForRelationDTO;
 import com.diagbot.dto.MedClassMedDTO;
 import com.diagbot.dto.RelationDTO;
@@ -9,8 +11,8 @@ import com.diagbot.dto.RelationNameDTO;
 import com.diagbot.entity.KlRelation;
 import com.diagbot.mapper.KlRelationMapper;
 import com.diagbot.service.KlRelationService;
+import com.diagbot.vo.ConceptCollectionPageVO;
 import com.diagbot.vo.DisNameFindVO;
-import com.diagbot.vo.KlRelationVO;
 import com.diagbot.vo.RelationVO;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Service;
@@ -32,17 +34,22 @@ public class KlRelationServiceImpl extends ServiceImpl<KlRelationMapper, KlRelat
         return baseMapper.getMedClassMedList();
     }
 
-    public List<RelationDTO> getRelations(RelationVO relationVO){
+    public List<RelationDTO> getRelations(RelationVO relationVO) {
         return baseMapper.getRelations(relationVO);
     }
 
     @Override
-    public List<RelationNameDTO> getRelationNameDTOs(List<Long> conceptIds,Integer relationId) {
-        return baseMapper.getRelationNameDTOs(conceptIds,relationId);
+    public List<RelationNameDTO> getRelationNameDTOs(List<Long> conceptIds, Integer relationId) {
+        return baseMapper.getRelationNameDTOs(conceptIds, relationId);
     }
 
     @Override
     public List<GetAllForRelationDTO> findDisNameAll(DisNameFindVO disNameFindVO) {
         return baseMapper.findDisNameAll(disNameFindVO);
     }
+
+    @Override
+    public IPage<ConceptCollectionDTO> getConceptCollectionPage(@Param("conceptCollectionPageVO") ConceptCollectionPageVO conceptCollectionPageVO) {
+        return baseMapper.getConceptCollectionPage(conceptCollectionPageVO);
+    }
 }

+ 15 - 0
cdssman-service/src/main/java/com/diagbot/vo/ConceptCollectionBaseVO.java

@@ -0,0 +1,15 @@
+package com.diagbot.vo;
+
+import lombok.Data;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2021/8/6 15:03
+ */
+@Data
+public class ConceptCollectionBaseVO {
+    private Long conceptId;
+    private String conceptLibName;
+    private Integer conceptLibType;
+}

+ 29 - 0
cdssman-service/src/main/java/com/diagbot/vo/ConceptCollectionPageVO.java

@@ -0,0 +1,29 @@
+package com.diagbot.vo;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.Data;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2021/8/6 13:15
+ */
+@Data
+public class ConceptCollectionPageVO extends Page {
+    /**
+     * 术语集合名称
+     */
+    private String collectionLibName;
+    /**
+     * 术语集合类型
+     */
+    private Integer collectionLibType;
+    /**
+     * 说明
+     */
+    private String collectionRemark;
+    /**
+     * 基础术语名称
+     */
+    private String conceptLibName;
+}

+ 16 - 0
cdssman-service/src/main/java/com/diagbot/vo/ConceptCollectionSaveVO.java

@@ -0,0 +1,16 @@
+package com.diagbot.vo;
+
+import com.diagbot.dto.ConceptCollectionDTO;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2021/8/6 14:57
+ */
+@Data
+public class ConceptCollectionSaveVO extends ConceptCollectionDTO {
+    public List<ConceptCollectionBaseVO> concepts;
+}

+ 6 - 1
cdssman-service/src/main/java/com/diagbot/vo/SearchConceptVO.java

@@ -17,7 +17,6 @@ import java.util.List;
 @Getter
 public class SearchConceptVO {
     @ApiModelProperty(value="名称")
-    @NotBlank(message = "请输入搜索名称")
     private String name;
     /**
      * 词性id
@@ -30,4 +29,10 @@ public class SearchConceptVO {
      */
     @ApiModelProperty(value="需要排除的概念id集合")
     private List<Long> excludedConceptIds;
+
+    /**
+     * 标志(新增 -1 修改 2)
+     */
+//    @ApiModelProperty(value="新增修改标志")
+//    private Integer sign;
 }

+ 81 - 0
cdssman-service/src/main/java/com/diagbot/web/KlConceptCollectionController.java

@@ -0,0 +1,81 @@
+package com.diagbot.web;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.annotation.SysLogger;
+import com.diagbot.dto.ConceptCollectionDTO;
+import com.diagbot.dto.RespDTO;
+import com.diagbot.facade.KlConceptCollectionFacade;
+import com.diagbot.vo.ConceptCollectionPageVO;
+import com.diagbot.vo.ConceptCollectionSaveVO;
+import com.diagbot.vo.IdVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2021/8/6 14:37
+ */
+@RestController
+@RequestMapping("/kl/conceptCollection")
+@Api(value = "术语集合维护相关API", tags = { "术语集合维护相关API" })
+@SuppressWarnings("unchecked")
+public class KlConceptCollectionController {
+
+    @Autowired
+    private KlConceptCollectionFacade klConceptCollectionFacade;
+
+    @ApiOperation(value = "获取术语集合列表[zhaops]",
+            notes = "collectionLibName:术语集合名称 <br>" +
+                    "collectionLibType: 术语集合类型 <br>" +
+                    "conceptLibName: 术语集合类型 <br>" +
+                    "collectionRemark: 基础术语名称 <br>")
+    @PostMapping("/getPage")
+    @SysLogger("getPage")
+    public RespDTO<IPage<ConceptCollectionDTO>> getPage(@Valid @RequestBody ConceptCollectionPageVO conceptCollectionPageVO) {
+        IPage<ConceptCollectionDTO> data = klConceptCollectionFacade.getConceptCollectionPage(conceptCollectionPageVO);
+        return RespDTO.onSuc(data);
+    }
+
+    @ApiOperation(value = "保存(新增or修改)[zhaops]",
+            notes = "collectionId:术语集合Id,必填 <br>" +
+                    "collectionLibType: 术语集合类型,必填 <br>" +
+                    "collectionLibName:术语集合名称 <br>" +
+                    "relationId: 关系类型 <br>" +
+                    "conceptLibType: 术语集合类型 <br>" +
+                    "collectionRemark: 基础术语名称 <br>" +
+                    "conceptId: 基础术语id,必填 <br>" +
+                    "conceptLibType: 基础术语类型,必填 <br>" +
+                    "conceptLibName: 基础术语名称 <br>")
+    @PostMapping("/saveOrUpdateRecord")
+    @SysLogger("saveOrUpdateRecord")
+    public RespDTO<Boolean> saveOrUpdateRecord(@Valid @RequestBody ConceptCollectionSaveVO conceptCollectionSaveVO) {
+        Boolean data = klConceptCollectionFacade.saveOrUpdateRecord(conceptCollectionSaveVO);
+        return RespDTO.onSuc(data);
+    }
+
+    @ApiOperation(value = "根据术语集合id获取集合相关信息[zhaops]",
+            notes = "id: 术语集合id <br>")
+    @PostMapping("/getRecordById")
+    @SysLogger("getRecordById")
+    public RespDTO<ConceptCollectionSaveVO> getRecordById(@Valid @RequestBody IdVO idVO) {
+        ConceptCollectionSaveVO data = klConceptCollectionFacade.getRecordById(idVO);
+        return RespDTO.onSuc(data);
+    }
+
+    @ApiOperation(value = "根据术语集合id删除术语集合关联关系[zhaops]",
+            notes = "id: 术语集合id <br>")
+    @PostMapping("/deleteById")
+    @SysLogger("deleteById")
+    public RespDTO<Boolean> deleteById(@Valid @RequestBody IdVO idVO) {
+        Boolean data = klConceptCollectionFacade.deleteById(idVO);
+        return RespDTO.onSuc(data);
+    }
+}

+ 24 - 1
cdssman-service/src/main/java/com/diagbot/web/KlDiseaseController.java

@@ -63,7 +63,8 @@ public class KlDiseaseController {
     @ApiOperation(value = "查询诊断依据相关的类型术语[by:kongwz]",
             notes = "name: 查询术语的名称<br>" +
                     "libType: 查询术语的词性<br>" +
-                    "excludedConceptIds: 需要排除的概念id集合")
+                    "excludedConceptIds: 需要排除的概念id集合<br>"+
+                    "sign: 新增 -1 修改 2")
     @PostMapping("/searchConcept")
     @SysLogger("searchConcept")
     public RespDTO<GetAllForRelationDTO> searchConcept(@Valid @RequestBody SearchConceptVO searchConceptVO) {
@@ -109,4 +110,26 @@ public class KlDiseaseController {
         return RespDTO.onSuc(klConcepts);
     }
 
+    @ApiOperation(value = "术语集合新增[by:kongwz]",
+            notes = "name: 查询术语的名称<br>" +
+                    "libType: 查询术语的词性<br>" +
+                    "excludedConceptIds: 需要排除的概念id集合")
+    @PostMapping("/addConceptClass")
+    @SysLogger("addConceptClass")
+    public RespDTO<List<GetAllForRelationDTO>> addConceptClass(@Valid @RequestBody SearchConceptVO searchConceptVO) {
+        List<GetAllForRelationDTO> getAllForRelationDTOS = klConceptFacade.addConceptClass(searchConceptVO);
+        return RespDTO.onSuc(getAllForRelationDTOS);
+    }
+
+    @ApiOperation(value = "规则维护术语查询[by:kongwz]",
+            notes = "name: 查询术语的名称<br>" +
+                    "libType: 查询术语的词性<br>" +
+                    "excludedConceptIds: 需要排除的概念id集合")
+    @PostMapping("/searchConceptRuleClass")
+    @SysLogger("searchConceptRuleClass")
+    public RespDTO<List<GetAllForRelationDTO>> searchConceptRuleClass(@Valid @RequestBody SearchConceptVO searchConceptVO) {
+        List<GetAllForRelationDTO> getAllForRelationDTOS = klConceptFacade.searchConceptRuleClass(searchConceptVO);
+        return RespDTO.onSuc(getAllForRelationDTOS);
+    }
+
 }

+ 57 - 0
cdssman-service/src/main/resources/mapper/KlRelationMapper.xml

@@ -200,4 +200,61 @@
 
     </select>
 
+    <select id="getConceptCollectionPage" resultType="com.diagbot.dto.ConceptCollectionDTO">
+        SELECT
+        t1.*,
+        t2.gmt_modified as gmtModified,
+        t2.modifier,
+        t4.id AS conceptId,
+        group_concat( t4.lib_name ) AS concatConceptLibName,
+        t4.lib_type AS conceptLibType,
+        t4.STATUS  AS conceptStatus
+        FROM
+        (
+        SELECT
+        a.id AS collectionId,
+        a.lib_name AS collectionLibName,
+        a.lib_type AS collectionLibType,
+        a.lib_id AS collectionLibId,
+        a.`status` AS collectionStatus,
+        b.remark AS collectionRemark
+        FROM
+        kl_concept a,
+        kl_library_info b
+        WHERE
+        a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND a.id = b.concept_id
+        AND a.`status` = 1
+        AND b.is_concept = 1
+        <if test="conceptCollectionPageVO.collectionLibType!=null">
+            AND  a.lib_type = #{conceptCollectionPageVO.collectionLibType}
+        </if>
+        <if test="conceptCollectionPageVO.collectionLibType==null">
+            AND  a.lib_type between 308 and 328
+        </if>
+        <if test="conceptCollectionPageVO.collectionLibName != null and conceptCollectionPageVO.collectionLibName != ''">
+            AND a.lib_name LIKE concat('%',#{conceptCollectionPageVO.collectionLibName},'%')
+        </if>
+        <if test="conceptCollectionPageVO.collectionRemark != null and conceptCollectionPageVO.collectionRemark != ''">
+            AND b.remark LIKE concat('%',#{conceptCollectionPageVO.collectionRemark},'%')
+        </if>
+        ) t1,
+        kl_relation t2,
+        kl_relation_order t3,
+        kl_concept t4
+        WHERE
+        t1.collectionId = t2.start_id
+        AND t3.t_relation_id = t2.id
+        AND t2.relation_id = 600
+        AND t2.end_id = t4.id
+        AND t4.is_deleted = 'N'
+        AND t4.`status` = 1
+        <if test="conceptCollectionPageVO.conceptLibName != null and conceptCollectionPageVO.conceptLibName != ''">
+            AND t4.lib_name LIKE concat('%',#{conceptCollectionPageVO.conceptLibName},'%')
+        </if>
+        GROUP BY
+        t1.collectionId
+        order by t2.gmt_modified desc
+    </select>
 </mapper>

+ 9 - 1
common/src/main/java/com/diagbot/biz/push/entity/Item.java

@@ -20,11 +20,19 @@ public class Item {
      */
     private String uniqueName;
     /**
-     * 结果时间
+     * 开单时间
      */
     private String dateValue;
+    /**
+     * 出报告时间
+     */
+    private String finishDateValue;
     /**
      * 频次
      */
     private String frequency;
+
+    public void setName(String name) {
+        this.name = name == null ? null : name.trim();
+    }
 }

+ 21 - 1
common/src/main/java/com/diagbot/biz/push/entity/Lis.java

@@ -44,9 +44,13 @@ public class Lis {
      */
     private String otherValue;
     /**
-     * 结果时间
+     * 开单时间
      */
     private String dateValue;
+    /**
+     * 出报告时间
+     */
+    private String finishDateValue;
     /**
      * 数据来源(0:内部数据,1:外部数据)
      */
@@ -59,4 +63,20 @@ public class Lis {
      * 频次
      */
     private String frequency;
+    /**
+     * 文本类型最小值
+     */
+    private String strMinValue;
+    /**
+     * 文本类型最大值
+     */
+    private String strMaxValue;
+
+    public void setName(String name) {
+        this.name = name == null ? null : name.trim();
+    }
+
+    public void setDetailName(String detailName) {
+        this.detailName = detailName == null ? null : detailName.trim();
+    }
 }

+ 9 - 1
common/src/main/java/com/diagbot/biz/push/entity/Pacs.java

@@ -28,11 +28,19 @@ public class Pacs {
      */
     private String result;
     /**
-     * 结果时间
+     * 开单时间
      */
     private String dateValue;
+    /**
+     * 出报告时间
+     */
+    private String finishDateValue;
     /**
      * 频次
      */
     private String frequency;
+
+    public void setName(String name) {
+        this.name = name == null ? null : name.trim();
+    }
 }

+ 299 - 0
common/src/main/java/com/diagbot/util/EntityUtil.java

@@ -1,14 +1,18 @@
 package com.diagbot.util;
 
+import com.diagbot.biz.push.entity.Lis;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.compress.utils.Lists;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.Validate;
 import org.apache.commons.lang3.reflect.FieldUtils;
+import org.apache.commons.lang3.time.DateUtils;
 
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.math.BigDecimal;
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -20,6 +24,7 @@ import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * @Description: 实体对象工具类
@@ -30,6 +35,68 @@ import java.util.Map;
 public class EntityUtil {
 
     private static final String DATE_CLASS_NAME = Date.class.getName();
+    public static String[]  dateFormats = {
+            "yyyy年MM月dd日HH时mm分",
+            "yyyy年MM月dd日HH:mm",
+            "yyyy年MM月dd日H时mm分",
+            "yyyy年MM月dd日HH时m分",
+            "yyyy年MM月dd日H时m分",
+            "yyyy年M月dd日HH时mm分",
+            "yyyy年M月dd日H时mm分",
+            "yyyy年M月dd日HH时m分",
+            "yyyy年M月dd日H时m分",
+            "yyyy年MM月d日HH时mm分",
+            "yyyy年MM月d日H时mm分",
+            "yyyy年MM月d日HH时m分",
+            "yyyy年MM月d日H时m分",
+            "yyyy年M月d日HH时mm分",
+            "yyyy年M月d日H时mm分",
+            "yyyy年M月d日HH时m分",
+            "yyyy年M月d日H时m分",
+            "yyyy-MM-ddHH:mm:ss",
+            "yyyy-MM-ddHH:mm",
+            "yyyy-MM-ddHH:m",
+            "yyyy-MM-ddH:mm",
+            "yyyy-MM-ddH:m",
+            "yyyy-M-ddHH:mm",
+            "yyyy-M-ddHH:m",
+            "yyyy-M-ddH:mm",
+            "yyyy-M-ddH:m",
+            "yyyy-MM-dHH:mm",
+            "yyyy-MM-dHH:m",
+            "yyyy-MM-dH:mm",
+            "yyyy-MM-dH:m",
+            "yyyy-M-dHH:mm",
+            "yyyy-M-dHH:m",
+            "yyyy-M-dH:mm",
+            "yyyy-M-dH:m",
+            "yyyy-MM-dd",
+            "yyyy年MM月dd日H时",
+            "yyyy/MM/ddHH:mm:ss",
+            "yyyy/MM/ddHH:mm",
+            "yyyy/MM/ddHH:m",
+            "yyyy/MM/ddH:mm",
+            "yyyy/MM/ddH:m",
+            "yyyy/MM/ddHH:mm:",
+            "yyyy/M/ddHH:mm",
+            "yyyy/M/ddHH:m",
+            "yyyy/M/ddH:mm",
+            "yyyy/M/ddH:m",
+            "yyyy/MM/dHH:mm",
+            "yyyy/MM/dHH:m",
+            "yyyy/MM/dH:mm",
+            "yyyy/MM/dH:m",
+            "yyyy/M/dHH:mm",
+            "yyyy/M/dHH:m",
+            "yyyy/M/dH:mm",
+            "yyyy/M/dH:m",
+            "yyyy/MM/dd",
+            "yyyy.MM.dd",
+            "yyyy-MM-ddHH:mm:ss.000",
+            "yyyyMMddHH:mm",
+            "yyyy-MM-dd'T'HH:mm:ss",
+            "MM/dd/yyyyHH:mm:ss"
+    };
 
     /**
      * 将list中元素的某一成员组装成list返回。注意:会去重!
@@ -447,4 +514,236 @@ public class EntityUtil {
         }
         return map;
     }
+
+    /**
+     * 以Map<key, V> 形式返回,如果key相同,会覆盖前面的内容
+     *
+     * @param list          列表
+     * @param splitSmybool  key分隔符
+     * @param multiProperty 多个属性
+     * @param <V>
+     * @return
+     */
+    public static <V> List<V> getNoRepeatList(List<V> list, String splitSmybool, String dateProperty, String... multiProperty) {
+        List<V> res = new ArrayList<>();
+        Map<String, V> multiKeyObject = getMultiKeyObject(list, splitSmybool, dateProperty, multiProperty);
+        if (multiKeyObject != null && !multiKeyObject.isEmpty()) {
+            for (String key : multiKeyObject.keySet()) {
+                res.add(multiKeyObject.get(key));
+            }
+        }
+        return res;
+    }
+
+    /**
+     * 以Map<key, V> 形式返回,如果key相同,根据时间排序,后面时间覆盖前面时间
+     *
+     * @param list          列表
+     * @param splitSmybool  key分隔符
+     * @param dateProperty  时间属性
+     * @param multiProperty 多个属性
+     * @param <V>
+     * @return
+     */
+    public static <V> Map<String, V> getMultiKeyObject(List<V> list, String splitSmybool, String dateProperty, String... multiProperty) {
+        if (ListUtil.isEmpty(list)) {
+            return new LinkedHashMap<>();
+        }
+        return list.stream().collect(Collectors.toMap(k -> {
+            List<String> keyList = new ArrayList<>();
+            for (String property : multiProperty) {
+                keyList.add(getProperty(k, property));
+            }
+            return StringUtils.join(keyList, splitSmybool);
+        }, v -> v, (v1, v2) -> {
+            String date1 = getProperty(v1, dateProperty);
+            if (StringUtil.isBlank(date1)) {
+                return v2;
+            }
+            String date2 = getProperty(v2, dateProperty);
+            if (StringUtil.isBlank(date2)) {
+                return v1;
+            }
+            int flag = compareTime(date1, date2);
+            if (flag == 0) {
+                return v1;
+            } else {
+                return v2;
+            }
+        }, LinkedHashMap::new));
+    }
+
+    /**
+     * 获取对象的属性值,直接使用getDeclaredFields()方法只能获取当前类声明的字段,需要递归向上获取
+     *
+     * @param object    : 子类对象
+     * @param fieldName : 父类中的属性名
+     * @return : 父类中的属性值
+     */
+    public static <T> T getProperty(Object object, String fieldName) {
+        try {
+            //根据 对象和属性名通过反射获取Field对象
+            Field field = getDeclaredField(object, fieldName);
+            // 容错处理
+            if (field == null) {
+                return null;
+            }
+            //抑制Java对其的检查
+            field.setAccessible(true);
+            //获取 object 中 field 所代表的属性值
+            return (T) field.get(object);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 对象赋值
+     *
+     * @param object
+     * @param property
+     * @param value
+     */
+    public static void setProperty(Object object, String property, Object value) {
+        //根据 对象和属性名通过反射 调用上面的方法获取 Field对象
+        Field field = getDeclaredField(object, property);
+        //抑制Java对其的检查
+        field.setAccessible(true);
+        try {
+            field.set(object, value);
+        } catch (IllegalArgumentException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 循环向上转型, 获取对象的 DeclaredField
+     *
+     * @param object    : 子类对象
+     * @param fieldName : 父类中的属性名
+     * @return 父类中的属性对象
+     */
+    public static Field getDeclaredField(Object object, String fieldName) {
+        Field field = null;
+        Class<?> clazz = object.getClass();
+        for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
+            try {
+                field = clazz.getDeclaredField(fieldName);
+                return field;
+            } catch (Exception e) {
+                //这里甚么都不要做!并且这里的异常必须这样写,不能抛出去。
+                //如果这里的异常打印或者往外抛,则就不会执行clazz = clazz.getSuperclass(),最后就不会进入到父类中了
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 比较时间,endDateStr >= startDateStr
+     * @param startDateStr
+     * @param endDateStr
+     * @return -1:无法比较或出错,0:endDateStr < startDateStr,1:endDateStr >= startDateStr
+     */
+    public static int compareTime(String startDateStr, String endDateStr) {
+        int flag = -1;
+        if (StringUtil.isBlank(startDateStr) || StringUtil.isBlank(endDateStr)) {
+            return flag;
+        }
+        try {
+            Date startDate = parseStringDate(startDateStr);
+            Date endDate = parseStringDate(endDateStr);
+            Long timeStart = startDate.getTime();
+            Long timeEnd = endDate.getTime();
+            if (timeEnd >= timeStart) {
+                flag = 1;
+            } else {
+                flag = 0;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    /**
+     * 解析时间
+     *
+     * @param datetime
+     * @return
+     */
+    public static Date parseStringDate(String datetime) {
+        if (StringUtil.isBlank(datetime)) {
+            return null;
+        }
+        Date date = null;
+        try {
+            datetime = remove_ctl(datetime);
+
+            if (datetime.contains("至")) {
+                datetime = datetime.split("至")[1].replaceAll("[\\u4e00-\\u9fa5]", "");
+            }
+
+            if (datetime.length() > 0) {
+                date = DateUtils.parseDate(datetime, dateFormats);
+            }
+        } catch (ParseException ex) {
+            ex.printStackTrace();
+        }
+        return date;
+    }
+
+    /**
+     * 删除字符串中的换行和控制字符
+     *
+     * @param str
+     */
+    public static String remove_ctl(String str) {
+        String trim = "";
+        if (StringUtils.isNotEmpty(str)) {
+            trim = str.replaceAll("\r|\n|\r\n", "").trim();
+        }
+        return trim;
+    }
+
+    public static void main(String[] args) {
+        List<Lis> lisList = Lists.newArrayList();
+        Lis lis = new Lis();
+        lis.setName("血常规");
+        lis.setDetailName("白细胞计数");
+        lis.setUniqueName("");
+        lis.setValue(10.0D);
+        lis.setUnits("");
+        lis.setMinValue(0.0D);
+        lis.setMaxValue(0.0D);
+        lis.setOtherValue("");
+        lis.setDateValue("2021-08-18 10:04:56");
+        lis.setFinishDateValue("");
+        lis.setSource(0);
+        lis.setResult("");
+        lis.setFrequency("");
+
+        Lis lis2 = new Lis();
+        lis2.setName("血常规");
+        lis2.setDetailName("白细胞计数");
+        lis2.setUniqueName("");
+        lis2.setValue(20.0D);
+        lis2.setUnits("");
+        lis2.setMinValue(0.0D);
+        lis2.setMaxValue(0.0D);
+        lis2.setOtherValue("");
+        lis2.setDateValue("2021-08-18 11:04:56");
+        lis2.setFinishDateValue("");
+        lis2.setSource(0);
+        lis2.setResult("");
+        lis2.setFrequency("");
+
+        lisList.add(lis);
+        lisList.add(lis2);
+        Map<String, Lis> multiKeyObject = getMultiKeyObject(lisList, "_", "dateValue", "name", "detailName");
+        System.out.println(multiKeyObject);
+
+    }
 }