Przeglądaj źródła

Merge branch 'dev/knowledgeExt20210511' into debug

zhoutg 4 lat temu
rodzic
commit
a2c2c45843

+ 10 - 0
cdssman-service/src/main/java/com/diagbot/dto/KlDiseaseDTO.java

@@ -139,6 +139,16 @@ public class KlDiseaseDTO implements Serializable {
      */
     private String remark;
 
+    /**
+     * 肿瘤细胞类型
+     */
+    private String tumorCellType;
+
+    /**
+     * 形态学分类代码
+     */
+    private String morphology;
+
     // 科室列表
     private List<KlConceptSimDTO> deptList = Lists.newLinkedList();
 

+ 12 - 247
cdssman-service/src/main/java/com/diagbot/entity/KlDisease.java

@@ -2,6 +2,7 @@ package com.diagbot.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -14,6 +15,7 @@ import java.util.Date;
  * @author zhoutg
  * @since 2021-05-11
  */
+@Data
 public class KlDisease implements Serializable {
 
     private static final long serialVersionUID = 1L;
@@ -164,255 +166,18 @@ public class KlDisease implements Serializable {
      */
     private String enName;
 
+    /**
+     * 肿瘤细胞类型
+     */
+    private String tumorCellType;
+
+    /**
+     * 形态学分类代码
+     */
+    private String morphology;
+
     /**
      * 备注
      */
     private String remark;
-
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-    public String getIsDeleted() {
-        return isDeleted;
-    }
-
-    public void setIsDeleted(String isDeleted) {
-        this.isDeleted = isDeleted;
-    }
-    public Date getGmtCreate() {
-        return gmtCreate;
-    }
-
-    public void setGmtCreate(Date gmtCreate) {
-        this.gmtCreate = gmtCreate;
-    }
-    public Date getGmtModified() {
-        return gmtModified;
-    }
-
-    public void setGmtModified(Date gmtModified) {
-        this.gmtModified = gmtModified;
-    }
-    public String getCreator() {
-        return creator;
-    }
-
-    public void setCreator(String creator) {
-        this.creator = creator;
-    }
-    public String getModifier() {
-        return modifier;
-    }
-
-    public void setModifier(String modifier) {
-        this.modifier = modifier;
-    }
-    public Long getConceptId() {
-        return conceptId;
-    }
-
-    public void setConceptId(Long conceptId) {
-        this.conceptId = conceptId;
-    }
-    public Long getDeptId() {
-        return deptId;
-    }
-
-    public void setDeptId(Long deptId) {
-        this.deptId = deptId;
-    }
-    public String getIcd10Code() {
-        return icd10Code;
-    }
-
-    public void setIcd10Code(String icd10Code) {
-        this.icd10Code = icd10Code;
-    }
-    public String getCourse() {
-        return course;
-    }
-
-    public void setCourse(String course) {
-        this.course = course;
-    }
-    public String getInducement() {
-        return inducement;
-    }
-
-    public void setInducement(String inducement) {
-        this.inducement = inducement;
-    }
-    public String getFoodProhibition() {
-        return foodProhibition;
-    }
-
-    public void setFoodProhibition(String foodProhibition) {
-        this.foodProhibition = foodProhibition;
-    }
-    public String getHazard() {
-        return hazard;
-    }
-
-    public void setHazard(String hazard) {
-        this.hazard = hazard;
-    }
-    public String getHealing() {
-        return healing;
-    }
-
-    public void setHealing(String healing) {
-        this.healing = healing;
-    }
-    public String getPernicious() {
-        return pernicious;
-    }
-
-    public void setPernicious(String pernicious) {
-        this.pernicious = pernicious;
-    }
-    public String getClinicType() {
-        return clinicType;
-    }
-
-    public void setClinicType(String clinicType) {
-        this.clinicType = clinicType;
-    }
-    public String getVulArea() {
-        return vulArea;
-    }
-
-    public void setVulArea(String vulArea) {
-        this.vulArea = vulArea;
-    }
-    public String getVulCrowd() {
-        return vulCrowd;
-    }
-
-    public void setVulCrowd(String vulCrowd) {
-        this.vulCrowd = vulCrowd;
-    }
-    public Double getIncidence() {
-        return incidence;
-    }
-
-    public void setIncidence(Double incidence) {
-        this.incidence = incidence;
-    }
-    public Integer getIsInfect() {
-        return isInfect;
-    }
-
-    public void setIsInfect(Integer isInfect) {
-        this.isInfect = isInfect;
-    }
-    public String getComplication() {
-        return complication;
-    }
-
-    public void setComplication(String complication) {
-        this.complication = complication;
-    }
-    public String getPathogeny() {
-        return pathogeny;
-    }
-
-    public void setPathogeny(String pathogeny) {
-        this.pathogeny = pathogeny;
-    }
-    public String getDisType() {
-        return disType;
-    }
-
-    public void setDisType(String disType) {
-        this.disType = disType;
-    }
-    public Integer getChWestern() {
-        return chWestern;
-    }
-
-    public void setChWestern(Integer chWestern) {
-        this.chWestern = chWestern;
-    }
-    public Integer getIsCommonDis() {
-        return isCommonDis;
-    }
-
-    public void setIsCommonDis(Integer isCommonDis) {
-        this.isCommonDis = isCommonDis;
-    }
-    public Integer getIsHeredity() {
-        return isHeredity;
-    }
-
-    public void setIsHeredity(Integer isHeredity) {
-        this.isHeredity = isHeredity;
-    }
-    public String getNameSimple() {
-        return nameSimple;
-    }
-
-    public void setNameSimple(String nameSimple) {
-        this.nameSimple = nameSimple;
-    }
-    public String getEnNameSimple() {
-        return enNameSimple;
-    }
-
-    public void setEnNameSimple(String enNameSimple) {
-        this.enNameSimple = enNameSimple;
-    }
-    public String getEnName() {
-        return enName;
-    }
-
-    public void setEnName(String enName) {
-        this.enName = enName;
-    }
-    public String getRemark() {
-        return remark;
-    }
-
-    public void setRemark(String remark) {
-        this.remark = remark;
-    }
-
-    @Override
-    public String toString() {
-        return "KlDisease{" +
-            "id=" + id +
-            ", isDeleted=" + isDeleted +
-            ", gmtCreate=" + gmtCreate +
-            ", gmtModified=" + gmtModified +
-            ", creator=" + creator +
-            ", modifier=" + modifier +
-            ", conceptId=" + conceptId +
-            ", deptId=" + deptId +
-            ", icd10Code=" + icd10Code +
-            ", course=" + course +
-            ", inducement=" + inducement +
-            ", foodProhibition=" + foodProhibition +
-            ", hazard=" + hazard +
-            ", healing=" + healing +
-            ", pernicious=" + pernicious +
-            ", clinicType=" + clinicType +
-            ", vulArea=" + vulArea +
-            ", vulCrowd=" + vulCrowd +
-            ", incidence=" + incidence +
-            ", isInfect=" + isInfect +
-            ", complication=" + complication +
-            ", pathogeny=" + pathogeny +
-            ", disType=" + disType +
-            ", chWestern=" + chWestern +
-            ", isCommonDis=" + isCommonDis +
-            ", isHeredity=" + isHeredity +
-            ", nameSimple=" + nameSimple +
-            ", enNameSimple=" + enNameSimple +
-            ", enName=" + enName +
-            ", remark=" + remark +
-        "}";
-    }
 }

+ 34 - 159
cdssman-service/src/main/java/com/diagbot/facade/KlDrugRegisterFacade.java

@@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.diagbot.dto.KlConceptSimDTO;
 import com.diagbot.dto.KlDrugRegisterDTO;
 import com.diagbot.entity.CommonParam;
-import com.diagbot.entity.Ex;
 import com.diagbot.entity.KlConcept;
 import com.diagbot.entity.KlDrugMapping;
 import com.diagbot.entity.KlDrugRegister;
@@ -18,10 +17,7 @@ import com.diagbot.service.KlDrugRegisterService;
 import com.diagbot.service.impl.KlDrugRegisterServiceImpl;
 import com.diagbot.util.BeanUtil;
 import com.diagbot.util.DateUtil;
-import com.diagbot.util.ExcelUtils;
 import com.diagbot.util.ListUtil;
-import com.diagbot.util.ReflectUtil;
-import com.diagbot.util.StringUtil;
 import com.diagbot.util.UserUtils;
 import com.diagbot.vo.KlDrugMappingGetVO;
 import com.diagbot.vo.KlDrugRegisterDelVO;
@@ -38,9 +34,6 @@ import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Component;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.io.InputStream;
-import java.lang.reflect.Field;
-import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -207,62 +200,53 @@ public class KlDrugRegisterFacade extends KlDrugRegisterServiceImpl {
      * 注册药品导入
      *
      * @param file
+     * @return
      */
     public Map importRegister(MultipartFile file) {
         Map res = new LinkedMap();
+        Long t1 = System.currentTimeMillis();
+        List<KlDrugRegisterTestVO> list = XLSXCovertCSVReader.readData(file, "注册药品",
+                30, KlDrugRegisterTestVO.class);
+        // List<KlDrugRegisterTestVO> list = ExcelBigUtil.readData(file, null, 0, KlDrugRegisterTestVO.class);
+        Long t2 = System.currentTimeMillis();
+        res.put("读取sheet耗时:", (t2 - t1) / 1000.0 + "秒");
         try {
-            InputStream inputStream = file.getInputStream();
-            List<String[]> list = XLSXCovertCSVReader.readerExcel(inputStream,
-                    "注册药品", 100);
-            for (String[] arr : list) {
-                for (int i = 0; i < arr.length; i++) {
-                    arr[i] = getObject(arr[i]);
-                }
-            }
-            List<KlDrugRegister> drugRegisterList = Lists.newLinkedList();
-            int i = 0;
-
             List<KlConcept> klConceptList = klConceptFacade.list(new QueryWrapper<KlConcept>()
                     .eq("is_deleted", IsDeleteEnum.N.getKey()).eq("lib_type", 101));
             Map<String, Long> druMap = klConceptList.stream().collect(Collectors.toMap(k -> k.getLibName(), v -> v.getId(), (r1, r2) -> (r2)));
-
             List<String> errMsg = Lists.newArrayList();
-            for (String[] record : list) {
-                // System.out.println(i);
-                if (i++ == 0) {
-                    continue;
-                }
+            List<KlDrugRegister> drugRegisterList = Lists.newLinkedList();
+            int i = 2;
+            for (KlDrugRegisterTestVO  klDrugRegisterTestVO : list) {
                 KlDrugRegister klDrugRegister = new KlDrugRegister();
-                klDrugRegister.setDrugCode(getObject(record[0])); // 药品代码
-                klDrugRegister.setName(getObject(record[1])); // 注册名称
-                klDrugRegister.setTradeName(getObject(record[2])); // 商品名称
-                klDrugRegister.setForm(getObject(record[3])); // 注册剂型
-                klDrugRegister.setSpecification(getObject(record[4])); // 注册规格
-                klDrugRegister.setMinPackQuantity(getObject(record[5])); // 最小包装数量
-                klDrugRegister.setMinPackUnit(getObject(record[6])); // 最小包装单位
-                klDrugRegister.setCompany(getObject(record[7])); // 药品企业
-                klDrugRegister.setApproval(getObject(record[8])); // 批准文号
-                klDrugRegister.setStandardCode(getObject(record[9])); // 药品本位码
-                klDrugRegister.setInsuranceType(getObject(record[10])); // 甲乙类
-                klDrugRegister.setInsuranceRemrk(getObject(record[11])); // 医保备注
-                klDrugRegister.setRemark(getObject(record[12]));// 药品通用名
-                klDrugRegister.setEnName(getObject(record[13])); // 英文名称
-                klDrugRegister.setDrugType(getObject(record[14])); // 药品类别
+                BeanUtil.copyProperties(klDrugRegisterTestVO, klDrugRegister);
+                String drugName = klDrugRegisterTestVO.getDrugName();
+                klDrugRegister.setRemark(drugName);
                 drugRegisterList.add(klDrugRegister);
-
-                String drugName = getObject(record[12]);
-                if (StringUtil.isBlank(drugName)) {
-                    errMsg.add(String.format("第%s行药品通用名为空", i));
-                } else if (druMap.get(drugName) == null) {
-                    errMsg.add(String.format("第%s行【%s】不是标准词", i, drugName));
+                if (druMap.get(drugName) == null) {
+                    errMsg.add(drugName);
                 }
+                // if (StringUtil.isBlank(drugName)) {
+                //     errMsg.add(String.format("第%s行药品通用名为空", i));
+                // } else if (druMap.get(drugName) == null) {
+                //     errMsg.add(String.format("第%s行【%s】不是标准词", i, drugName));
+                // }
+                i++;
             }
             if (ListUtil.isNotEmpty(errMsg)) {
+                errMsg = errMsg.stream().distinct().collect(Collectors.toList());
+                for (String s : errMsg) {
+                    System.out.println(s);
+                }
                 res.put("错误", StringUtils.join(errMsg, ";"));
                 return res;
             }
             this.remove(new QueryWrapper<KlDrugRegister>()); // 删除主表
+            Long t3 = System.currentTimeMillis();
             klDrugRegisterService.saveBatch(drugRegisterList);
+            Long t4 = System.currentTimeMillis();
+            res.put("保存DrugRegister表耗时:", (t4 - t3) / 1000.0 + "秒");
+
             List<KlDrugMapping> klDrugMappingList = ListUtil.newArrayList();
             for (KlDrugRegister klDrugRegister : drugRegisterList) {
                 KlDrugMapping klDrugMapping = new KlDrugMapping();
@@ -271,128 +255,19 @@ public class KlDrugRegisterFacade extends KlDrugRegisterServiceImpl {
                 klDrugMappingList.add(klDrugMapping);
             }
             klDrugMappingService.remove(new QueryWrapper<KlDrugMapping>());
+            Long t5 = System.currentTimeMillis();
             klDrugMappingService.saveBatch(klDrugMappingList);
-
+            Long t6 = System.currentTimeMillis();
+            res.put("保存mapping表耗时:", (t6 - t5) / 1000.0 + "秒");
         } catch (Exception e) {
             e.printStackTrace();
         }
+        Long end = System.currentTimeMillis();
+        res.put("总耗时:", (end - t1) / 1000.0 + "秒");
         return res;
     }
 
-    public static String getObject(String s) {
-        if (StringUtil.isBlank(s)) {
-            return s;
-        }
-        if (!s.startsWith("\"")) {
-            return s;
-        }
-        if (s.startsWith("\"")) {
-            s = s.substring(1);
-        }
-
-        if (s.endsWith("\"")) {
-            s = s.substring(0, s.length() -1);
-        }
-        return s;
-    }
-
     public static void main(String[] args) {
-        String path = "D:\\newSVN\\2020新版CDSS\\05.其他资料\\数据\\其他数据\\【注册药品导入模板】 - 副本 - 副本.xlsx";
-
-        List<KlDrugRegisterTestVO> list1 = ExcelUtils.importExcel(path, 0, 1, KlDrugRegisterTestVO.class);
-        List<KlDrugRegisterTestVO> list = refExcel(KlDrugRegisterTestVO.class);
-        System.out.println(list);
-    }
 
-    public static <T> List<T> refExcel(Class<T> c) {
-        KlDrugRegisterTestVO klDrugRegisterTestVO = new KlDrugRegisterTestVO();
-        List<T> res = Lists.newArrayList();
-        try {
-            String path = "D:\\newSVN\\2020新版CDSS\\05.其他资料\\数据\\其他数据\\【注册药品导入模板】 - 副本 - 副本.xlsx";
-            List<String[]> list = XLSXCovertCSVReader.readerExcel(path,
-                    "注册药品", 20);
-
-            if (ListUtil.isEmpty(list)) {
-                throw new RuntimeException("无数据");
-            }
-
-            String[] titleRow = list.get(0);
-            Map<Integer, String> colMap = new LinkedMap();
-            for (int i = 0; i < titleRow.length; i++) {
-                if (StringUtil.isBlank(titleRow[i])) {
-                    break;
-                }
-                colMap.put(i, getObject(titleRow[i]));
-            }
-            System.out.println(colMap);
-
-            Field[] fields = c.getDeclaredFields();
-            // 属性和表格列对应
-            Map<String, Map<String, String>> classMap = new LinkedHashMap();
-            for (Field field : fields) {
-                if (field.isAnnotationPresent(Ex.class)) {
-                    Ex annotation = field.getAnnotation(Ex.class);
-                    Map<String, String> propertyMap = new LinkedHashMap<>();
-                    propertyMap.put("field", field.getName());
-                    propertyMap.put("convertType", field.getGenericType().toString());
-                    classMap.put(annotation.name(), propertyMap);
-                }
-                field.getClass();
-            }
-            System.out.println(classMap);
-
-            int rowNum = 1;
-            for (String[] row : list) {
-                if (rowNum++ == 1) {
-                    continue;
-                }
-                T obj = c.newInstance();
-                for (int i = 0; i < row.length; i++) {
-                    if (classMap.get(colMap.get(i)) == null) {
-                        continue;
-                    }
-                    String property = classMap.get(colMap.get(i)).get("field");
-                    String convertType = classMap.get(colMap.get(i)).get("convertType");
-                    System.out.println(property + ":" + row[i]);
-                    if (StringUtil.isNotBlank(property)) {
-                        Object value = convertValue(getObject(row[i]), convertType);
-                        if (value != null) {
-                            ReflectUtil.setFieldValue(obj, property, value);
-                        }
-                    }
-                }
-                res.add(obj);
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return res;
-    }
-
-    public static Object convertValue(String object, String convertType) {
-        if (object == null) {
-            return null;
-        }
-        switch (convertType) {
-            case "class java.lang.Integer":
-            case "int":
-                return Integer.parseInt(object);
-            case "class java.lang.Long":
-            case "long":
-                return Long.parseLong(object);
-            case "class java.lang.Float":
-            case "float":
-                return Float.parseFloat(object);
-            case "class java.lang.Double":
-            case "double":
-                return Double.parseDouble(object);
-            case "class java.lang.Boolean":
-            case "boolean":
-                return Boolean.parseBoolean(object);
-            case "class java.lang.String":
-                return object;
-            default:
-                return object;
-        }
     }
 }

+ 199 - 18
cdssman-service/src/main/java/com/diagbot/facade/XLSXCovertCSVReader.java

@@ -1,6 +1,11 @@
 package com.diagbot.facade;
 
-import com.alibaba.fastjson.JSONObject;
+import com.diagbot.entity.Ex;
+import com.diagbot.util.ListUtil;
+import com.diagbot.util.ReflectUtil;
+import com.diagbot.util.StringUtil;
+import com.google.common.collect.Lists;
+import org.apache.commons.collections4.map.LinkedMap;
 import org.apache.poi.hssf.usermodel.HSSFDateUtil;
 import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
 import org.apache.poi.openxml4j.opc.OPCPackage;
@@ -12,6 +17,7 @@ import org.apache.poi.xssf.eventusermodel.XSSFReader;
 import org.apache.poi.xssf.model.StylesTable;
 import org.apache.poi.xssf.usermodel.XSSFCellStyle;
 import org.apache.poi.xssf.usermodel.XSSFRichTextString;
+import org.springframework.web.multipart.MultipartFile;
 import org.xml.sax.Attributes;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
@@ -24,10 +30,13 @@ import javax.xml.parsers.SAXParserFactory;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.PrintStream;
+import java.lang.reflect.Field;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @description:
@@ -405,6 +414,13 @@ public class XLSXCovertCSVReader {
                 ++index;
             }
         }
+        if (ListUtil.isNotEmpty(list)) {
+            for (String[] arr : list) {
+                for (int i = 0; i < arr.length; i++) {
+                    arr[i] = getObject(arr[i]);
+                }
+            }
+        }
         return list;
     }
 
@@ -423,7 +439,7 @@ public class XLSXCovertCSVReader {
      * @throws OpenXML4JException
      * @throws IOException
      */
-    public static List<String[]> readerExcel(String path, String sheetName,
+    private static List<String[]> readerExcel(String path, String sheetName,
                                               int minColumns) throws IOException, OpenXML4JException,
             ParserConfigurationException, SAXException {
         OPCPackage p = OPCPackage.open(path, PackageAccess.READ);
@@ -434,7 +450,19 @@ public class XLSXCovertCSVReader {
         return list;
     }
 
-    public static List<String[]> readerExcel(InputStream inputStream, String sheetName,
+    /**
+     * 读取Excel
+     *
+     * @param inputStream
+     * @param sheetName
+     * @param minColumns
+     * @return
+     * @throws IOException
+     * @throws OpenXML4JException
+     * @throws ParserConfigurationException
+     * @throws SAXException
+     */
+    private static List<String[]> readerExcel(InputStream inputStream, String sheetName,
                                              int minColumns) throws IOException, OpenXML4JException,
             ParserConfigurationException, SAXException {
         OPCPackage p = OPCPackage.open(inputStream);
@@ -445,21 +473,174 @@ public class XLSXCovertCSVReader {
         return list;
     }
 
-    public static void main(String[] args) throws Exception {
-        String name = "\"注册\"";
-        System.out.println(name);
-        Object parse = JSONObject.parse(name);
-        System.out.println(parse);
-        // List<String[]> list = XLSXCovertCSVReader
-        //         .readerExcel(
-        //                 "D:\\newSVN\\2020新版CDSS\\05.其他资料\\数据\\其他数据\\【注册药品导入模板】 - 副本.xlsx",
-        //                 "注册药品", 100);
-        // for (String[] record : list) {
-        //     for (String cell : record) {
-        //         System.out.print(cell + "  ");
-        //     }
-        //     System.out.println();
-        // }
+    /**
+     * 去除前后的""
+     *
+     * @param s
+     * @return
+     */
+    public static String getObject(String s) {
+        if (StringUtil.isBlank(s)) {
+            return s;
+        }
+        if (s.startsWith("\"") && s.endsWith("\"")) {
+            s = s.substring(1, s.length() -1);
+        }
+        return s;
+    }
+
+    /**
+     * 读取数据
+     *
+     * @param path
+     * @param sheetName
+     * @param colNum
+     * @param c
+     * @return
+     */
+    public static <T> List<T> readData(String path, String sheetName, int colNum, Class<T> c) {
+        List<T> list = Lists.newArrayList();
+        try {
+            List<String[]> stringList = XLSXCovertCSVReader.readerExcel(path, sheetName, colNum);
+            return dealData(stringList, c);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return list;
     }
 
+    /**
+     * 读取数据
+     *
+     * @param file
+     * @param sheetName
+     * @param colNum
+     * @param c
+     * @return
+     */
+    public static <T> List<T> readData(MultipartFile file, String sheetName, int colNum, Class<T> c) {
+        List<T> list = Lists.newArrayList();
+        try {
+            List<String[]> stringList = XLSXCovertCSVReader.readerExcel(file.getInputStream(), sheetName, colNum);
+            return dealData(stringList, c);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return list;
+    }
+
+    /**
+     * 数据处理
+     *
+     * @param list
+     * @param c
+     * @param <T>
+     * @return
+     */
+    public static <T> List<T> dealData(List<String[]> list, Class<T> c) {
+        List<T> res = Lists.newArrayList();
+        try {
+            // 标题
+            String[] titleRow = list.get(0);
+            Map<Integer, String> colMap = new LinkedMap();
+            for (int i = 0; i < titleRow.length; i++) {
+                if (StringUtil.isBlank(titleRow[i])) {
+                    break;
+                }
+                colMap.put(i, titleRow[i]);
+            }
+            // System.out.println(colMap);
+
+            // 字段映射
+            Field[] fields = c.getDeclaredFields();
+            // 属性和表格列对应
+            Map<String, Map<String, String>> classMap = new LinkedHashMap();
+            for (Field field : fields) {
+                if (field.isAnnotationPresent(Ex.class)) {
+                    Ex annotation = field.getAnnotation(Ex.class);
+                    Map<String, String> propertyMap = new LinkedHashMap<>();
+                    propertyMap.put("field", field.getName());
+                    propertyMap.put("convertType", field.getGenericType().toString());
+                    classMap.put(annotation.name(), propertyMap);
+                }
+                field.getClass();
+            }
+            // System.out.println(classMap);
+
+            // 有效数据读取
+            int rowNum = 1;
+            for (String[] row : list) {
+                if (rowNum++ == 1) {
+                    continue;
+                }
+                T obj = c.newInstance();
+                for (int i = 0; i < row.length; i++) {
+                    if (classMap.get(colMap.get(i)) == null) {
+                        continue;
+                    }
+                    String property = classMap.get(colMap.get(i)).get("field");
+                    String convertType = classMap.get(colMap.get(i)).get("convertType");
+                    // System.out.println(property + ":" + row[i]);
+                    if (StringUtil.isNotBlank(property)) {
+                        Object value = convertValue(row[i], convertType);
+                        if (value != null) {
+                            ReflectUtil.setFieldValue(obj, property, value);
+                        }
+                    }
+                }
+                res.add(obj);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return res;
+    }
+
+    /**
+     * 根据反射转成不同的类型
+     *
+     * @param object
+     * @param convertType
+     * @return
+     */
+    public static Object convertValue(String object, String convertType) {
+        Object res = null;
+        if (object == null) {
+            return null;
+        }
+        try {
+            switch (convertType) {
+                case "class java.lang.Integer":
+                case "int":
+                    res = Integer.parseInt(object);
+                    break;
+                case "class java.lang.Long":
+                case "long":
+                    res = Long.parseLong(object);
+                    break;
+                case "class java.lang.Float":
+                case "float":
+                    res = Float.parseFloat(object);
+                    break;
+                case "class java.lang.Double":
+                case "double":
+                    res = Double.parseDouble(object);
+                    break;
+                case "class java.lang.Boolean":
+                case "boolean":
+                    res = Boolean.parseBoolean(object);
+                    break;
+                case "class java.lang.String":
+                    res = object;
+                    break;
+                default:
+                    res = object;
+                    break;
+            }
+        } catch (Exception e) {
+            // e.printStackTrace();
+            return null;
+        }
+        return res;
+    }
 }

+ 293 - 0
cdssman-service/src/main/java/com/diagbot/util/ExcelBigUtil.java

@@ -0,0 +1,293 @@
+package com.diagbot.util;
+
+import com.diagbot.entity.Ex;
+import com.diagbot.vo.KlDrugRegisterTestVO;
+import com.google.common.collect.Lists;
+import org.apache.commons.collections4.map.LinkedMap;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellType;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @description:
+ * @author: zhoutg
+ * @time: 2021/5/24 19:58
+ */
+public class ExcelBigUtil {
+
+    /**
+     * 读取数据
+     *
+     * @param file
+     * @param sheetName
+     * @param titleNo 标题所在行
+     * @param c
+     * @param <T>
+     * @return
+     */
+    public static <T> List<T> readData(MultipartFile file, String sheetName, int titleNo, Class<T> c) {
+        List<T> list = Lists.newArrayList();
+        try {
+            Sheet sheet = getSheet(file, sheetName);
+            List<String[]> stringList = getListData(sheet, titleNo);
+            return dealData(stringList, c);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return list;
+    }
+
+    /**
+     * 读取数据
+     *
+     * @param path
+     * @param sheetName
+     * @param titleNo
+     * @param c
+     * @param <T>
+     * @return
+     */
+    public static <T> List<T> readData(String path, String sheetName, int titleNo, Class<T> c) {
+        List<T> list = Lists.newArrayList();
+        try {
+            Sheet sheet = getSheet(path, sheetName);
+            List<String[]> stringList = getListData(sheet, titleNo);
+            return dealData(stringList, c);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return list;
+    }
+
+    /**
+     * 获取Sheet
+     *
+     * @param filePath
+     * @param sheetName
+     * @return
+     */
+    private static Sheet getSheet(String filePath, String sheetName) {
+        Sheet sheet = null;
+        FileInputStream fileInputStream = null;
+        try {
+            fileInputStream = new FileInputStream(filePath);
+            XSSFWorkbook sheets = new XSSFWorkbook(fileInputStream);
+            if (StringUtil.isBlank(sheetName)) {
+                sheet = sheets.getSheetAt(0);
+            } else {
+                sheet = sheets.getSheet(sheetName);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return sheet;
+    }
+
+    /**
+     * 获取Sheet
+     *
+     * @param file
+     * @param sheetName
+     * @return
+     */
+    private static Sheet getSheet(MultipartFile file, String sheetName) {
+        Sheet sheet = null;
+        try {
+            // XSSFWorkbook sheets = new XSSFWorkbook(file.getInputStream());
+            Workbook workbook = getWorkBook(file);
+            //获取sheet
+            if (StringUtil.isBlank(sheetName)) {
+                sheet = workbook.getSheetAt(0);
+            } else {
+                sheet = workbook.getSheet(sheetName);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return sheet;
+    }
+
+    /**
+     * 得到Workbook对象
+     * @param file
+     * @return
+     * @throws IOException
+     */
+    public static Workbook getWorkBook(MultipartFile file) throws IOException {
+        //这样写  excel 能兼容03和07
+        InputStream is = file.getInputStream();
+        Workbook hssfWorkbook = null;
+        try {
+            hssfWorkbook = new HSSFWorkbook(is);
+        } catch (Exception ex) {
+            is =file.getInputStream();
+            hssfWorkbook = new XSSFWorkbook(is);
+        }
+        return hssfWorkbook;
+    }
+
+    /**
+     * 将sheet数据放入List
+     *
+     * @param sheet
+     * @param title
+     * @return
+     */
+    private static List<String[]> getListData(Sheet sheet, Integer title) {
+        List<String[]> list = new ArrayList<>();
+        int colLength = sheet.getRow(title).getLastCellNum();
+        for (int j = title; j <= sheet.getLastRowNum(); j++) {
+            Row row = sheet.getRow(j);
+            if (row != null) { // 空行数据
+                String[] str = new String[colLength];
+                for (int i = 0; i < colLength; i++) {
+                    Cell cell = row.getCell(i);
+                    if (cell == null) {
+                        str[i] = null;
+                    } else {
+                        cell.setCellType(CellType.STRING);
+                        str[i] = cell.toString();
+                    }
+                }
+                list.add(str);
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 数据处理
+     *
+     * @param list
+     * @param c
+     * @param <T>
+     * @return
+     */
+    public static <T> List<T> dealData(List<String[]> list, Class<T> c) {
+        List<T> res = Lists.newArrayList();
+        try {
+            // 标题
+            String[] titleRow = list.get(0);
+            Map<Integer, String> colMap = new LinkedMap();
+            for (int i = 0; i < titleRow.length; i++) {
+                if (StringUtil.isBlank(titleRow[i])) {
+                    break;
+                }
+                colMap.put(i, titleRow[i]);
+            }
+            // System.out.println(colMap);
+
+            // 字段映射
+            Field[] fields = c.getDeclaredFields();
+            // 属性和表格列对应
+            Map<String, Map<String, String>> classMap = new LinkedHashMap();
+            for (Field field : fields) {
+                if (field.isAnnotationPresent(Ex.class)) {
+                    Ex annotation = field.getAnnotation(Ex.class);
+                    Map<String, String> propertyMap = new LinkedHashMap<>();
+                    propertyMap.put("field", field.getName());
+                    propertyMap.put("convertType", field.getGenericType().toString());
+                    classMap.put(annotation.name(), propertyMap);
+                }
+                field.getClass();
+            }
+            // System.out.println(classMap);
+
+            // 有效数据读取
+            int rowNum = 1;
+            for (String[] row : list) {
+                if (rowNum++ == 1) {
+                    continue;
+                }
+                T obj = c.newInstance();
+                for (int i = 0; i < row.length; i++) {
+                    if (classMap.get(colMap.get(i)) == null) {
+                        continue;
+                    }
+                    String property = classMap.get(colMap.get(i)).get("field");
+                    String convertType = classMap.get(colMap.get(i)).get("convertType");
+                    // System.out.println(property + ":" + row[i]);
+                    if (StringUtil.isNotBlank(property)) {
+                        Object value = convertValue(row[i], convertType);
+                        if (value != null) {
+                            ReflectUtil.setFieldValue(obj, property, value);
+                        }
+                    }
+                }
+                res.add(obj);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return res;
+    }
+
+    /**
+     * 根据反射转成不同的类型
+     *
+     * @param object
+     * @param convertType
+     * @return
+     */
+    public static Object convertValue(String object, String convertType) {
+        Object res = null;
+        if (object == null) {
+            return null;
+        }
+        try {
+            switch (convertType) {
+                case "class java.lang.Integer":
+                case "int":
+                    res = Integer.parseInt(object);
+                    break;
+                case "class java.lang.Long":
+                case "long":
+                    res = Long.parseLong(object);
+                    break;
+                case "class java.lang.Float":
+                case "float":
+                    res = Float.parseFloat(object);
+                    break;
+                case "class java.lang.Double":
+                case "double":
+                    res = Double.parseDouble(object);
+                    break;
+                case "class java.lang.Boolean":
+                case "boolean":
+                    res = Boolean.parseBoolean(object);
+                    break;
+                case "class java.lang.String":
+                    res = object;
+                    break;
+                default:
+                    res = object;
+                    break;
+            }
+        } catch (Exception e) {
+            // e.printStackTrace();
+            return null;
+        }
+        return res;
+    }
+
+    public static void main(String[] args) {
+        String path = "D:\\newSVN\\2020新版CDSS\\05.其他资料\\数据\\其他数据\\【注册药品导入模板】 - 副本.xlsx";
+        List<KlDrugRegisterTestVO> klDrugRegisterTestVOList = readData(path, null, 0, KlDrugRegisterTestVO.class);
+        System.out.println(klDrugRegisterTestVOList);
+    }
+}
+

+ 18 - 0
cdssman-service/src/main/java/com/diagbot/vo/ImportVO.java

@@ -0,0 +1,18 @@
+package com.diagbot.vo;
+
+import lombok.Data;
+
+/**
+ * @Description:
+ * @Author:zhoutg
+ * @time: 2020/8/24 17:23
+ */
+@Data
+public class ImportVO {
+
+    // sheet名称
+    private String sheetName;
+    // 列数量
+    private Integer colNum  = 0;
+
+}

+ 10 - 0
cdssman-service/src/main/java/com/diagbot/vo/KlDiseaseVO.java

@@ -125,6 +125,16 @@ public class KlDiseaseVO implements Serializable {
      */
     private String enName;
 
+    /**
+     * 肿瘤细胞类型
+     */
+    private String tumorCellType;
+
+    /**
+     * 形态学分类代码
+     */
+    private String morphology;
+
     /**
      * 备注
      */

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

@@ -40,7 +40,7 @@ public class KlDrugRegisterTestVO implements Serializable {
 
     @Ex(name="最小包装数量")
     @Excel(name="最小包装数量")
-    private Integer minPackQuantity;
+    private String minPackQuantity;
 
     @Ex(name="最小包装单位")
     private String minPackUnit;

+ 4 - 0
cdssman-service/src/main/java/com/diagbot/web/KlConceptController.java

@@ -53,6 +53,7 @@ public class KlConceptController {
     public RespDTO<KlConceptAllDTO> getConceptInfoAll(@RequestBody @Valid KlConceptAllVO klConceptAllVO) {
         return RespDTO.onSuc(klConceptFacade.getConceptAlls(klConceptAllVO));
     }
+
     @ApiOperation(value = "新增和修改基础术语详情[by:wangfeng]",
             notes = "conceptId:术语Id\n" +
                     "libId:libId\n" +
@@ -89,6 +90,8 @@ public class KlConceptController {
                     "enNameSimple:英文简称\n" +
                     "enName:英文名称\n" +
                     "remark:备注\n" +
+                    "tumorCellType:肿瘤细胞类型\n" +
+                    "morphology:形态学分类代码\n" +
                     "deptList:科室列表\n" +
                     "partList:部位列表\n" +
                     "systemTypeList:疾病系统分类列表\n" +
@@ -166,6 +169,7 @@ public class KlConceptController {
     public RespDTO<Boolean> saveConceptInfos(@RequestBody @Valid KlConceptSaveVO klConceptSaveVO) {
         return RespDTO.onSuc(klConceptFacade.saveConceptInfo(klConceptSaveVO));
     }
+
     @ApiOperation(value = "删除同义词[by:wangfeng]")
     @PostMapping("/clearConceptInfo")
     @SysLogger("clearConceptInfo")

+ 2 - 0
cdssman-service/src/main/resources/mapper/KlDiseaseMapper.xml

@@ -33,6 +33,8 @@
         <result column="name_simple" property="nameSimple" />
         <result column="en_name_simple" property="enNameSimple" />
         <result column="en_name" property="enName" />
+        <result column="morphology" property="morphology" />
+        <result column="tumor_cell_type" property="tumorCellType" />
         <result column="remark" property="remark" />
     </resultMap>
 

+ 1 - 1
config-server/src/main/resources/shared/aipt-service-pro.yml

@@ -99,7 +99,7 @@ io.github.lvyahui8.spring.base-packages: com.diagbot.aggregate
 
 ai:
   server:
-    address: http://192.168.2.123:5008
+    address: http://192.168.2.122:5008
 
 nlp:
   server:

+ 2 - 4
docs/041.20210511知识库扩展/knowledgeExt_init.sql

@@ -4,16 +4,14 @@ INSERT INTO `cdss`.`sys_dictionary_info` (`id`, `is_deleted`, `gmt_create`, `gmt
 
 use `med_2021`;
 
-INSERT INTO `kl_lexicon` (`id`, `is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `name`, `code`, `is_has_common`, `only_one`, `can_change`, `remark`) VALUES ('45', 'N', '1970-01-01 12:00:00', '1970-01-01 12:00:00', '0', '0', '疾病系统分类', '411', '0', '0', '0', '');
-INSERT INTO `kl_lexicon` (`id`, `is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `name`, `code`, `is_has_common`, `only_one`, `can_change`, `remark`) VALUES ('46', 'N', '1970-01-01 12:00:00', '1970-01-01 12:00:00', '0', '0', '性质', '412', '0', '0', '0', '');
-
 INSERT INTO `kl_lexicon_relationship` (`id`, `is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `name`, `code`, `remark`) VALUES ('12', 'N', '1970-01-01 12:00:00', '1970-01-01 12:00:00', '0', '0', '关联科室', '511', '');
 INSERT INTO `kl_lexicon_relationship` (`id`, `is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `name`, `code`, `remark`) VALUES ('13', 'N', '1970-01-01 12:00:00', '1970-01-01 12:00:00', '0', '0', '关联部位', '512', '');
 INSERT INTO `kl_lexicon_relationship` (`id`, `is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `name`, `code`, `remark`) VALUES ('14', 'N', '1970-01-01 12:00:00', '1970-01-01 12:00:00', '0', '0', '关联系统分类', '513', '');
 INSERT INTO `kl_lexicon_relationship` (`id`, `is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `name`, `code`, `remark`) VALUES ('15', 'N', '1970-01-01 12:00:00', '1970-01-01 12:00:00', '0', '0', '关联伴随症状', '514', '');
 INSERT INTO `kl_lexicon_relationship` (`id`, `is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `name`, `code`, `remark`) VALUES ('16', 'N', '1970-01-01 12:00:00', '1970-01-01 12:00:00', '0', '0', '关联性质', '515', '');
 
-
+ALTER TABLE `kl_disease` add COLUMN `tumor_cell_type` varchar(255) not null DEFAULT '' COMMENT '肿瘤细胞类型' AFTER `icd10_code`;
+ALTER TABLE `kl_disease` add COLUMN `morphology` varchar(255) not null DEFAULT '' COMMENT '形态学分类代码' AFTER `icd10_code`;
 ALTER TABLE `kl_disease` add COLUMN `en_name` varchar(255) not null DEFAULT '' COMMENT '英文名称' AFTER `icd10_code`;
 ALTER TABLE `kl_disease` add COLUMN `en_name_simple` varchar(255) not null DEFAULT '' COMMENT '英文简称' AFTER `icd10_code`;
 ALTER TABLE `kl_disease` add COLUMN `name_simple` varchar(255) not null DEFAULT '' COMMENT '简称' AFTER `icd10_code`;