|
@@ -0,0 +1,425 @@
|
|
|
+package com.diagbot.facade;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import com.diagbot.entity.KlConcept;
|
|
|
+import com.diagbot.entity.KlDiagnose;
|
|
|
+import com.diagbot.enums.IsDeleteEnum;
|
|
|
+import com.diagbot.enums.LexiconEnum;
|
|
|
+import com.diagbot.enums.LexiconExtEnum;
|
|
|
+import com.diagbot.service.KlConceptService;
|
|
|
+import com.diagbot.util.EntityUtil;
|
|
|
+import com.diagbot.util.ExcelUtils;
|
|
|
+import com.diagbot.util.ListUtil;
|
|
|
+import com.diagbot.util.StringUtil;
|
|
|
+import com.diagbot.util.VerifyUtil;
|
|
|
+import com.diagbot.vo.DiagnoseImportVO;
|
|
|
+import com.diagbot.vo.ImportDiagnoseResVO;
|
|
|
+import com.diagbot.vo.ImportDiagnoseVO;
|
|
|
+import com.diagbot.vo.KlDiagnoseDetailVO;
|
|
|
+import com.diagbot.vo.KlDiagnoseGroupVO;
|
|
|
+import com.diagbot.vo.KlDiagnoseSaveVO;
|
|
|
+import com.diagbot.vo.KlDiagnoseTypeVO;
|
|
|
+import com.google.common.collect.Lists;
|
|
|
+import com.google.common.collect.Maps;
|
|
|
+import org.apache.poi.ss.usermodel.Workbook;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.beans.factory.annotation.Qualifier;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
+
|
|
|
+import java.io.IOException;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.LinkedHashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @Description:
|
|
|
+ * @author: zhoutg
|
|
|
+ * @time: 2021/3/15 11:42
|
|
|
+ */
|
|
|
+@Component
|
|
|
+public class KlDiagnoseImportFacade {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ @Qualifier("klConceptServiceImpl")
|
|
|
+ private KlConceptService klConceptService;
|
|
|
+ @Autowired
|
|
|
+ KlDiagnoseFacade klDiagnoseFacade;
|
|
|
+
|
|
|
+ public Map<String, Object> importDiagnose(MultipartFile file, DiagnoseImportVO diagnoseImportVO) {
|
|
|
+ Map<String, Object> errMessage = new LinkedHashMap<>(); // 错误提示语
|
|
|
+ List<ImportDiagnoseResVO> allData = Lists.newArrayList(); // 最终需要保存的数据
|
|
|
+ // 校验数据
|
|
|
+ Boolean allFlag = verifyData(file, diagnoseImportVO, errMessage, allData);
|
|
|
+
|
|
|
+ // 保存数据
|
|
|
+ if (allFlag) {
|
|
|
+ saveData(allData);
|
|
|
+ }
|
|
|
+ return errMessage;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 校验数据
|
|
|
+ *
|
|
|
+ * @param file
|
|
|
+ * @param diagnoseImportVO
|
|
|
+ * @param diagMessage
|
|
|
+ * @param allData
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Boolean verifyData(MultipartFile file, DiagnoseImportVO diagnoseImportVO, Map<String, Object> diagMessage, List<ImportDiagnoseResVO> allData) {
|
|
|
+ Boolean allFlag = true;
|
|
|
+ List<String> diagtypes = Lists.newArrayList("拟诊", "确诊", "警惕");
|
|
|
+ // 获取标准词库Map
|
|
|
+ Map<String, KlConcept> concept_map = getConceptMap();
|
|
|
+
|
|
|
+ // 获取所有的sheet和序号的对应关系
|
|
|
+ Map<String, Integer> sheetNumNameMap = dealExcel(file);
|
|
|
+ List<String> diags = diagnoseImportVO.getDiags();
|
|
|
+ if (ListUtil.isNotEmpty(diags)) {
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ Map<String, Integer> inputNumNameMap = new HashMap<>();
|
|
|
+ for (String diag : diags) {
|
|
|
+ if (!sheetNumNameMap.containsKey(diag)) {
|
|
|
+ sb.append(String.format("输入的诊断: %s不在下面的sheet中; ", "【" + diag + "】"));
|
|
|
+ } else {
|
|
|
+ inputNumNameMap.put(diag, sheetNumNameMap.get(diag));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (StringUtil.isNotBlank(sb.toString())) {
|
|
|
+ diagMessage.put("输入校验", sb.toString());
|
|
|
+ allFlag = false;
|
|
|
+ return allFlag;
|
|
|
+ } else {
|
|
|
+ sheetNumNameMap = inputNumNameMap;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (Map.Entry<String, Integer> sheet : sheetNumNameMap.entrySet()) {
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ String sheetName = sheet.getKey();
|
|
|
+ Integer sheetNum = sheet.getValue();
|
|
|
+ ImportDiagnoseResVO importDiagnoseResVO = new ImportDiagnoseResVO();
|
|
|
+
|
|
|
+ // 校验疾病名称【sheetName】
|
|
|
+ KlConcept klConcept = concept_map.get(sheetName + "_" + String.valueOf(LexiconEnum.Disease.getKey()));
|
|
|
+ if (klConcept != null) {
|
|
|
+ importDiagnoseResVO.setDiseaseName(sheetName);
|
|
|
+ importDiagnoseResVO.setDiseaseId(klConcept.getId());
|
|
|
+ } else {
|
|
|
+ sb.append(String.format("sheetName: %s不是标准词; ", "【" + sheetName + "】"));
|
|
|
+ }
|
|
|
+ // 校验其他行数据、格式
|
|
|
+ List<ImportDiagnoseVO> data = ExcelUtils.importExcelMultiSheets(file, 0, 1, sheetNum.intValue(), ImportDiagnoseVO.class);
|
|
|
+ sb = dealVerify(sb, diagtypes, data, concept_map);
|
|
|
+
|
|
|
+ // 数据赋值
|
|
|
+ if (StringUtil.isBlank(sb.toString())) {
|
|
|
+ data = dealImportDiagnose(diagtypes, data, concept_map);
|
|
|
+ // 添加到正确数据列表
|
|
|
+ importDiagnoseResVO.setImportDiagnoseVOList(data);
|
|
|
+ allData.add(importDiagnoseResVO);
|
|
|
+ } else {
|
|
|
+ allFlag = false;
|
|
|
+ diagMessage.put(sheetName, sb.toString());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return allFlag;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取sheet名称和序号的对应关系
|
|
|
+ *
|
|
|
+ * @param file
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private Map<String, Integer> dealExcel(MultipartFile file) {
|
|
|
+ Map<String, Integer> sheet_num_name = Maps.newLinkedHashMap();
|
|
|
+ Workbook workBook = null;
|
|
|
+ try {
|
|
|
+ workBook = ExcelUtils.getWorkBook(file);
|
|
|
+ int numberOfSheets = workBook.getNumberOfSheets();
|
|
|
+ for (int i = 0; i < numberOfSheets; i++) {
|
|
|
+ String sheetName = workBook.getSheetName(i);
|
|
|
+ sheet_num_name.put(sheetName, i);
|
|
|
+ }
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return sheet_num_name;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 给标准词设置conceptId
|
|
|
+ *
|
|
|
+ * @param diagtypes
|
|
|
+ * @param importDiagnoseVOS
|
|
|
+ * @param concept_map
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private List<ImportDiagnoseVO> dealImportDiagnose(List<String> diagtypes, List<ImportDiagnoseVO> importDiagnoseVOS, Map<String, KlConcept> concept_map) {
|
|
|
+ for (ImportDiagnoseVO idv : importDiagnoseVOS) {
|
|
|
+ String type = idv.getType().trim();
|
|
|
+ String rule = idv.getRule().trim();
|
|
|
+ if (!type.contains("正则") && !diagtypes.contains(type)) {
|
|
|
+ KlConcept klConcept = concept_map.get(rule + "_" + String.valueOf(LexiconExtEnum.getEnum(type).getKey()));
|
|
|
+ if (klConcept != null) {
|
|
|
+ idv.setConceptId(klConcept.getId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return importDiagnoseVOS;
|
|
|
+ }
|
|
|
+
|
|
|
+ //数据及格式校验
|
|
|
+ private StringBuilder dealVerify(StringBuilder sb, List<String> diagtypes, List<ImportDiagnoseVO> data, Map<String, KlConcept> concept_map) {
|
|
|
+
|
|
|
+ //所有序号
|
|
|
+ List<String> orderNums = Lists.newArrayList();
|
|
|
+ //所有公式
|
|
|
+ List<String> verifies = Lists.newArrayList();
|
|
|
+
|
|
|
+ if (ListUtil.isNotEmpty(data)) {
|
|
|
+ for (ImportDiagnoseVO imd : data) {
|
|
|
+ String type = imd.getType().trim();
|
|
|
+ String rule = imd.getRule().trim();
|
|
|
+ String orderNo = imd.getOrderNo().trim();
|
|
|
+ String maxSymbol = imd.getMaxSymbol();
|
|
|
+ String minSymbol = imd.getMinSymbol();
|
|
|
+
|
|
|
+ if (diagtypes.contains(type) && StringUtil.isNotBlank(orderNo)) {
|
|
|
+ verifies.add(orderNo.trim());
|
|
|
+ }
|
|
|
+ if (StringUtil.isNotBlank(type) && StringUtil.isNotBlank(rule) && StringUtil.isNotBlank(orderNo)) {
|
|
|
+ orderNums.add(orderNo);
|
|
|
+ if (!type.contains("正则") &&
|
|
|
+ !concept_map.containsKey(rule + "_" + String.valueOf(LexiconExtEnum.getEnum(type).getKey()))) {
|
|
|
+ sb.append(String.format("%s不是标准词; ", rule));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (StringUtil.isNotBlank(maxSymbol) &&
|
|
|
+ !"<=".equals(maxSymbol) && !"<".equals(maxSymbol)) {
|
|
|
+ sb.append(String.format("%s的最大符号%s不正确; ", rule, maxSymbol));
|
|
|
+ }
|
|
|
+ if (StringUtil.isNotBlank(minSymbol) &&
|
|
|
+ !">=".equals(minSymbol) && !">".equals(minSymbol)) {
|
|
|
+ sb.append(String.format("%s的最小符号%s不正确; ", rule, minSymbol));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //格式校验
|
|
|
+ if (ListUtil.isNotEmpty(verifies)) {
|
|
|
+ for (String vef : verifies) {
|
|
|
+ String s = VerifyUtil.verifyFormula(orderNums, vef);
|
|
|
+ sb.append(s);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return sb;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Map<String, KlConcept> getConceptMap() {
|
|
|
+ List<KlConcept> klConcepts
|
|
|
+ = klConceptService.list(new QueryWrapper<KlConcept>()
|
|
|
+ .eq("is_deleted", IsDeleteEnum.N.getKey())
|
|
|
+ );
|
|
|
+ Map<String, KlConcept> map
|
|
|
+ = EntityUtil.makeEntityMapByKeys(klConcepts, "_", "libName", "libType");
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 保存数据
|
|
|
+ *
|
|
|
+ * @param allData
|
|
|
+ */
|
|
|
+ public void saveData(List<ImportDiagnoseResVO> allData) {
|
|
|
+ for (ImportDiagnoseResVO importDiagnoseResVO : allData) {
|
|
|
+ Long diseaseId = importDiagnoseResVO.getDiseaseId();
|
|
|
+ String diseaseName = importDiagnoseResVO.getDiseaseName();
|
|
|
+ List<ImportDiagnoseVO> data = importDiagnoseResVO.getImportDiagnoseVOList();
|
|
|
+ // 获取序号对应的行数据
|
|
|
+ Map<String, List<ImportDiagnoseVO>> map = EntityUtil.makeEntityListMap(data, "orderNo");
|
|
|
+
|
|
|
+ if (ListUtil.isNotEmpty(data)) {
|
|
|
+ // 第一层
|
|
|
+ KlDiagnoseSaveVO klDiagnoseSaveVO = new KlDiagnoseSaveVO();
|
|
|
+ klDiagnoseSaveVO.setConceptId(diseaseId);
|
|
|
+ klDiagnoseSaveVO.setDescription(diseaseName);
|
|
|
+
|
|
|
+ // 第二层
|
|
|
+ List<KlDiagnoseTypeVO> klDiagnoseTypeVOList = Lists.newArrayList();
|
|
|
+
|
|
|
+ for (ImportDiagnoseVO importDiagnoseVO : data) {
|
|
|
+ String type = importDiagnoseVO.getType();
|
|
|
+ String getOrderNo = importDiagnoseVO.getOrderNo();
|
|
|
+ if (StringUtil.isNotBlank(type) && StringUtil.isNotBlank(getOrderNo)) {
|
|
|
+ if ("拟诊".equals(type) || "确诊".equals(type) || "警惕".equals(type)) {
|
|
|
+ String[] splitGroup = getOrderNo.split("\\+");
|
|
|
+
|
|
|
+ KlDiagnoseTypeVO klDiagnoseTypeVO = new KlDiagnoseTypeVO();
|
|
|
+ if ("拟诊".equals(type)) {
|
|
|
+ klDiagnoseTypeVO.setConditionType(2);
|
|
|
+ } else if ("确诊".equals(type)) {
|
|
|
+ klDiagnoseTypeVO.setConditionType(3);
|
|
|
+ } else if ("警惕".equals(type)) {
|
|
|
+ klDiagnoseTypeVO.setConditionType(4);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 第三层
|
|
|
+ List<KlDiagnoseGroupVO> groupVO = Lists.newArrayList();
|
|
|
+ for (String group : splitGroup) {
|
|
|
+ KlDiagnoseGroupVO klDiagnoseGroupVO = generateDiagnoseGroup(group, map);
|
|
|
+ groupVO.add(klDiagnoseGroupVO);
|
|
|
+ }
|
|
|
+
|
|
|
+ klDiagnoseTypeVO.setGroupVO(groupVO);
|
|
|
+ klDiagnoseTypeVOList.add(klDiagnoseTypeVO);
|
|
|
+ klDiagnoseSaveVO.setKlDiagnoseTypeVO(klDiagnoseTypeVOList);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取主表数据
|
|
|
+ KlDiagnose klDiagnose = klDiagnoseFacade.getOne(new QueryWrapper<KlDiagnose>().eq("concept_id", diseaseId), false);
|
|
|
+ if (klDiagnose != null) {
|
|
|
+ klDiagnoseSaveVO.setId(klDiagnose.getId());
|
|
|
+ klDiagnoseSaveVO.setModifier("0");
|
|
|
+ }
|
|
|
+ klDiagnoseFacade.saveDiagnoseAll(klDiagnoseSaveVO);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成KlDiagnoseGroupVO, 每一组+分隔后的内容
|
|
|
+ *
|
|
|
+ * @param map
|
|
|
+ * @param text
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public KlDiagnoseGroupVO generateDiagnoseGroup(String text, Map<String, List<ImportDiagnoseVO>> map) {
|
|
|
+ KlDiagnoseGroupVO klDiagnoseGroupVO = new KlDiagnoseGroupVO();
|
|
|
+
|
|
|
+ // list[0]:序号,list[1]:任几
|
|
|
+ List<String> list = Lists.newArrayList();
|
|
|
+ if (text.contains("[") || text.contains("]")) {
|
|
|
+ list.add(text.substring(text.indexOf("[") + 1, text.indexOf("]")));
|
|
|
+ String numStr = text.substring(text.indexOf("任") + 1);
|
|
|
+ String num = "1";
|
|
|
+ switch (numStr) {
|
|
|
+ case "一":
|
|
|
+ num = "1";
|
|
|
+ break;
|
|
|
+ case "二":
|
|
|
+ num = "2";
|
|
|
+ break;
|
|
|
+ case "三":
|
|
|
+ num = "3";
|
|
|
+ break;
|
|
|
+ case "四":
|
|
|
+ num = "4";
|
|
|
+ break;
|
|
|
+ case "五":
|
|
|
+ num = "5";
|
|
|
+ break;
|
|
|
+ case "六":
|
|
|
+ num = "6";
|
|
|
+ break;
|
|
|
+ case "七":
|
|
|
+ num = "7";
|
|
|
+ break;
|
|
|
+ case "八":
|
|
|
+ num = "8";
|
|
|
+ break;
|
|
|
+ case "九":
|
|
|
+ num = "9";
|
|
|
+ break;
|
|
|
+ case "十":
|
|
|
+ num = "10";
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ list.add(num);
|
|
|
+ } else {
|
|
|
+ list.add(text);
|
|
|
+ list.add("1");
|
|
|
+ }
|
|
|
+ klDiagnoseGroupVO.setFitNo(Integer.valueOf(list.get(1))); // 任几
|
|
|
+
|
|
|
+ List<KlDiagnoseDetailVO> klDiagnoseDetail = Lists.newArrayList();
|
|
|
+ String[] orderArr = list.get(0).split("、");
|
|
|
+ for (String order : orderArr) {
|
|
|
+ KlDiagnoseDetailVO klDiagnoseDetailVO = new KlDiagnoseDetailVO();
|
|
|
+ ImportDiagnoseVO current = map.get(order).get(0);
|
|
|
+ LexiconExtEnum libTypeEnum = LexiconExtEnum.getEnum(current.getType());
|
|
|
+ if (libTypeEnum != null) {
|
|
|
+ klDiagnoseDetailVO.setBasLibName(current.getRule());
|
|
|
+ switch (libTypeEnum) {
|
|
|
+ case Symptom: // 症状
|
|
|
+ case VitalResult: // 体格检查结果
|
|
|
+ case PacsResult: // 辅助检查结果
|
|
|
+ case Group: // 人群
|
|
|
+ case Disease: // 疾病
|
|
|
+ klDiagnoseDetailVO.setBasConceptId(current.getConceptId());
|
|
|
+ klDiagnoseDetailVO.setBasType(1);
|
|
|
+ klDiagnoseDetailVO.setBasDescription(current.getRule());
|
|
|
+ break;
|
|
|
+ case zsxbszz: // 主诉现病史正则
|
|
|
+ klDiagnoseDetailVO.setBasType(3);
|
|
|
+ klDiagnoseDetailVO.setBasDescription(current.getRule());
|
|
|
+ klDiagnoseDetailVO.setEqValue(current.getRule());
|
|
|
+ break;
|
|
|
+ case jwzz: // 既往正则
|
|
|
+ klDiagnoseDetailVO.setBasType(4);
|
|
|
+ klDiagnoseDetailVO.setBasDescription(current.getRule());
|
|
|
+ klDiagnoseDetailVO.setEqValue(current.getRule());
|
|
|
+ break;
|
|
|
+ case Vital: // 体格检查项目
|
|
|
+ case Age: // 年龄
|
|
|
+ klDiagnoseDetailVO.setBasConceptId(current.getConceptId());
|
|
|
+ if (StringUtil.isNotBlank(current.getMin())) {
|
|
|
+ klDiagnoseDetailVO.setMinVal(current.getMin());
|
|
|
+ }
|
|
|
+ if (StringUtil.isNotBlank(current.getMinSymbol())) {
|
|
|
+ klDiagnoseDetailVO.setMinOperator(current.getMinSymbol());
|
|
|
+ }
|
|
|
+ if (StringUtil.isNotBlank(current.getUnit())) {
|
|
|
+ klDiagnoseDetailVO.setMinUnit(current.getUnit());
|
|
|
+ klDiagnoseDetailVO.setMaxUnit(current.getUnit());
|
|
|
+ }
|
|
|
+ if (StringUtil.isNotBlank(current.getMax())) {
|
|
|
+ klDiagnoseDetailVO.setMaxVal(current.getMax());
|
|
|
+ }
|
|
|
+ if (StringUtil.isNotBlank(current.getMaxSymbol())) {
|
|
|
+ klDiagnoseDetailVO.setMaxOperator(String.valueOf(current.getMaxSymbol()));
|
|
|
+ }
|
|
|
+ klDiagnoseDetailVO.setBasDescription(current.getRule());
|
|
|
+ klDiagnoseDetailVO.setBasType(2);
|
|
|
+ break;
|
|
|
+ case LisSubName: // 实验室检查子项目
|
|
|
+ klDiagnoseDetailVO.setBasConceptId(current.getConceptId());
|
|
|
+ klDiagnoseDetailVO.setEqValue(current.getEq());
|
|
|
+ klDiagnoseDetailVO.setBasDescription(current.getRule() + current.getEq());
|
|
|
+ klDiagnoseDetailVO.setBasType(2);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ klDiagnoseDetail.add(klDiagnoseDetailVO);
|
|
|
+ }
|
|
|
+
|
|
|
+ klDiagnoseGroupVO.setKlDiagnoseDetail(klDiagnoseDetail);
|
|
|
+ return klDiagnoseGroupVO;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void main(String[] args) {
|
|
|
+ String text = "[1、2、3]任一";
|
|
|
+ List<String> list = Lists.newArrayList();
|
|
|
+ if (text.contains("[") || text.contains("]")) {
|
|
|
+ list.add(text.substring(text.indexOf("[") + 1, text.indexOf("]")));
|
|
|
+ list.add(text.substring(text.indexOf("]") + 1));
|
|
|
+ }
|
|
|
+ System.out.println(list);
|
|
|
+ }
|
|
|
+}
|