فهرست منبع

Merge remote-tracking branch 'origin/master'

lenovodn 2 سال پیش
والد
کامیت
779a6e215b

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

@@ -12,6 +12,7 @@ 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.DefaultExcelSupportChineseService;
 import org.jeecg.modules.medical.service.IMaterialItemsService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -19,6 +20,7 @@ import org.springframework.web.servlet.ModelAndView;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.io.UnsupportedEncodingException;
 import java.util.Arrays;
 
  /**
@@ -34,6 +36,8 @@ import java.util.Arrays;
 public class MaterialItemsController extends JeecgController<MaterialItems, IMaterialItemsService> {
 	@Autowired
 	private IMaterialItemsService materialItemsService;
+	@Autowired
+	private DefaultExcelSupportChineseService<MaterialItems> excelSupportChineseService;
 
 	/**
 	 * 分页列表查询
@@ -138,7 +142,13 @@ public class MaterialItemsController extends JeecgController<MaterialItems, IMat
     */
     @RequestMapping(value = "/exportXls")
     public ModelAndView exportXls(HttpServletRequest request, MaterialItems materialItems) {
-        return super.exportXlsEmpty(request, materialItems, MaterialItems.class, "material_items");
+//        return super.exportXlsEmpty(request, materialItems, MaterialItems.class, "医保耗材目录");
+		try{
+			return excelSupportChineseService.exportXlsEmpty(request, materialItems, MaterialItems.class, "医保耗材目录");
+		} catch (
+			UnsupportedEncodingException e) {
+			throw new RuntimeException(e);
+		}
     }
 
     /**
@@ -150,8 +160,8 @@ public class MaterialItemsController extends JeecgController<MaterialItems, IMat
     */
     @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
     public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
-        return super.importExcel(request, response, MaterialItems.class);
-//		return materialItemsService.importExcel(request, response);
+//        return super.importExcel(request, response, MaterialItems.class);
+		return materialItemsService.importExcel(request, response);
     }
 
 }

+ 0 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/controller/MedicalInsRuleProjectController.java

@@ -205,7 +205,6 @@ public class MedicalInsRuleProjectController extends JeecgController<MedicalInsR
 	 @RequestMapping(value = "/import/templateExcel", method = RequestMethod.POST)
 	 public Result<?> importTemplateExcel(HttpServletRequest request, HttpServletResponse response) {
 //		 return super.importExcel(request, response, MedicalInsRuleProject.class);
-
 		 return medicalInsRuleProjectService.importTemplateExcel(request, response, MedicalInsRuleProject.class);
 	 }
 

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

@@ -0,0 +1,58 @@
+package org.jeecg.modules.medical.service;
+
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.enmus.ExcelType;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.security.Provider;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author soft01
+ * @time 2023/6/11 10:32
+ * @description '这里描写类的用途'
+ * @parentProject medical-java
+ */
+@Service
+public class DefaultExcelSupportChineseService<T extends Serializable> {
+
+    @Value("${jeecg.path.upload}")
+    protected String upLoadPath;
+    public ModelAndView exportXlsEmpty(HttpServletRequest request, T object, Class<T> clazz, String title) throws UnsupportedEncodingException {
+        // Step.1 组装查询条件
+//        QueryWrapper<T> queryWrapper = QueryGenerator.initQueryWrapper(object, request.getParameterMap());
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        final String noCodeTitle = title + "模板";
+        title = URLEncoder.encode(title, "UTF-8");
+        // Step.2 获取导出数据
+        List<T> exportList = new ArrayList<>();
+
+        // Step.3 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        //此处设置的filename无效 ,前端会重更新设置一下
+        mv.addObject(NormalExcelConstants.FILE_NAME, title);
+        mv.addObject(NormalExcelConstants.CLASS, clazz);
+        //update-begin--Author:liusq  Date:20210126 for:图片导出报错,ImageBasePath未设置--------------------
+        ExportParams exportParams=new ExportParams(noCodeTitle, "导出人:" + sysUser.getRealname(), noCodeTitle);
+        exportParams.setImageBasePath(upLoadPath);
+        exportParams.setType(ExcelType.XSSF);
+
+        //update-end--Author:liusq  Date:20210126 for:图片导出报错,ImageBasePath未设置----------------------
+        mv.addObject(NormalExcelConstants.PARAMS,exportParams);
+        mv.addObject(NormalExcelConstants.DATA_LIST, exportList);
+        return mv;
+    }
+}

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

@@ -4,9 +4,11 @@ import org.jeecg.common.api.vo.Result;
 import org.jeecg.modules.medical.entity.AdviceDetailsVO;
 import org.jeecg.modules.medical.entity.MaterialItems;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.springframework.util.StringUtils;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.util.List;
 
 /**
  * @Description: material_items
@@ -16,7 +18,16 @@ import javax.servlet.http.HttpServletResponse;
  */
 public interface IMaterialItemsService extends IService<MaterialItems> {
 
+    default String ifnull(String str) {
+        if (StringUtils.hasText(str)) {
+            return str;
+        }
+        return "";
+    }
+
     Result<?> importExcel(HttpServletRequest request, HttpServletResponse response);
 
+    List<MaterialItems> loadDbExistsList(List<MaterialItems> list);
+
     MaterialItems saveMaterialItems(AdviceDetailsVO adviceDetailsVO);
 }

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

@@ -2,29 +2,41 @@ 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 lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.exception.JeecgBootException;
 import org.jeecg.common.system.util.JwtUtil;
+import org.jeecg.common.system.vo.MedicalDto;
+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.entity.TreatmentItems;
+import org.jeecg.modules.medical.common.bo.ExportRuleFieldDTO;
+import org.jeecg.modules.medical.common.bo.ExportRuleTitleDTO;
+import org.jeecg.modules.medical.entity.*;
 import org.jeecg.modules.medical.mapper.MaterialItemsMapper;
 import org.jeecg.modules.medical.service.IMaterialItemsService;
+import org.jeecg.modules.utils.DefaultExcelImportServer;
+import org.jeecg.modules.utils.DefaultExcelImportUtil;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.util.PoiPublicUtil;
 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 org.springframework.util.StringUtils;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.lang.reflect.Field;
 import java.math.BigDecimal;
-import java.util.Date;
-import java.util.List;
-import java.util.Optional;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -33,6 +45,7 @@ import java.util.stream.Collectors;
  * @Date:   2023-04-23
  * @Version: V1.0
  */
+@Slf4j
 @Service
 public class MaterialItemsServiceImpl extends ServiceImpl<MaterialItemsMapper, MaterialItems> implements IMaterialItemsService {
 
@@ -41,6 +54,12 @@ public class MaterialItemsServiceImpl extends ServiceImpl<MaterialItemsMapper, M
 
     @Override
     public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+
+        Integer rmDuplicateNumber = 0; // excel文件重复数量
+        Integer totalNumber = 0;//导入文件总数
+        Integer addNumber = 0; //新增数量
+        Integer updateNumber = 0;//更新文件数量
+
         String username = "";
         try {
             username = JwtUtil.getUsername(request.getHeader("X-Access-Token"));
@@ -48,46 +67,138 @@ public class MaterialItemsServiceImpl extends ServiceImpl<MaterialItemsMapper, M
             log.error("找不到用户登录的tokne");
         }
         final String finalUsername = username;
-        return null;
-        /*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());
+
+        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<MaterialItems> list = DefaultExcelImportUtil
+                        .importExcel(file.getInputStream(), MaterialItems.class, params);
+                if (CollectionUtils.isEmpty(list)) {
+                    log.error("导入文件没有数据,请检查");
+                    return Result.ok("上传的文件没有数据,请检查");
+                }
+                totalNumber = list.size();
+                // 检查导入必填数据
+                for (MaterialItems item : list) {
+                    // 医院项目编码
+                    String itemIdHosp = item.getItemIdHosp();
+                    if (!StringUtils.hasText(itemIdHosp)) {
+                        log.error("数据导入时,找不到医院项目编码,请检查");
+                        throw new JeecgBootException("医院项目编码为空,医院项目编码必填,请检查!");
                     }
-                    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
-        );*/
+                }
+                // 倒序去重
+                List<MaterialItems> collect = list.stream().map(item -> item).collect(Collectors.toList());
+                Collections.reverse(collect);
+                list = collect.stream().collect(
+                        Collectors.collectingAndThen(
+                                Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(
+                                        this::getDuplicateRm
+                                ))), ArrayList::new
+                        )
+                );
+                // 随后把顺序倒回来
+                Collections.reverse(list);
+                // 文件总条数 - 去重之后剩余数量 = excel 文件的重复数据
+                if (!CollectionUtils.isEmpty(list)) {
+                    rmDuplicateNumber = totalNumber - list.size();
+                }
+
+                // 根据条件,查询数据库去重。
+                List<MaterialItems> dbExistsList = this.loadDbExistsList(list);
+                // 更新列表
+                List<MaterialItems> updateList = new ArrayList<>();
+                // 新增列表
+                List<MaterialItems> instalList = list;
+                if (!CollectionUtils.isEmpty(dbExistsList)) { // 不为空时, 需要将存在的做更新操作
+                    // 取出交集
+                    updateList = excelImportUtilService.getUpdateDatas(list, dbExistsList,
+                            this::getDuplicateRm,
+                            (nd, od) -> {
+                                nd.setId(od.getId());
+                                nd.setUpdateBy(finalUsername); //更新人
+                                nd.setUpdateTime(new Date());
+                                return nd;
+                            });//
+                    // 如果有则需要更新
+                    if (!CollectionUtils.isEmpty(updateList)) {
+                        updateNumber = updateList.size();
+                        this.updateBatchById(updateList, 500);
+                    }
+                    // 取出差集
+                    instalList = excelImportUtilService.getInsertDatas(list, dbExistsList, this::getDuplicateRm);
+                }
+                long start = System.currentTimeMillis();
+                if (!CollectionUtils.isEmpty(instalList)) {
+                    addNumber = instalList.size();
+                    this.saveBatch(instalList, 500);
+                }
+                log.info("消耗时间" + (System.currentTimeMillis() - start) + "毫秒");
+                //update-end-author:taoyan date:20190528 for:批量插入数据
+                return Result.ok("文件导入成功,请点击刷新!文件总行数:" + totalNumber + "; 文件自身重复:" + rmDuplicateNumber + "; 新增行数: " + addNumber + "; 更新行数: " + updateNumber);
+            } catch (Exception e) {
+                //update-begin-author:taoyan date:20211124 for: 导入数据重复增加提示
+                String msg = e.getMessage();
+                log.error(msg, e);
+                if (msg != null && msg.indexOf("Duplicate entry") >= 0) {
+                    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();
+                }
+            }
+        }
+        return Result.error("文件导入失败!");
+    }
+
+    /**
+     * 根据导入数据,检查数据库是否存在
+     *
+     * @param list
+     * @return
+     */
+    @Override
+    public List<MaterialItems> loadDbExistsList(List<MaterialItems> list) {
+        // 固定这两个字段,projectCode为必须,correlationProjectCode为可选
+        if (CollectionUtils.isEmpty(list)) {
+            return new ArrayList<>();
+        }
+        QueryWrapper<MaterialItems> queryWrapper = new QueryWrapper<>();
+        List<String> itemIdHostKeys = new ArrayList<>();
+        for (MaterialItems 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);
+    }
+
+    /**
+     * 构建去重因子
+     * @param medicalInsRuleProject
+     * @return
+     */
+    private String getDuplicateRm(MaterialItems materialItems) {
+        return ifnull(materialItems.getItemIdHosp());
     }
 
     @Override