瀏覽代碼

add: 在Excel导入时,添加自定义逻辑实现
perf: 添加医保诊疗和医保耗材页面以及导入规则的实现

Scott 2 年之前
父節點
當前提交
6e0f00008c

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

@@ -77,7 +77,7 @@ public class ExcelImportUtilService {
                                 ))), ArrayList::new
                         )
                 );
-                //检查是否有更新的数据,根据医保药品编码
+                //检查是否有更新的数据
                 List<T> dbExistsList = dbExistsListService.apply(list);
                 // 更新列表
                 List<T> updateList = new ArrayList<>();

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

@@ -1,41 +1,25 @@
 package org.jeecg.modules.medical.controller;
 
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import javax.servlet.http.HttpServletRequest;
-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.service.IMaterialItemsService;
-
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
-
-import org.jeecgframework.poi.excel.ExcelImportUtil;
-import org.jeecgframework.poi.excel.def.NormalExcelConstants;
-import org.jeecgframework.poi.excel.entity.ExportParams;
-import org.jeecgframework.poi.excel.entity.ImportParams;
-import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
 import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.modules.medical.entity.MaterialItems;
+import org.jeecg.modules.medical.service.IMaterialItemsService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-import org.springframework.web.multipart.MultipartHttpServletRequest;
 import org.springframework.web.servlet.ModelAndView;
-import com.alibaba.fastjson.JSON;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.jeecg.common.aspect.annotation.AutoLog;
-import org.apache.shiro.authz.annotation.RequiresPermissions;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Arrays;
 
  /**
  * @Description: material_items
@@ -50,7 +34,7 @@ import org.apache.shiro.authz.annotation.RequiresPermissions;
 public class MaterialItemsController extends JeecgController<MaterialItems, IMaterialItemsService> {
 	@Autowired
 	private IMaterialItemsService materialItemsService;
-	
+
 	/**
 	 * 分页列表查询
 	 *
@@ -72,7 +56,7 @@ public class MaterialItemsController extends JeecgController<MaterialItems, IMat
 		IPage<MaterialItems> pageList = materialItemsService.page(page, queryWrapper);
 		return Result.OK(pageList);
 	}
-	
+
 	/**
 	 *   添加
 	 *
@@ -87,7 +71,7 @@ public class MaterialItemsController extends JeecgController<MaterialItems, IMat
 		materialItemsService.save(materialItems);
 		return Result.OK("添加成功!");
 	}
-	
+
 	/**
 	 *  编辑
 	 *
@@ -102,7 +86,7 @@ public class MaterialItemsController extends JeecgController<MaterialItems, IMat
 		materialItemsService.updateById(materialItems);
 		return Result.OK("编辑成功!");
 	}
-	
+
 	/**
 	 *   通过id删除
 	 *
@@ -117,7 +101,7 @@ public class MaterialItemsController extends JeecgController<MaterialItems, IMat
 		materialItemsService.removeById(id);
 		return Result.OK("删除成功!");
 	}
-	
+
 	/**
 	 *  批量删除
 	 *
@@ -132,7 +116,7 @@ public class MaterialItemsController extends JeecgController<MaterialItems, IMat
 		this.materialItemsService.removeByIds(Arrays.asList(ids.split(",")));
 		return Result.OK("批量删除成功!");
 	}
-	
+
 	/**
 	 * 通过id查询
 	 *
@@ -156,7 +140,7 @@ public class MaterialItemsController extends JeecgController<MaterialItems, IMat
     * @param request
     * @param materialItems
     */
-    @RequiresPermissions("medical:material_items:exportXls")
+//    @RequiresPermissions("medical:material_items:exportXls")
     @RequestMapping(value = "/exportXls")
     public ModelAndView exportXls(HttpServletRequest request, MaterialItems materialItems) {
         return super.exportXls(request, materialItems, MaterialItems.class, "material_items");
@@ -169,10 +153,11 @@ public class MaterialItemsController extends JeecgController<MaterialItems, IMat
     * @param response
     * @return
     */
-    @RequiresPermissions("medical:material_items:importExcel")
+//    @RequiresPermissions("medical:material_items:importExcel")
     @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
     public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
-        return super.importExcel(request, response, MaterialItems.class);
+//        return super.importExcel(request, response, MaterialItems.class);
+		return materialItemsService.importExcel(request, response);
     }
 
 }

+ 21 - 18
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/MaterialItems.java

@@ -32,21 +32,24 @@ import lombok.experimental.Accessors;
 public class MaterialItems implements Serializable {
     private static final long serialVersionUID = 1L;
 
+    @TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "主键")
+    private String id;
 	/**医保项目编码;医保耗材目录编码*/
-	@Excel(name = "医保项目编码;医保耗材目录编码", width = 15)
-    @ApiModelProperty(value = "医保项目编码;医保耗材目录编码")
+	@Excel(name = "医保项目编码", width = 15)
+    @ApiModelProperty(value = "医保项目编码")
     private java.lang.String itemId;
 	/**医保项目名称;医保耗材目录名称*/
-	@Excel(name = "医保项目名称;医保耗材目录名称", width = 15)
-    @ApiModelProperty(value = "医保项目名称;医保耗材目录名称")
+	@Excel(name = "医保项目名称", width = 15)
+    @ApiModelProperty(value = "医保项目名称")
     private java.lang.String itemName;
 	/**医院项目编码;医嘱系统中项目的代码*/
-	@Excel(name = "医院项目编码;医嘱系统中项目的代码", width = 15)
-    @ApiModelProperty(value = "医院项目编码;医嘱系统中项目的代码")
+	@Excel(name = "医院项目编码", width = 15)
+    @ApiModelProperty(value = "医院项目编码")
     private java.lang.String itemIdHosp;
 	/**医院项目名称;医嘱系统中项目的名称*/
-	@Excel(name = "医院项目名称;医嘱系统中项目的名称", width = 15)
-    @ApiModelProperty(value = "医院项目名称;医嘱系统中项目的名称")
+	@Excel(name = "医院项目名称", width = 15)
+    @ApiModelProperty(value = "医院项目名称")
     private java.lang.String itemNameHosp;
 	/**医保项目内涵*/
 	@Excel(name = "医保项目内涵", width = 15)
@@ -57,8 +60,8 @@ public class MaterialItems implements Serializable {
     @ApiModelProperty(value = "医保目录除外内容")
     private java.lang.String excludedMedical;
 	/**支付类别;甲、乙、丙类别*/
-	@Excel(name = "支付类别;甲、乙、丙类别", width = 15)
-    @ApiModelProperty(value = "支付类别;甲、乙、丙类别")
+	@Excel(name = "支付类别", width = 15)
+    @ApiModelProperty(value = "支付类别")
     private java.lang.String pCategory;
 	/**自付比例*/
 	@Excel(name = "自付比例", width = 15)
@@ -69,16 +72,16 @@ public class MaterialItems implements Serializable {
     @ApiModelProperty(value = "备注")
     private java.lang.String remarks;
 	/**最高限价;物价规定的最高限价*/
-	@Excel(name = "最高限价;物价规定的最高限价", width = 15)
-    @ApiModelProperty(value = "最高限价;物价规定的最高限价")
+	@Excel(name = "最高限价", width = 15)
+    @ApiModelProperty(value = "最高限价")
     private java.math.BigDecimal cellingPrice;
 	/**三级医院最高价格;或其他定价规则体现下的最高级别定价*/
-	@Excel(name = "三级医院最高价格;或其他定价规则体现下的最高级别定价", width = 15)
-    @ApiModelProperty(value = "三级医院最高价格;或其他定价规则体现下的最高级别定价")
+	@Excel(name = "三级医院最高价格", width = 15)
+    @ApiModelProperty(value = "三级医院最高价格")
     private java.math.BigDecimal tertiaryHospPrice;
 	/**二级医院最高价格;或其他定价规则体现下的第二等级定价*/
-	@Excel(name = "二级医院最高价格;或其他定价规则体现下的第二等级定价", width = 15)
-    @ApiModelProperty(value = "二级医院最高价格;或其他定价规则体现下的第二等级定价")
+	@Excel(name = "二级医院最高价格", width = 15)
+    @ApiModelProperty(value = "二级医院最高价格")
     private java.math.BigDecimal twoHospPrice;
 	/**创建时间;*/
 	@JsonFormat(timezone = "GMT+8",pattern =  "yyyy-MM-dd HH:mm:ss")
@@ -97,7 +100,7 @@ public class MaterialItems implements Serializable {
     @ApiModelProperty(value = "创建人员;")
     private java.lang.String createBy;
 	/**一级医院最高价格;或其他定价规则体现下的第三等级定价*/
-	@Excel(name = "一级医院最高价格;或其他定价规则体现下的第三等级定价", width = 15)
-    @ApiModelProperty(value = "一级医院最高价格;或其他定价规则体现下的第三等级定价")
+	@Excel(name = "一级医院最高价格", width = 15)
+    @ApiModelProperty(value = "一级医院最高价格")
     private java.math.BigDecimal oneHospPrice;
 }

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

@@ -1,8 +1,12 @@
 package org.jeecg.modules.medical.service;
 
+import org.jeecg.common.api.vo.Result;
 import org.jeecg.modules.medical.entity.MaterialItems;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
 /**
  * @Description: material_items
  * @Author: jeecg-boot
@@ -11,4 +15,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IMaterialItemsService extends IService<MaterialItems> {
 
+    Result<?> importExcel(HttpServletRequest request, HttpServletResponse response);
 }

+ 74 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/service/impl/MaterialItemsServiceImpl.java

@@ -1,11 +1,27 @@
 package org.jeecg.modules.medical.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.util.JwtUtil;
+import org.jeecg.modules.medical.common.ExcelImportUtilService;
 import org.jeecg.modules.medical.entity.MaterialItems;
+import org.jeecg.modules.medical.entity.MedicalInsuranceDrugs;
 import org.jeecg.modules.medical.mapper.MaterialItemsMapper;
 import org.jeecg.modules.medical.service.IMaterialItemsService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.ObjectUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
 
 /**
  * @Description: material_items
@@ -16,4 +32,62 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 @Service
 public class MaterialItemsServiceImpl extends ServiceImpl<MaterialItemsMapper, MaterialItems> implements IMaterialItemsService {
 
+    @Autowired
+    private ExcelImportUtilService excelImportUtilService;
+
+    @Override
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        String username = "";
+        try {
+            username = JwtUtil.getUsername(request.getHeader("X-Access-Token"));
+        } catch (Exception e) {
+            log.error("找不到用户登录的tokne");
+        }
+        final String finalUsername = username;
+        return excelImportUtilService.importExcel(request, MaterialItems.class,
+                // 根据什么字段去重
+                MaterialItems::getItemId,
+                // 根据导入数据,查询哪些在数据库中已经有了
+                list -> {
+                    List<String> collect = list.stream().map(MaterialItems::getItemId).collect(Collectors.toList());
+                    return listByItemIdIn(collect);
+                },
+                // 根据导入数据,和数据库中的数据,取出交集 用于更新
+                (list, dbExistsList) ->{
+                    List<MaterialItems> collect = list.stream().filter(
+                            a -> dbExistsList.stream().map(MaterialItems::getItemId)
+                                    .anyMatch(
+                                            medicineCode -> ObjectUtils.nullSafeEquals(a.getItemId(), medicineCode)
+                                    )
+                    ).collect(Collectors.toList());
+                    //取出交集之后,要将相同数据的数据库id给新数据
+                    if (!CollectionUtils.isEmpty(collect)) {
+                        collect = collect.stream().peek(item -> {
+                            Optional<MaterialItems> first = dbExistsList.stream().filter(o ->
+                                    ObjectUtils.nullSafeEquals(o.getItemId(), item.getItemId())).findFirst();
+                            if (first.isPresent()) {
+                                MaterialItems materialItem = first.get();
+                                item.setId(materialItem.getId());
+                                item.setUpdateTime(new Date());
+                                item.setUpdateBy(finalUsername);
+                            }
+                        }).collect(Collectors.toList());
+                    }
+                    return collect;
+                } ,
+                // 根据导入数据,和数据库中的数据,取出差集 用于新增
+                (list, dbExistsList) -> list.stream().filter(
+                        excelData -> dbExistsList.stream().map(MaterialItems::getItemId).noneMatch(medicineCode ->
+                                ObjectUtils.nullSafeEquals(excelData.getItemId(), medicineCode))
+                ).collect(Collectors.toList()),
+                this::updateBatchById,
+                this::saveBatch
+        );
+    }
+
+    private List<MaterialItems> listByItemIdIn(List<String> itemIds) {
+        LambdaQueryWrapper<MaterialItems> in = Wrappers.<MaterialItems>lambdaQuery()
+                .in(MaterialItems::getItemId, itemIds);
+        return list(in);
+    }
 }

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

@@ -6,9 +6,11 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 import org.checkerframework.checker.nullness.qual.Nullable;
 import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.util.JwtUtil;
 import org.jeecg.modules.medical.common.ExcelImportUtilService;
 import org.jeecg.modules.medical.common.interfaces.BiFunction;
 import org.jeecg.modules.medical.entity.MedicalInsuranceDrugs;
+import org.jeecg.modules.medical.entity.TreatmentItems;
 import org.jeecg.modules.medical.mapper.MedicalInsuranceDrugsMapper;
 import org.jeecg.modules.medical.service.IMedicalInsuranceDrugsService;
 import org.jeecgframework.poi.excel.ExcelImportUtil;
@@ -45,7 +47,14 @@ public class MedicalInsuranceDrugsServiceImpl extends ServiceImpl<MedicalInsuran
     @Transactional(readOnly = false)
     @Override
     public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
-        excelImportUtilService.importExcel(request, MedicalInsuranceDrugs.class,
+        String username = "";
+        try {
+            username = JwtUtil.getUsername(request.getHeader("X-Access-Token"));
+        } catch (Exception e) {
+            log.error("找不到用户登录的tokne");
+        }
+        final String finalUsername = username;
+        return excelImportUtilService.importExcel(request, MedicalInsuranceDrugs.class,
                 // 根据什么字段去重
                 MedicalInsuranceDrugs::getMedicineCode,
                 // 根据导入数据,查询哪些在数据库中已经有了
@@ -54,12 +63,27 @@ public class MedicalInsuranceDrugsServiceImpl extends ServiceImpl<MedicalInsuran
                     return listByMedicineCodeIn(collect);
                 },
                 // 根据导入数据,和数据库中的数据,取出交集 用于更新
-                (list, dbExistsList) -> list.stream().filter(
-                        a -> dbExistsList.stream().map(MedicalInsuranceDrugs::getMedicineCode)
-                                .anyMatch(
-                                        medicineCode -> ObjectUtils.nullSafeEquals(a.getMedicineCode(), medicineCode)
-                                )
-                ).collect(Collectors.toList()),
+                (list, dbExistsList) ->{
+                    List<MedicalInsuranceDrugs> collect = list.stream().filter(
+                            a -> dbExistsList.stream().map(MedicalInsuranceDrugs::getMedicineCode)
+                                    .anyMatch(
+                                            medicineCode -> ObjectUtils.nullSafeEquals(a.getMedicineCode(), medicineCode)
+                                    )
+                    ).collect(Collectors.toList());
+                    //取出交集之后,要将相同数据的数据库id给新数据
+                    if (!CollectionUtils.isEmpty(collect)) {
+                        collect = collect.stream().peek(item -> {
+                            Optional<MedicalInsuranceDrugs> first = dbExistsList.stream().filter(o -> ObjectUtils.nullSafeEquals(o.getMedicineCode(), item.getMedicineCode())).findFirst();
+                            if (first.isPresent()) {
+                                MedicalInsuranceDrugs medicalInsuranceDrugs = first.get();
+                                item.setId(medicalInsuranceDrugs.getId());
+                                item.setUpdateBy(finalUsername);
+                                item.setUpdateTime(new Date());
+                            }
+                        }).collect(Collectors.toList());
+                    }
+                    return collect;
+                } ,
                 // 根据导入数据,和数据库中的数据,取出差集 用于新增
                 (list, dbExistsList) -> list.stream().filter(
                         excelData -> dbExistsList.stream().map(MedicalInsuranceDrugs::getMedicineCode).noneMatch(medicineCode ->
@@ -148,7 +172,6 @@ public class MedicalInsuranceDrugsServiceImpl extends ServiceImpl<MedicalInsuran
                 }
             }
         }*/
-        return Result.error("文件导入失败!");
     }
 
     @Override

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

@@ -1,22 +1,26 @@
 package org.jeecg.modules.medical.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.util.JwtUtil;
 import org.jeecg.modules.medical.common.ExcelImportUtilService;
-import org.jeecg.modules.medical.common.interfaces.BiFunction;
-import org.jeecg.modules.medical.entity.MedicalInsuranceDrugs;
 import org.jeecg.modules.medical.entity.TreatmentItems;
 import org.jeecg.modules.medical.mapper.TreatmentItemsMapper;
 import org.jeecg.modules.medical.service.ITreatmentItemsService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.ObjectUtils;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.util.Date;
 import java.util.List;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 /**
@@ -35,41 +39,49 @@ public class TreatmentItemsServiceImpl extends ServiceImpl<TreatmentItemsMapper,
 
     @Override
     public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
-        excelImportUtilService.importExcel(request, TreatmentItems.class,
+        String username = "";
+        try {
+            username = JwtUtil.getUsername(request.getHeader("X-Access-Token"));
+        } catch (Exception e) {
+            log.error("找不到用户登录的tokne");
+        }
+        final String finalUsername = username;
+        return excelImportUtilService.importExcel(request, TreatmentItems.class,
                 TreatmentItems::getItemId,
-                new BiFunction<List<TreatmentItems>, List<TreatmentItems>>() {
-                    @Override
-                    public List<TreatmentItems> apply(List<TreatmentItems> list) {
-                        List<String> collect = list.stream().map(TreatmentItems::getItemId).collect(Collectors.toList());
-                        return listByItemId(collect);
-                    }
+                list -> {
+                    List<String> collect = list.stream().map(TreatmentItems::getItemId).collect(Collectors.toList());
+                    return listByItemId(collect);
                 },
-                new com.alibaba.fastjson.util.BiFunction<List<TreatmentItems>, List<TreatmentItems>, List<TreatmentItems>>() {
-                    @Override
-                    public List<TreatmentItems> apply(List<TreatmentItems> treatmentItems, List<TreatmentItems> treatmentItems2) {
-                        return null;
+                // 取交集
+                (list, dbExistsList) -> {
+                    List<TreatmentItems> collect = list.stream().filter(
+                            a -> dbExistsList.stream().map(TreatmentItems::getItemId)
+                                    .anyMatch(
+                                            itemId -> ObjectUtils.nullSafeEquals(a.getItemId(), itemId)
+                                    )
+                    ).collect(Collectors.toList());
+                    //取出交集之后,要将相同数据的数据库id给新数据
+                    if (!CollectionUtils.isEmpty(collect)) {
+                        collect = collect.stream().peek(item -> {
+                            Optional<TreatmentItems> first = dbExistsList.stream().filter(o -> ObjectUtils.nullSafeEquals(o.getItemId(), item.getItemId())).findFirst();
+                            if (first.isPresent()) {
+                                TreatmentItems treatmentItems = first.get();
+                                item.setId(treatmentItems.getId());
+                                item.setUpdateBy(finalUsername);
+                                item.setUpdateTime(new Date());
+                            }
+                        }).collect(Collectors.toList());
                     }
+                    return collect;
                 },
-                new com.alibaba.fastjson.util.BiFunction<List<TreatmentItems>, List<TreatmentItems>, List<TreatmentItems>>() {
-                    @Override
-                    public List<TreatmentItems> apply(List<TreatmentItems> treatmentItems, List<TreatmentItems> treatmentItems2) {
-                        return null;
-                    }
-                },
-                new com.alibaba.fastjson.util.BiFunction<List<TreatmentItems>, Integer, Boolean>() {
-                    @Override
-                    public Boolean apply(List<TreatmentItems> treatmentItems, Integer integer) {
-                        return null;
-                    }
-                },
-                new com.alibaba.fastjson.util.BiFunction<List<TreatmentItems>, Integer, Boolean>() {
-                    @Override
-                    public Boolean apply(List<TreatmentItems> treatmentItems, Integer integer) {
-                        return null;
-                    }
-                }
+                // 取差集
+                (list, dbExistsList) -> list.stream().filter(
+                        excelData -> dbExistsList.stream().map(TreatmentItems::getItemId).noneMatch(itemId ->
+                                ObjectUtils.nullSafeEquals(excelData.getItemId(), itemId))
+                ).collect(Collectors.toList()),
+                this::updateBatchById,
+                this::saveBatch
         );
-        return null;
     }
 
     /**
@@ -78,6 +90,8 @@ public class TreatmentItemsServiceImpl extends ServiceImpl<TreatmentItemsMapper,
      * @return
      */
     private List<TreatmentItems> listByItemId(List<String> itemIds) {
-        return null;
+        LambdaQueryWrapper<TreatmentItems> in = Wrappers.<TreatmentItems>lambdaQuery()
+                .in(TreatmentItems::getItemId, itemIds);
+        return list(in);
     }
 }