فهرست منبع

change:知识库增加医院项目编码去重

Scott 2 سال پیش
والد
کامیت
3ea10ae038

+ 115 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/common/ExcelImportUtilService.java

@@ -5,10 +5,13 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.system.util.JwtUtil;
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.modules.medical.common.interfaces.BiFunction;
+import org.jeecg.modules.medical.entity.MaterialItems;
 import org.jeecg.modules.medical.entity.MedicalInsuranceDrugs;
+import org.jeecg.modules.utils.DefaultExcelImportUtil;
 import org.jeecgframework.poi.excel.ExcelImportUtil;
 import org.jeecgframework.poi.excel.def.NormalExcelConstants;
 import org.jeecgframework.poi.excel.entity.ExportParams;
@@ -44,6 +47,117 @@ public class ExcelImportUtilService<T extends Serializable, R extends Comparable
 
     @Value("${jeecg.path.upload}")
     private String upLoadPath;
+
+
+    /**
+     * 文件导入更为详细的返回结果
+     * @param req           HttpRequest
+     * @param clazz         导入文件对应实体类
+     * @param requiredCheck 必填数据校验
+     * @param fileDuplication   是否对文件先进行一次查重(防止上传上来的文件本身有重复)
+     * @param duplicateRm       构建查重条件
+     * @param dbExistsListService   从数据库获取已存在的数据
+     * @param fillUpdateField   如果导入文件在库中已存在,则需要填入的更新字段方法
+     * @param updateService 更新服务
+     * @param insertService 新增服务
+     * @return  返回导入结果
+     */
+    @Transactional(readOnly = false)
+    public Result<?> importExcel2(HttpServletRequest req, Class<T> clazz,
+                                  BiFunction<List<T>, ?> requiredCheck,
+                                  boolean fileDuplication,
+                                  Function<T, R> duplicateRm,
+                                  BiFunction<List<T>, List<T>> dbExistsListService,
+                                  com.alibaba.fastjson.util.BiFunction<T,T,T> fillUpdateField,
+                                  com.alibaba.fastjson.util.BiFunction<List<T>, Integer,Boolean> updateService,
+                                  com.alibaba.fastjson.util.BiFunction<List<T>, Integer,Boolean> insertService){
+        Integer rmDuplicateNumber = 0; // excel文件重复数量
+        int totalNumber = 0;//导入文件总数
+        int addNumber = 0; //新增数量
+        int updateNumber = 0;//更新文件数量
+
+        String username = "";
+        try {
+            username = JwtUtil.getUsername(req.getHeader("X-Access-Token"));
+        } catch (Exception e) {
+            log.error("找不到用户登录的tokne");
+        }
+        final String finalUsername = username;
+
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) req;
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+            // 获取上传文件对象
+            MultipartFile file = entity.getValue();
+            ImportParams params = new ImportParams();
+            params.setTitleRows(2);
+            params.setHeadRows(1);
+            params.setNeedSave(true);
+            try {
+                List<T> list = DefaultExcelImportUtil
+                        .importExcel(file.getInputStream(), clazz, params);
+                if (CollectionUtils.isEmpty(list)) {
+                    log.error("导入文件没有数据,请检查");
+                    return Result.ok("上传的文件没有数据,请检查");
+                }
+                totalNumber = list.size();
+                // 检查导入必填数据
+                requiredCheck.apply(list);
+                if (fileDuplication) {
+                    // 倒序去重
+                    List<T> collect = list.stream().map(item -> item).collect(Collectors.toList());
+                    Collections.reverse(collect);
+                    list = collect.stream().collect(
+                            Collectors.collectingAndThen(
+                                    Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(
+                                            duplicateRm
+                                    ))), ArrayList::new
+                            )
+                    );
+                    // 随后把顺序倒回来
+                    Collections.reverse(list);
+                    // 文件总条数 - 去重之后剩余数量 = excel 文件的重复数据
+                    if (!CollectionUtils.isEmpty(list)) {
+                        rmDuplicateNumber = totalNumber - list.size();
+                    }
+                } else {
+                    rmDuplicateNumber = 0;
+                }
+                // 根据条件,查询数据库去重。
+//                List<MaterialItems> dbExistsList = this.loadDbExistsList(list);
+                List<T> dbExistsList = dbExistsListService.apply(list);
+                // 更新列表
+                List<T> updateList = new ArrayList<>();
+                // 新增列表
+                List<T> instalList = list;
+                if (!CollectionUtils.isEmpty(dbExistsList)) { // 不为空时, 需要将存在的做更新操作
+                    // 取出交集
+                    updateList = this.getUpdateDatas(list, dbExistsList,
+                            duplicateRm,
+                            fillUpdateField);//
+                    // 如果有则需要更新
+                    if (!CollectionUtils.isEmpty(updateList)) {
+                        updateNumber = updateList.size();
+                        updateService.apply(updateList, 500);
+                    }
+                    // 取出差集
+                    instalList = getInsertDatas(list, dbExistsList, duplicateRm);
+                }
+                long start = System.currentTimeMillis();
+                if (!CollectionUtils.isEmpty(instalList)) {
+                    addNumber = instalList.size();
+                    insertService.apply(instalList, 500);
+                }
+                log.info("消耗时间" + (System.currentTimeMillis() - start) + "毫秒");
+                //update-end-author:taoyan date:20190528 for:批量插入数据
+                return Result.ok("文件导入成功,请点击刷新!文件总行数:" + totalNumber + "; 文件自身重复:" + rmDuplicateNumber + "; 新增行数: " + addNumber + "; 更新行数: " + updateNumber);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        }
+        return null;
+    }
+
     /**
      *
      * @param request
@@ -55,6 +169,7 @@ public class ExcelImportUtilService<T extends Serializable, R extends Comparable
      * @param insertService 新增服务
      * @return
      */
+    @Deprecated
     @Transactional(readOnly = false)
     public Result<?> importExcel(HttpServletRequest request,
                                  Class<T> clazz, Function<T, R> duplicateRm,
@@ -200,6 +315,5 @@ public class ExcelImportUtilService<T extends Serializable, R extends Comparable
         mv.addObject(NormalExcelConstants.PARAMS,exportParams);
         mv.addObject(NormalExcelConstants.DATA_LIST, exportList);
         return mv;
-
     }
 }

+ 2 - 2
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/controller/MaterialItemsController.java

@@ -24,12 +24,12 @@ import java.io.UnsupportedEncodingException;
 import java.util.Arrays;
 
  /**
- * @Description: material_items
+ * @Description: 医保耗材目录api
  * @Author: jeecg-boot
  * @Date:   2023-04-23
  * @Version: V1.0
  */
-@Api(tags="material_items")
+@Api(tags="医保耗材目录api")
 @RestController
 @RequestMapping("/medical/materialItems")
 @Slf4j

+ 14 - 5
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/controller/MedicalInsuranceDrugsController.java

@@ -12,7 +12,9 @@ import javax.servlet.http.HttpServletResponse;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.medical.entity.MaterialItems;
 import org.jeecg.modules.medical.entity.MedicalInsuranceDrugs;
+import org.jeecg.modules.medical.service.DefaultExcelSupportChineseService;
 import org.jeecg.modules.medical.service.IMedicalInsuranceDrugsService;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -38,18 +40,20 @@ import org.jeecg.common.aspect.annotation.AutoLog;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 
  /**
- * @Description: medical_insurance_drugs
+ * @Description: 医保药品目录
  * @Author: jeecg-boot
  * @Date:   2023-04-23
  * @Version: V1.0
  */
-@Api(tags="medical_insurance_drugs")
+@Api(tags="医保药品目录api")
 @RestController
 @RequestMapping("/medical/medicalInsuranceDrugs")
 @Slf4j
 public class MedicalInsuranceDrugsController extends JeecgController<MedicalInsuranceDrugs, IMedicalInsuranceDrugsService> {
 	@Autowired
 	private IMedicalInsuranceDrugsService medicalInsuranceDrugsService;
+	 @Autowired
+	 private DefaultExcelSupportChineseService<MedicalInsuranceDrugs> excelSupportChineseService;
 
 	/**
 	 * 分页列表查询
@@ -158,8 +162,14 @@ public class MedicalInsuranceDrugsController extends JeecgController<MedicalInsu
 //    @RequiresPermissions("medical:medical_insurance_drugs:exportXls")
     @RequestMapping(value = "/exportXls")
     public ModelAndView exportXls(HttpServletRequest request, MedicalInsuranceDrugs medicalInsuranceDrugs) {
-        return super.exportXlsEmpty(request, medicalInsuranceDrugs, MedicalInsuranceDrugs.class, "medical_insurance_drugs");
-    }
+//        return super.exportXlsEmpty(request, medicalInsuranceDrugs, MedicalInsuranceDrugs.class, "medical_insurance_drugs");
+		try{
+			return excelSupportChineseService.exportXlsEmpty(request, medicalInsuranceDrugs, MedicalInsuranceDrugs.class, "医保药品目录");
+		} catch (
+				UnsupportedEncodingException e) {
+			throw new RuntimeException(e);
+		}
+	}
 
     /**
       * 通过excel导入数据
@@ -172,7 +182,6 @@ public class MedicalInsuranceDrugsController extends JeecgController<MedicalInsu
     @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
     public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
 		return medicalInsuranceDrugsService.importExcel(request, response);
-//        return super.importExcel(request, response, MedicalInsuranceDrugs.class);
     }
 
 }

+ 13 - 3
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/controller/TreatmentItemsController.java

@@ -12,7 +12,9 @@ import javax.servlet.http.HttpServletResponse;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.medical.entity.MaterialItems;
 import org.jeecg.modules.medical.entity.TreatmentItems;
+import org.jeecg.modules.medical.service.DefaultExcelSupportChineseService;
 import org.jeecg.modules.medical.service.ITreatmentItemsService;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -38,18 +40,20 @@ import org.jeecg.common.aspect.annotation.AutoLog;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 
  /**
- * @Description: treatment_items
+ * @Description: 医保诊疗项目目录api
  * @Author: jeecg-boot
  * @Date:   2023-04-23
  * @Version: V1.0
  */
-@Api(tags="treatment_items")
+@Api(tags="医保诊疗项目目录-api")
 @RestController
 @RequestMapping("/medical/treatmentItems")
 @Slf4j
 public class TreatmentItemsController extends JeecgController<TreatmentItems, ITreatmentItemsService> {
 	@Autowired
 	private ITreatmentItemsService treatmentItemsService;
+	@Autowired
+	private DefaultExcelSupportChineseService<TreatmentItems> excelSupportChineseService;
 
 	/**
 	 * 分页列表查询
@@ -154,7 +158,13 @@ public class TreatmentItemsController extends JeecgController<TreatmentItems, IT
     */
     @RequestMapping(value = "/exportXls")
     public ModelAndView exportXls(HttpServletRequest request, TreatmentItems treatmentItems) {
-        return super.exportXlsEmpty(request, treatmentItems, TreatmentItems.class, "treatment_items");
+//        return super.exportXlsEmpty(request, treatmentItems, TreatmentItems.class, "treatment_items");
+		try{
+			return excelSupportChineseService.exportXlsEmpty(request, treatmentItems, TreatmentItems.class, "医保诊疗项目目录");
+		} catch (
+				UnsupportedEncodingException e) {
+			throw new RuntimeException(e);
+		}
     }
 
     /**

+ 1 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/TreatmentItems.java

@@ -32,7 +32,7 @@ import lombok.experimental.Accessors;
 public class TreatmentItems implements Serializable {
     private static final long serialVersionUID = 1L;
 
-    @TableId(type = IdType.AUTO)
+    @TableId(type = IdType.ASSIGN_ID)
     @ApiModelProperty(value = "主键")
     private String id;
 

+ 7 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/service/IMedicalInsuranceDrugsService.java

@@ -4,6 +4,7 @@ import org.jeecg.common.api.vo.Result;
 import org.jeecg.modules.medical.entity.AdviceDetailsVO;
 import org.jeecg.modules.medical.entity.MedicalInsuranceDrugs;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.springframework.util.StringUtils;
 import org.springframework.web.servlet.ModelAndView;
 
 import javax.servlet.http.HttpServletRequest;
@@ -19,6 +20,12 @@ import java.util.List;
  */
 public interface IMedicalInsuranceDrugsService extends IService<MedicalInsuranceDrugs> {
 
+    default String ifnull(String str) {
+        if (StringUtils.hasText(str)) {
+            return str;
+        }
+        return "";
+    }
     /**
      * 按照模板导入
      * @param request

+ 7 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/service/ITreatmentItemsService.java

@@ -4,6 +4,7 @@ import org.jeecg.common.api.vo.Result;
 import org.jeecg.modules.medical.entity.AdviceDetailsVO;
 import org.jeecg.modules.medical.entity.TreatmentItems;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.springframework.util.StringUtils;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -16,6 +17,12 @@ import javax.servlet.http.HttpServletResponse;
  */
 public interface ITreatmentItemsService extends IService<TreatmentItems> {
 
+    default String ifnull(String str) {
+        if (StringUtils.hasText(str)) {
+            return str;
+        }
+        return "";
+    }
     Result<?> importExcel(HttpServletRequest request, HttpServletResponse response);
 
     TreatmentItems saveTreatmentItems(AdviceDetailsVO adviceDetailsVO);

+ 68 - 80
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/service/impl/MedicalInsuranceDrugsServiceImpl.java

@@ -2,24 +2,30 @@ package org.jeecg.modules.medical.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang.StringUtils;
 import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.exception.JeecgBootException;
 import org.jeecg.common.system.util.JwtUtil;
+import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.modules.medical.common.ExcelImportUtilService;
 import org.jeecg.modules.medical.entity.AdviceDetailsVO;
+import org.jeecg.modules.medical.entity.MaterialItems;
 import org.jeecg.modules.medical.entity.MedicalInsuranceDrugs;
 import org.jeecg.modules.medical.mapper.MedicalInsuranceDrugsMapper;
 import org.jeecg.modules.medical.service.IMedicalInsuranceDrugsService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -50,7 +56,24 @@ public class MedicalInsuranceDrugsServiceImpl extends ServiceImpl<MedicalInsuran
             log.error("找不到用户登录的tokne");
         }
         final String finalUsername = username;
-        return excelImportUtilService.importExcel(request,
+
+        return excelImportUtilService.importExcel2(request,
+                MedicalInsuranceDrugs.class,
+                this::requiredCheck,
+                true,
+                this::getDuplicateRm,
+                this::loadDbExistsList,
+                (nd, od) -> {
+                    nd.setId(od.getId());
+                    nd.setUpdateBy(finalUsername); //更新人
+                    nd.setUpdateTime(new Date());
+                    return nd;
+                },
+                // 根据导入数据,和数据库中的数据,取出差集 用于新增
+                this::updateBatchById,
+                this::saveBatch
+        );
+        /*return excelImportUtilService.importExcel(request,
                 MedicalInsuranceDrugs.class,
                 // 根据什么字段去重,以及筛选哪些数据已经有了的依据
                 MedicalInsuranceDrugs::getMedicineCode,
@@ -69,92 +92,57 @@ public class MedicalInsuranceDrugsServiceImpl extends ServiceImpl<MedicalInsuran
                 // 根据导入数据,和数据库中的数据,取出差集 用于新增
                 this::updateBatchById,
                 this::saveBatch
-        );
-        /*if (1 == 1) {
-            return null;
+        );*/
+    }
+
+    /**
+     * 根据数据,查询数据库中是否有重复
+     * @param list
+     * @return
+     */
+    private List<MedicalInsuranceDrugs> loadDbExistsList(List<MedicalInsuranceDrugs> list) {
+        // 固定这两个字段,projectCode为必须,correlationProjectCode为可选
+        if (CollectionUtils.isEmpty(list)) {
+            return new ArrayList<>();
         }
-        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
-        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
-        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
-            // 获取上传文件对象
-            MultipartFile file = entity.getValue();
-            ImportParams params = new ImportParams();
-            params.setTitleRows(2);
-            params.setHeadRows(1);
-            params.setNeedSave(true);
-            try {
-                List<MedicalInsuranceDrugs> list = ExcelImportUtil.importExcel(file.getInputStream(), MedicalInsuranceDrugs.class, params);
-                if (CollectionUtils.isEmpty(list)) {
-                    return Result.error("文件导入失败:没有找到要导入的数据!");
-                }
-                if (list.size() > 10000) {
-                    return Result.error("文件导入失败:不可一次性导入超过10000条数据!");
-                }
-                // 去重
-                list = list.stream().collect(
-                        Collectors.collectingAndThen(
-                                Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(MedicalInsuranceDrugs::getMedicineCode))), ArrayList::new
-                        )
-                );
-                //检查是否有更新的数据,根据医保药品编码
-                List<String> collect = list.stream().map(MedicalInsuranceDrugs::getMedicineCode).collect(Collectors.toList());
-                List<MedicalInsuranceDrugs> dbExistsList = this.listByMedicineCodeIn(collect);
-                // 更新列表
-                List<MedicalInsuranceDrugs> updateList = new ArrayList<>();
-                // 新增列表
-                List<MedicalInsuranceDrugs> instalList = list;
-                if (!CollectionUtils.isEmpty(dbExistsList)) { // 不为空时, 需要将存在的做更新操作
-                    // 取出交集
-                    updateList = list.stream().filter(
-                            a -> dbExistsList.stream().map(MedicalInsuranceDrugs::getMedicineCode)
-                                    .anyMatch(
-                                            medicineCode -> ObjectUtils.nullSafeEquals(a.getMedicineCode(), medicineCode)
-                                    )
-                    ).collect(Collectors.toList());
-                    // 如果有则需要更新
-                    if (!CollectionUtils.isEmpty(updateList)) {
-                        this.updateBatchById(updateList, 500);
-                    }
-                    // 取出差集
-                    instalList = list.stream().filter(
-                            excelData -> dbExistsList.stream().map(MedicalInsuranceDrugs::getMedicineCode).noneMatch(medicineCode ->
-                                    ObjectUtils.nullSafeEquals(excelData.getMedicineCode(), medicineCode))
-                    ).collect(Collectors.toList());
-                }
-                //update-begin-author:taoyan date:20190528 for:批量插入数据
-                long start = System.currentTimeMillis();
-                if (!CollectionUtils.isEmpty(instalList)) {
-                    this.saveBatch(instalList, 500);
-                }
+        QueryWrapper<MedicalInsuranceDrugs> queryWrapper = new QueryWrapper<>();
+        List<String> itemIdHostKeys = new ArrayList<>();
+        for (MedicalInsuranceDrugs item : list) {
+            String itemIdHosp = item.getItemIdHosp();
+            if (!StringUtils.hasText(itemIdHosp)) {
+                log.error("数据导入时,没有找到{}请检查导入文件内容", "医保项目编码");
+                throw new JeecgBootException("没有找到项目编码,请检查导入内容");
+            }
+            itemIdHostKeys.add(itemIdHosp);
+        }
+        String itemIdHostSQLField = oConvertUtils.camelToUnderline("itemIdHosp");
+        queryWrapper.in(itemIdHostSQLField, itemIdHostKeys);
+        return this.list(queryWrapper);
+    }
 
-                //400条 saveBatch消耗时间1592毫秒  循环插入消耗时间1947毫秒
-                //1200条  saveBatch消耗时间3687毫秒 循环插入消耗时间5212毫秒
-                log.info("消耗时间" + (System.currentTimeMillis() - start) + "毫秒");
-                //update-end-author:taoyan date:20190528 for:批量插入数据
-                return Result.ok("文件导入成功!数据行数:" + list.size());
-            } catch (Exception e) {
-                //update-begin-author:taoyan date:20211124 for: 导入数据重复增加提示
-                String msg = e.getMessage();
-                log.error(msg, e);
-                if(msg!=null && msg.contains("Duplicate entry")){
-                    return Result.error("文件导入失败:有重复数据!");
-                }else{
-                    return Result.error("文件导入失败:" + e.getMessage());
-                }
-                //update-end-author:taoyan date:20211124 for: 导入数据重复增加提示
-            } finally {
-                try {
-                    file.getInputStream().close();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
+    // 构建去重因子
+    private String getDuplicateRm(MedicalInsuranceDrugs medicalInsuranceDrugs) {
+        return ifnull(medicalInsuranceDrugs.getItemIdHosp());
+    }
+
+
+    private Object requiredCheck(List<MedicalInsuranceDrugs> list) {
+        // 检查导入必填数据
+        for (MedicalInsuranceDrugs item : list) {
+            // 医院项目编码
+            String itemIdHosp = item.getItemIdHosp();
+            if (!StringUtils.hasText(itemIdHosp)) {
+                log.error("数据导入时,找不到医院项目编码,请检查");
+                throw new JeecgBootException("医院项目编码为空,医院项目编码必填,请检查!");
             }
-        }*/
+        }
+        return null;
     }
 
 
 
 
+
     /*@NotNull
     private static List<MedicalInsuranceDrugs> getUpdateDatas(final String updateOperator, List<MedicalInsuranceDrugs> list, List<MedicalInsuranceDrugs> dbExistsList) {
         List<MedicalInsuranceDrugs> collect = list.stream().filter(

+ 64 - 3
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/service/impl/TreatmentItemsServiceImpl.java

@@ -2,12 +2,14 @@ package org.jeecg.modules.medical.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang.StringUtils;
 import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.exception.JeecgBootException;
 import org.jeecg.common.system.util.JwtUtil;
+import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.modules.medical.common.ExcelImportUtilService;
 import org.jeecg.modules.medical.entity.AdviceDetailsVO;
 import org.jeecg.modules.medical.entity.MedicalInsuranceDrugs;
@@ -19,10 +21,12 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.ObjectUtils;
+import org.springframework.util.StringUtils;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Optional;
@@ -51,7 +55,26 @@ public class TreatmentItemsServiceImpl extends ServiceImpl<TreatmentItemsMapper,
             log.error("找不到用户登录的tokne");
         }
         final String finalUsername = username;
-        return excelImportUtilService.importExcel(request, TreatmentItems.class,
+
+        return excelImportUtilService.importExcel2(request,
+                TreatmentItems.class,
+                this::requiredCheck,
+                true,
+                this::getDuplicateRm,
+                this::loadDbExistsList,
+                (nd, od) -> {
+                    nd.setId(od.getId());
+                    nd.setUpdateBy(finalUsername); //更新人
+                    nd.setUpdateTime(new Date());
+                    return nd;
+                },
+                // 根据导入数据,和数据库中的数据,取出差集 用于新增
+                this::updateBatchById,
+                this::saveBatch
+        );
+
+
+        /*return excelImportUtilService.importExcel(request, TreatmentItems.class,
                 TreatmentItems::getItemId,
                 list -> {
                     List<String> collect = list.stream().map(TreatmentItems::getItemId).collect(Collectors.toList());
@@ -66,7 +89,45 @@ public class TreatmentItemsServiceImpl extends ServiceImpl<TreatmentItemsMapper,
                 },
                 this::updateBatchById,
                 this::saveBatch
-        );
+        );*/
+    }
+
+    private List<TreatmentItems> loadDbExistsList(List<TreatmentItems> list) {
+        // 固定这两个字段,projectCode为必须,correlationProjectCode为可选
+        if (CollectionUtils.isEmpty(list)) {
+            return new ArrayList<>();
+        }
+        QueryWrapper<TreatmentItems> queryWrapper = new QueryWrapper<>();
+        List<String> itemIdHostKeys = new ArrayList<>();
+        for (TreatmentItems item : list) {
+            String itemIdHosp = item.getItemIdHosp();
+            if (!StringUtils.hasText(itemIdHosp)) {
+                log.error("数据导入时,没有找到{}请检查导入文件内容", "医保项目编码");
+                throw new JeecgBootException("没有找到项目编码,请检查导入内容");
+            }
+            itemIdHostKeys.add(itemIdHosp);
+        }
+        String itemIdHostSQLField = oConvertUtils.camelToUnderline("itemIdHosp");
+        queryWrapper.in(itemIdHostSQLField, itemIdHostKeys);
+        return this.list(queryWrapper);
+    }
+
+    // 构建去重因子
+    private String getDuplicateRm(TreatmentItems treatmentItems) {
+        return ifnull(treatmentItems.getItemIdHosp());
+    }
+
+    private Object requiredCheck(List<TreatmentItems> list) {
+        // 检查导入必填数据
+        for (TreatmentItems item : list) {
+            // 医院项目编码
+            String itemIdHosp = item.getItemIdHosp();
+            if (!StringUtils.hasText(itemIdHosp)) {
+                log.error("数据导入时,找不到医院项目编码,请检查");
+                throw new JeecgBootException("医院项目编码为空,医院项目编码必填,请检查!");
+            }
+        }
+        return null;
     }
 
     @Override