Parcourir la source

添加手术信息导入,药品信息导入功能

songxinlu il y a 3 ans
Parent
commit
e4cd6af419

+ 50 - 0
daqe-center/src/main/java/com/lantone/daqe/dto/ExportImportDrugErrDTO.java

@@ -0,0 +1,50 @@
+package com.lantone.daqe.dto;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 药品匹配信息导入出错-接口出参
+ * @author: songxl
+ * @time: 2022/2/28 11:15
+ */
+@ApiModel(value = "药品匹配信息导入出错-接口出参")
+@Getter
+@Setter
+public class ExportImportDrugErrDTO implements Serializable {
+
+    private static final long serialVersionUID = -5293580591477859209L;
+
+    @Excel(name = "医院药品名称")
+    private String name;
+
+    @Excel(name = "标准药品名称")
+    private String standard;
+
+    @ApiModelProperty(value = "药品剂型")
+    private String form;
+
+    @ApiModelProperty(value = "国药准字")
+    private String approvalNum;
+
+    @Excel(name = "是否匹配【未匹配、已匹配】")
+    private String isMapping;
+
+    @Excel(name = "数据来源【不填、标准词、同义词、编码、历史数据、相似词、国药准字】")
+    private String synonym;
+
+    @Excel(name = "标准术语状态")
+    private String status;
+
+    @Excel(name = "标准剂型状态")
+    private String relationstatus;
+
+    @Excel(name = "错误提示" , width = 40)
+    private String errMsg;
+
+}

+ 42 - 0
daqe-center/src/main/java/com/lantone/daqe/dto/ExportImportOperationDTO.java

@@ -0,0 +1,42 @@
+package com.lantone.daqe.dto;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 医院手术标准词匹配信息导入出错-接口出参
+ * @author: songxl
+ * @time: 2022/2/28 11:15
+ */
+@ApiModel(value = "医院手术标准词匹配信息导入出错-接口出参")
+@Getter
+@Setter
+public class ExportImportOperationDTO implements Serializable {
+
+    private static final long serialVersionUID = -8732549646556137033L;
+
+    @Excel(name = "医院手术/操作名称")
+    private String name;
+
+    @Excel(name = "手术和操作代码")
+    private String code;
+
+    @Excel(name = "标准手术/操作名称")
+    private String standard;
+
+    @Excel(name = "是否匹配【未匹配、已匹配】")
+    private String isMapping;
+
+    @Excel(name = "数据来源【不填、标准词、同义词、编码、历史数据、相似词】")
+    private String synonym;
+
+    @Excel(name = "标准术语状态")
+    private String status;
+
+    @Excel(name = "错误提示" , width = 40)
+    private String errMsg;
+}

+ 94 - 0
daqe-center/src/main/java/com/lantone/daqe/facade/DrugManagementFacade.java

@@ -1,24 +1,39 @@
 package com.lantone.daqe.facade;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.lantone.common.api.CommonResult;
 import com.lantone.common.exception.Asserts;
 import com.lantone.common.util.BeanUtil;
+import com.lantone.common.util.ListUtil;
 import com.lantone.common.util.StringUtil;
+import com.lantone.daqe.dto.ExportImportDrugErrDTO;
 import com.lantone.daqe.dto.GetDrugPageDTO;
 import com.lantone.daqe.entity.DrugInfo;
+import com.lantone.daqe.entity.OperationInfo;
 import com.lantone.daqe.facade.base.DrugInfoFacade;
+import com.lantone.daqe.service.impl.DrugInfoServiceImpl;
+import com.lantone.daqe.util.ExcelUtils;
 import com.lantone.daqe.vo.AddDrugVO;
 import com.lantone.daqe.vo.DelDrugByIdVO;
 import com.lantone.daqe.vo.GetDrugPageVO;
+import com.lantone.daqe.vo.ImportDrugVO;
 import com.lantone.daqe.vo.MatchingDrugVO;
 import com.lantone.daqe.vo.UpDrugByIdVO;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.stream.Collectors;
 
 /**
  * @Description: 药品管理-业务处理类
@@ -31,6 +46,9 @@ public class DrugManagementFacade {
     @Autowired
     private DrugInfoFacade drugInfoFacade;
 
+    @Autowired
+    private DrugInfoServiceImpl drugInfoServiceImpl;
+
     public IPage<GetDrugPageDTO> getDrugPage(GetDrugPageVO getDrugPageVO) {
         Page<GetDrugPageDTO> getDrugPageDTOPage = new Page<>();
 
@@ -104,6 +122,8 @@ public class DrugManagementFacade {
     }
 
     /**
+     * 匹配药品信息
+     *
      * @param matchingDrugVO
      * @Return java.lang.Boolean
      */
@@ -111,6 +131,80 @@ public class DrugManagementFacade {
 
         DrugInfo drugInfo = new DrugInfo();
         BeanUtils.copyProperties(matchingDrugVO, drugInfo);
+        drugInfo.setStandard(matchingDrugVO.getStandard() + "_" + matchingDrugVO.getForm());
         return drugInfoFacade.updateById(drugInfo);
     }
+
+    public void importDrug(HttpServletResponse response, MultipartFile file) {
+        List<ImportDrugVO> operationExcelVOS = ExcelUtils.importExcel(file, 0, 1, ImportDrugVO.class);
+        if (ListUtil.isEmpty(operationExcelVOS)) {
+            Asserts.fail("Excel文件为空");
+        }
+        //数据规范校验
+        List<ExportImportDrugErrDTO> errExports = new ArrayList<>();
+        if (checkData(operationExcelVOS, errExports)) {
+            String fileName = "药品匹配信息导入异常.xls";
+            ExcelUtils.exportExcelUser(errExports, null, "sheet1", ExportImportDrugErrDTO.class, fileName, response);
+        } else {
+            //去重
+            List<ImportDrugVO> temp = delRepeat(operationExcelVOS);
+            List<DrugInfo> insert = new ArrayList<>();
+            //导入数据转换
+            temp.stream().forEach(importDrugVO -> {
+                DrugInfo drugInfo = new DrugInfo();
+                BeanUtils.copyProperties(importDrugVO,drugInfo);
+                drugInfo.setStandard(importDrugVO.getStandard()+"_"+importDrugVO.getForm());
+            });
+            boolean out = drugInfoServiceImpl.saveBatch(insert);
+            CommonResult<String> outMsg = null;
+            response.setContentType("text/html;charset=utf-8");
+            if (out) {
+                outMsg = CommonResult.success(String.format("模板成功导入%s条数据", insert.size()));
+                try {
+                    response.getWriter().println(JSONObject.toJSONString(outMsg));
+                    response.flushBuffer();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            } else {
+                Asserts.fail("数据插入失败");
+            }
+        }
+    }
+
+
+    /**
+     * 数据校验
+     *
+     * @param importDrugVOS 导入数据
+     * @param errExports 导出异常i
+     * @Return java.lang.Boolean
+     */
+    private Boolean checkData(List<ImportDrugVO> importDrugVOS, List<ExportImportDrugErrDTO> errExports) {
+        AtomicBoolean errorFlog = new AtomicBoolean(false);
+        importDrugVOS.stream().forEach(importDrugVO -> {
+            ExportImportDrugErrDTO exportImportDrugErrDTO = new ExportImportDrugErrDTO();
+            BeanUtil.copyProperties(importDrugVO, exportImportDrugErrDTO);
+            StringBuffer errMsg = new StringBuffer();
+            //数据校验
+            if (StringUtil.isEmpty(importDrugVO.getName())) {
+                errMsg.append("医院手术/操作名称为空").append(";");
+                errorFlog.set(true);
+            }
+            if (StringUtil.isEmpty(importDrugVO.getStandard())) {
+                errMsg.append("标准手术/操作名称为空").append(";");
+                errorFlog.set(true);
+            }
+            exportImportDrugErrDTO.setErrMsg(errMsg.toString());
+            errExports.add(exportImportDrugErrDTO);
+        });
+        return errorFlog.get();
+    }
+
+    private List<ImportDrugVO> delRepeat(List<ImportDrugVO> importDrugVOS) {
+        //通过标准词去重
+        LinkedHashMap<String, ImportDrugVO> tempMap = importDrugVOS.stream()
+                .collect(Collectors.toMap(ImportDrugVO::getName, ImportDrugVO -> ImportDrugVO, (k1, k2) -> k1, LinkedHashMap::new));
+        return tempMap.values().stream().collect(Collectors.toList());
+    }
 }

+ 85 - 0
daqe-center/src/main/java/com/lantone/daqe/facade/OperationManagementFacade.java

@@ -1,24 +1,38 @@
 package com.lantone.daqe.facade;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.lantone.common.api.CommonResult;
 import com.lantone.common.exception.Asserts;
 import com.lantone.common.util.BeanUtil;
+import com.lantone.common.util.ListUtil;
 import com.lantone.common.util.StringUtil;
+import com.lantone.daqe.dto.ExportImportOperationDTO;
 import com.lantone.daqe.dto.GetOperationPageDTO;
 import com.lantone.daqe.entity.OperationInfo;
 import com.lantone.daqe.facade.base.OperationInfoFacade;
+import com.lantone.daqe.service.impl.OperationInfoServiceImpl;
+import com.lantone.daqe.util.ExcelUtils;
 import com.lantone.daqe.vo.AddOperationVO;
 import com.lantone.daqe.vo.DelOperationByIdVO;
 import com.lantone.daqe.vo.GetOperationPageVO;
+import com.lantone.daqe.vo.ImportOperationVO;
 import com.lantone.daqe.vo.MatchingOperationVO;
 import com.lantone.daqe.vo.UpOperationByIdVO;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.stream.Collectors;
 
 /**
  * @Description: 手术管理-业务处理类
@@ -31,6 +45,9 @@ public class OperationManagementFacade {
     @Autowired
     private OperationInfoFacade operationInfoFacade;
 
+    @Autowired
+    private OperationInfoServiceImpl operationInfoServiceImpl;
+
     public IPage<GetOperationPageDTO> getOperationPage(GetOperationPageVO getOperationPageVO) {
         Page<GetOperationPageDTO> getOperationPageDTOPage = new Page<>();
 
@@ -112,4 +129,72 @@ public class OperationManagementFacade {
         BeanUtils.copyProperties(matchingOperationVO, operationInfo);
         return operationInfoFacade.updateById(operationInfo);
     }
+
+    public void importOperation(HttpServletResponse response, MultipartFile file) {
+        List<ImportOperationVO> operationExcelVOS = ExcelUtils.importExcel(file, 0, 1, ImportOperationVO.class);
+        if (ListUtil.isEmpty(operationExcelVOS)) {
+            Asserts.fail("Excel文件为空");
+        }
+        //数据规范校验
+        List<ExportImportOperationDTO> errExports = new ArrayList<>();
+        if (checkData(operationExcelVOS, errExports)) {
+            String fileName = "医院手术标准词匹配信息导入异常.xls";
+            ExcelUtils.exportExcelUser(errExports, null, "sheet1", ExportImportOperationDTO.class, fileName, response);
+        } else {
+            //去重
+            List<ImportOperationVO> temp = delRepeat(operationExcelVOS);
+            //导入
+            List<OperationInfo> insert = BeanUtil.listCopyTo(temp, OperationInfo.class);
+            boolean out = operationInfoServiceImpl.saveBatch(insert);
+            CommonResult<String> outMsg = null;
+            response.setContentType("text/html;charset=utf-8");
+            if (out) {
+                outMsg = CommonResult.success(String.format("模板成功导入%s条数据", insert.size()));
+                try {
+                    response.getWriter().println(JSONObject.toJSONString(outMsg));
+                    response.flushBuffer();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            } else {
+                Asserts.fail("数据插入失败");
+            }
+        }
+    }
+
+
+    /**
+     * 数据校验
+     *
+     * @param importOperationVOS 导入数据
+     * @param errExports 导出异常
+     * @Return java.lang.Boolean
+     */
+    private Boolean checkData(List<ImportOperationVO> importOperationVOS, List<ExportImportOperationDTO> errExports) {
+        AtomicBoolean errorFlog = new AtomicBoolean(false);
+        importOperationVOS.stream().forEach(importOperationVO -> {
+            ExportImportOperationDTO exportImportOperationDTO = new ExportImportOperationDTO();
+            BeanUtil.copyProperties(importOperationVO, exportImportOperationDTO);
+            StringBuffer errMsg = new StringBuffer();
+            //数据校验
+            if (StringUtil.isEmpty(importOperationVO.getName())) {
+                errMsg.append("医院手术/操作名称为空").append(";");
+                errorFlog.set(true);
+            }
+            if (StringUtil.isEmpty(importOperationVO.getStandard())) {
+                errMsg.append("标准手术/操作名称为空").append(";");
+                errorFlog.set(true);
+            }
+            exportImportOperationDTO.setErrMsg(errMsg.toString());
+            errExports.add(exportImportOperationDTO);
+        });
+        return errorFlog.get();
+    }
+
+    private List<ImportOperationVO> delRepeat(List<ImportOperationVO> importOperationVOS) {
+        //通过标准词去重
+        LinkedHashMap<String, ImportOperationVO> tempMap = importOperationVOS.stream()
+                .collect(Collectors.toMap(ImportOperationVO::getName, ImportOperationVO -> ImportOperationVO, (k1, k2) -> k1, LinkedHashMap::new));
+        return tempMap.values().stream().collect(Collectors.toList());
+    }
 }

+ 49 - 0
daqe-center/src/main/java/com/lantone/daqe/vo/ImportDrugVO.java

@@ -0,0 +1,49 @@
+package com.lantone.daqe.vo;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 药品匹配信息导入-接口入参
+ * @author: songxl
+ * @time: 2022/2/28 11:15
+ */
+@ApiModel(value = "药品匹配信息导入-接口入参")
+@Getter
+@Setter
+@ExcelTarget("ImportDrugVO")
+public class ImportDrugVO implements Serializable {
+
+    private static final long serialVersionUID = -8885585698004578603L;
+
+    @Excel(name = "医院药品名称")
+    private String name;
+
+    @Excel(name = "标准药品名称")
+    private String standard;
+
+    @ApiModelProperty(value = "药品剂型")
+    private String form;
+
+    @ApiModelProperty(value = "国药准字")
+    private String approvalNum;
+
+    @Excel(name = "是否匹配【未匹配、已匹配】")
+    private String isMapping;
+
+    @Excel(name = "数据来源【不填、标准词、同义词、编码、历史数据、相似词、国药准字】")
+    private String synonym;
+
+    @Excel(name = "标准术语状态")
+    private String status;
+
+    @Excel(name = "标准剂型状态")
+    private String relationstatus;
+
+}

+ 42 - 0
daqe-center/src/main/java/com/lantone/daqe/vo/ImportOperationVO.java

@@ -0,0 +1,42 @@
+package com.lantone.daqe.vo;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
+import io.swagger.annotations.ApiModel;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 医院手术标准词匹配信息导入-接口入参
+ * @author: songxl
+ * @time: 2022/2/28 11:15
+ */
+@ApiModel(value = "医院手术标准词匹配信息导入-接口入参")
+@Getter
+@Setter
+@ExcelTarget("ImportOperationVO")
+public class ImportOperationVO implements Serializable {
+
+    private static final long serialVersionUID = 190312070334277439L;
+
+    @Excel(name = "医院手术/操作名称")
+    private String name;
+
+    @Excel(name = "手术和操作代码")
+    private String code;
+
+    @Excel(name = "标准手术/操作名称")
+    private String standard;
+
+    @Excel(name = "是否匹配【未匹配、已匹配】")
+    private String isMapping;
+
+    @Excel(name = "数据来源【不填、标准词、同义词、编码、历史数据、相似词】")
+    private String synonym;
+
+    @Excel(name = "标准术语状态")
+    private String status;
+
+}

+ 6 - 7
daqe-center/src/main/java/com/lantone/daqe/vo/MatchingDrugVO.java

@@ -18,17 +18,16 @@ import java.io.Serializable;
 @Getter
 @Setter
 public class MatchingDrugVO implements Serializable {
-    private static final long serialVersionUID = -1191653962318238387L;
+    private static final long serialVersionUID = 6819802638431511984L;
 
-    @ApiModelProperty(value = "医院手术/操作名称ID", required = true)
-    @NotNull(message = "医院手术/操作名称ID不能为空")
+    @ApiModelProperty(value = "医院药品ID", required = true)
+    @NotNull(message = "医院药品ID不能为空")
     private Long id;
 
-    @ApiModelProperty(value = "手术和操作代码", required = true)
-    @NotBlank(message = "手术和操作代码不能为空")
-    private String code;
+    @ApiModelProperty(value = "药品剂型")
+    private String form;
 
-    @ApiModelProperty(value = "标准手术/操作名称")
+    @ApiModelProperty(value = "标准药品名称")
     private String standard;
 
     @ApiModelProperty(value = "同义词")

+ 9 - 0
daqe-center/src/main/java/com/lantone/daqe/web/DrugManagementController.java

@@ -15,8 +15,11 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 
 /**
@@ -62,4 +65,10 @@ public class DrugManagementController {
         return CommonResult.success(drugManagementFacade.matchingDrug(matchingDrugVO));
     }
 
+    @ApiOperation(value = "药品匹配信息导入 [by:songxl]", notes = "药品匹配信息导入")
+    @PostMapping("/importDrug")
+    public void importDrug(HttpServletResponse response, @RequestParam("file") MultipartFile file) {
+        drugManagementFacade.importDrug(response, file);
+    }
+
 }

+ 9 - 0
daqe-center/src/main/java/com/lantone/daqe/web/OperationManagementController.java

@@ -15,8 +15,11 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 
 /**
@@ -62,4 +65,10 @@ public class OperationManagementController {
         return CommonResult.success(operationManagementFacade.matchingOperation(matchingOperationVO));
     }
 
+    @ApiOperation(value = "医院手术标准词匹配信息导入 [by:songxl]", notes = "医院手术标准词匹配信息导入")
+    @PostMapping("/importOperation")
+    public void importOperation(HttpServletResponse response, @RequestParam("file") MultipartFile file) {
+        operationManagementFacade.importOperation(response, file);
+    }
+
 }