Explorar o código

Merge remote-tracking branch 'origin/master'

lenovodn %!s(int64=2) %!d(string=hai) anos
pai
achega
c289169162
Modificáronse 15 ficheiros con 355 adicións e 25 borrados
  1. 41 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/SystemEventAttrConstant.java
  2. 1 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/common/ExcelImportUtilService.java
  3. 17 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/common/bo/ExportRuleFieldDTO.java
  4. 11 11
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/controller/MedicalInsRuleProjectController.java
  5. 9 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/HospitalizatioSettleDetail.java
  6. 6 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/MasterAdmissionBill.java
  7. 6 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/OutpatientSettleBill.java
  8. 9 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/OutpatientSettlementDetails.java
  9. 3 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/mapper/MedicalInsRuleProjectMapper.java
  10. 16 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/mapper/xml/MedicalInsRuleProjectMapper.xml
  11. 22 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/ruleengine/FactorEnchangeFactory.java
  12. 2 2
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/ruleengine/RuleEngine.java
  13. 14 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/service/IMedicalInsRuleProjectService.java
  14. 141 9
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/service/impl/MedicalInsRuleProjectServiceImpl.java
  15. 57 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/utils/DefaultExcelImportServer.java

+ 41 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/SystemEventAttrConstant.java

@@ -49,4 +49,45 @@ public class SystemEventAttrConstant {
      * 医院项目编码 eventAttrId: 992
      */
     public static final String PROJECT_CODE_LSIT = "projectCodeList";
+    /**
+     * 单次用药量 eventAttrId: 991
+     */
+    public static final String SINGLE_DOSE_NUMBER = "single_dose_number";
+    /**
+     * 单次用药剂量单位 eventAttrId: 990
+     */
+    public static final String SINGLE_DOSE_UNIT = "single_dose_unit";
+    /**
+     * 服用频次 eventAttrId: 989
+     */
+    public static final String TAKE_FREQUENCE = "take_frequence";
+    /**
+     * 规格 eventAttrId: 988
+     */
+    public static final String MEDICAL_SPECIFICATION = "medical_specification";
+    /**
+     * 单价 eventAttrId: 987
+     */
+    public static final String PRICE = "price";
+    /**
+     * 用药天数 eventAttrId: 986
+     */
+    public static final String USE_DAY = "use_day";
+    /**
+     * 剂型 eventAttrId: 985
+     */
+    public static final String DOSE_FORM = "dose_form";
+    /**
+     * 药量天数 eventAttrId: 984
+     */
+    public static final String DOSE_DAY = "dose_day";
+    /**
+     * 单位 eventAttrId:983
+     */
+    public static final String DOSE_UNIT = "dose_unit";
+    /**
+     * 数量 eventAttrId:982
+     */
+    public static final String QUANTITY = "quantity";
+
 }

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

@@ -141,7 +141,7 @@ public class ExcelImportUtilService<T extends Serializable, R extends Comparable
         return Result.error("文件导入失败!");
     }
 
-    private List<T> getInsertDatas(List<T> list, List<T> dbExistsList, Function<T,R> duplicateRm) {
+    public List<T> getInsertDatas(List<T> list, List<T> dbExistsList, Function<T,R> duplicateRm) {
         return list.stream().filter(
                 excelData -> dbExistsList.stream().map(duplicateRm).noneMatch(medicineCode ->
                         ObjectUtils.nullSafeEquals(duplicateRm.apply(excelData), medicineCode))

+ 17 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/common/bo/ExportRuleFieldDTO.java

@@ -0,0 +1,17 @@
+package org.jeecg.modules.medical.common.bo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author soft01
+ * @time 2023/6/3 12:16
+ * @description '这里描写类的用途'
+ * @parentProject medical-java
+ */
+@Data
+public class ExportRuleFieldDTO implements Serializable {
+    private String itemText;
+    private String itemValue;
+}

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

@@ -196,18 +196,18 @@ public class MedicalInsRuleProjectController extends JeecgController<MedicalInsR
         }
     }
 
-    /**
-     * 导入灵活表头的Excel
-     *
-     * @param request
-     * @param response
-     * @return
-     */
-    @RequestMapping(value = "/import/templateExcel", method = RequestMethod.POST)
-    public Result<?> importTemplateExcel(HttpServletRequest request, HttpServletResponse response) {
+	 /**
+	  * 导入灵活表头的Excel
+	  *
+	  * @param request
+	  * @param response
+	  * @return
+	  */
+	 @RequestMapping(value = "/import/templateExcel", method = RequestMethod.POST)
+	 public Result<?> importTemplateExcel(HttpServletRequest request, HttpServletResponse response, @RequestBody Map<String, Integer> args1) {
 //		 return super.importExcel(request, response, MedicalInsRuleProject.class);
-        return medicalInsRuleProjectService.importTemplateExcel(request, response, MedicalInsRuleProject.class);
-    }
+		 return medicalInsRuleProjectService.importTemplateExcel(request, response, MedicalInsRuleProject.class, args1);
+	 }
 
 
     /**

+ 9 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/HospitalizatioSettleDetail.java

@@ -56,6 +56,10 @@ public class HospitalizatioSettleDetail implements Serializable {
 	@Excel(name = "费用类别;床位费、诊查费、检查费、化验费、治疗费、手术费、护理费、卫生材料费、西药费、中药饮片费、中成药费、一般诊疗费、挂号费、其他费;如果目前费用类别与此统计口径有差异,按照目前费用类别提取", width = 15)
     @ApiModelProperty(value = "费用类别;床位费、诊查费、检查费、化验费、治疗费、手术费、护理费、卫生材料费、西药费、中药饮片费、中成药费、一般诊疗费、挂号费、其他费;如果目前费用类别与此统计口径有差异,按照目前费用类别提取")
     private java.lang.String pCategory;
+    /**医疗收费项目类别*/
+    @Excel(name = "医疗收费项目类别", width = 15)
+    @ApiModelProperty(value = "医疗收费项目类别")
+    private java.lang.String categoriesItems;
 	/**项目使用时间;MMDDYYYY hh24:mi:ss 字段。项目收费时间指每个项目使用的日期,该时间范围为住院日期到出院日期之间。与结算日期不同。如明细中无具体某个项目的使用日期,可以结算日期代替。*/
 	@Excel(name = "项目使用时间;MMDDYYYY hh24:mi:ss 字段。项目收费时间指每个项目使用的日期,该时间范围为住院日期到出院日期之间。与结算日期不同。如明细中无具体某个项目的使用日期,可以结算日期代替。", width = 15)
     @ApiModelProperty(value = "项目使用时间;MMDDYYYY hh24:mi:ss 字段。项目收费时间指每个项目使用的日期,该时间范围为住院日期到出院日期之间。与结算日期不同。如明细中无具体某个项目的使用日期,可以结算日期代替。")
@@ -120,6 +124,11 @@ public class HospitalizatioSettleDetail implements Serializable {
 	@Excel(name = "医保实际支付金额;该项目医保实际支付金额,医保医保实际支付金额=医保范围内可支付金额-拒付金额", width = 15)
     @ApiModelProperty(value = "医保实际支付金额;该项目医保实际支付金额,医保医保实际支付金额=医保范围内可支付金额-拒付金额")
     private java.math.BigDecimal bmiPayAmount;
+
+    @Excel(name = "个人支付金额")
+    @ApiModelProperty(value = "个人支付金额")
+    private java.math.BigDecimal individualPaymentAmount;
+
 	/**拒付金额;已经拒付金额*/
 	@Excel(name = "拒付金额;已经拒付金额", width = 15)
     @ApiModelProperty(value = "拒付金额;已经拒付金额")

+ 6 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/MasterAdmissionBill.java

@@ -162,6 +162,12 @@ public class MasterAdmissionBill implements Serializable {
 	@Excel(name = "患者年龄;如有患者年龄,则不需要患者出生日期。患者年龄或出生日期有一个字段即可", width = 15)
     @ApiModelProperty(value = "患者年龄;如有患者年龄,则不需要患者出生日期。患者年龄或出生日期有一个字段即可")
     private java.lang.Integer patientAge;
+
+    @Excel(name = "就诊日期", width = 15, format =  "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8",pattern =  "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern= "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "就诊日期")
+    private java.util.Date visitTime;
 	/**住院医疗类型;正常住院、日间手术*/
 	@Excel(name = "住院医疗类型;正常住院、日间手术", width = 15)
     @ApiModelProperty(value = "住院医疗类型;正常住院、日间手术")

+ 6 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/OutpatientSettleBill.java

@@ -140,6 +140,12 @@ public class OutpatientSettleBill implements Serializable {
 	@Excel(name = "人员类别;在岗职工、退休职工、居民医保", width = 15)
     @ApiModelProperty(value = "人员类别;在岗职工、退休职工、居民医保")
     private java.lang.String benefitGroupId;
+
+    @Excel(name = "就诊日期", width = 15, format =  "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8",pattern =  "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern= "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "就诊日期")
+    private java.util.Date visitTime;
 	/**就医类型;普通门诊、门慢、门特*/
 	@Excel(name = "就医类型;普通门诊、门慢、门特", width = 15)
     @ApiModelProperty(value = "就医类型;普通门诊、门慢、门特")

+ 9 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/OutpatientSettlementDetails.java

@@ -100,6 +100,10 @@ public class OutpatientSettlementDetails implements Serializable {
 	@Excel(name = "用药天数;项目为药品时填写", width = 15)
     @ApiModelProperty(value = "用药天数;项目为药品时填写")
     private java.lang.Integer useDay;
+    /**医疗收费项目类别*/
+    @Excel(name = "医疗收费项目类别", width = 15)
+    @ApiModelProperty(value = "医疗收费项目类别")
+    private java.lang.String categoriesItems;
 	/**医保范围内可支付金额;该项目医保范围内金额*/
 	@Excel(name = "医保范围内可支付金额;该项目医保范围内金额", width = 15)
     @ApiModelProperty(value = "医保范围内可支付金额;该项目医保范围内金额")
@@ -108,6 +112,11 @@ public class OutpatientSettlementDetails implements Serializable {
 	@Excel(name = "医保实际支付金额;该项目医保实际支付金额,医保医保实际支付金额=医保范围内可支付金额-拒付金额", width = 15)
     @ApiModelProperty(value = "医保实际支付金额;该项目医保实际支付金额,医保医保实际支付金额=医保范围内可支付金额-拒付金额")
     private java.math.BigDecimal bmiPayAmount;
+
+    @Excel(name = "个人支付金额")
+    @ApiModelProperty(value = "个人支付金额")
+    private java.math.BigDecimal individualPaymentAmount;
+
 	/**拒付金额;已经拒付金额*/
 	@Excel(name = "拒付金额;已经拒付金额", width = 15)
     @ApiModelProperty(value = "拒付金额;已经拒付金额")

+ 3 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/mapper/MedicalInsRuleProjectMapper.java

@@ -3,6 +3,7 @@ package org.jeecg.modules.medical.mapper;
 import java.util.List;
 
 import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.medical.common.bo.ExportRuleFieldDTO;
 import org.jeecg.modules.medical.common.bo.ExportRuleTitleDTO;
 import org.jeecg.modules.medical.entity.MedicalInsRuleProject;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -16,4 +17,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 public interface MedicalInsRuleProjectMapper extends BaseMapper<MedicalInsRuleProject> {
 
     ExportRuleTitleDTO selectTitleNameById(@Param("id") Integer id);
+
+    List<ExportRuleFieldDTO> selectRuleFieldListByFieldList(@Param("fieldList") List<String> fieldList);
 }

+ 16 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/mapper/xml/MedicalInsRuleProjectMapper.xml

@@ -11,4 +11,20 @@
         WHERE
             id = #{id,jdbcType=INTEGER}
     </select>
+
+    <select id="selectRuleFieldListByFieldList"
+            resultType="org.jeecg.modules.medical.common.bo.ExportRuleFieldDTO">
+        SELECT
+            item.item_text AS itemText,
+            item.item_value AS itemValue
+        FROM
+            sys_dict_item item
+                INNER JOIN sys_dict dict ON dict.id = item.dict_id
+        <where>
+            AND item.item_value IN
+            <foreach collection="fieldList" open="(" separator="," close=")" item="field">
+                #{field,jdbcType=VARCHAR}
+            </foreach>
+        </where>
+    </select>
 </mapper>

+ 22 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/ruleengine/FactorEnchangeFactory.java

@@ -9,6 +9,7 @@ import org.jeecg.common.constant.CommonConstant;
 import org.jeecg.common.util.SpringContextUtils;
 import org.jeecg.modules.medical.Constant;
 import org.jeecg.modules.medical.EnchanceTypeEnum;
+import org.jeecg.modules.medical.SystemEventAttrConstant;
 import org.jeecg.modules.medical.entity.AdvanceWarningAudit;
 import org.jeecg.modules.medical.entity.AdvanceWarningAuditDetail;
 import org.jeecg.modules.medical.entity.AfterwardsAudit;
@@ -309,6 +310,17 @@ public class FactorEnchangeFactory {
                 BigDecimal otherAmount = (BigDecimal) otherItemMap.getOrDefault(Constant.AMOUNT_KEY, 0);
                 midIncidentAuditDetail.setAmount(otherAmount.doubleValue());
                 midIncidentAuditDetail.setProjectType(otherItemMap.getOrDefault(Constant.PROJECT_TYPE_KEY, "default").toString());
+
+                midIncidentAuditDetail.setDoseDay((Integer) otherItemMap.getOrDefault(SystemEventAttrConstant.DOSE_DAY, 0));
+                midIncidentAuditDetail.setPrice((BigDecimal) otherItemMap.getOrDefault(SystemEventAttrConstant.PRICE, 0));
+                midIncidentAuditDetail.setDoseForm((String) otherItemMap.getOrDefault(SystemEventAttrConstant.DOSE_FORM, ""));
+                midIncidentAuditDetail.setTakeFrequence((String) otherItemMap.getOrDefault(SystemEventAttrConstant.TAKE_FREQUENCE, ""));
+                midIncidentAuditDetail.setSingleDoseNumber((Integer) otherItemMap.getOrDefault(SystemEventAttrConstant.SINGLE_DOSE_NUMBER, 0));
+                midIncidentAuditDetail.setSingleDoseUnit((String) otherItemMap.getOrDefault(SystemEventAttrConstant.SINGLE_DOSE_UNIT, ""));
+                midIncidentAuditDetail.setMedicalSpecification((String) otherItemMap.getOrDefault(SystemEventAttrConstant.MEDICAL_SPECIFICATION, ""));
+                midIncidentAuditDetail.setMedicalNumber((Float) otherItemMap.getOrDefault(SystemEventAttrConstant.QUANTITY, 0));
+                midIncidentAuditDetail.setDoseUnit((String) otherItemMap.getOrDefault(SystemEventAttrConstant.DOSE_UNIT, ""));
+                midIncidentAuditDetail.setUseDay((Integer) otherItemMap.getOrDefault(SystemEventAttrConstant.USE_DAY, 0));
                 otherList.add(midIncidentAuditDetail);
             }
             midIncidentAuditDetailService.saveBatch(otherList);
@@ -339,7 +351,16 @@ public class FactorEnchangeFactory {
             midIncidentAuditDetail.setProejctName(itemMap.get(Constant.PROJECT_NAME_KEY).toString());
             midIncidentAuditDetail.setMedicalProjectCode(itemMap.get(Constant.MEDICAL_PROJECT_CODE_KEY).toString());
             midIncidentAuditDetail.setMedicalProjectName(itemMap.get(Constant.MEDICAL_PROJECT_NAME_KEY).toString());
-
+            midIncidentAuditDetail.setDoseDay((Integer) itemMap.getOrDefault(SystemEventAttrConstant.DOSE_DAY, 0));
+            midIncidentAuditDetail.setPrice((BigDecimal) itemMap.getOrDefault(SystemEventAttrConstant.PRICE, 0));
+            midIncidentAuditDetail.setDoseForm((String) itemMap.getOrDefault(SystemEventAttrConstant.DOSE_FORM, ""));
+            midIncidentAuditDetail.setTakeFrequence((String) itemMap.getOrDefault(SystemEventAttrConstant.TAKE_FREQUENCE, ""));
+            midIncidentAuditDetail.setSingleDoseNumber((Integer) itemMap.getOrDefault(SystemEventAttrConstant.SINGLE_DOSE_NUMBER, 0));
+            midIncidentAuditDetail.setSingleDoseUnit((String) itemMap.getOrDefault(SystemEventAttrConstant.SINGLE_DOSE_UNIT, ""));
+            midIncidentAuditDetail.setMedicalSpecification((String) itemMap.getOrDefault(SystemEventAttrConstant.MEDICAL_SPECIFICATION, ""));
+            midIncidentAuditDetail.setMedicalNumber((Float) itemMap.getOrDefault(SystemEventAttrConstant.QUANTITY, 0));
+            midIncidentAuditDetail.setDoseUnit((String) itemMap.getOrDefault(SystemEventAttrConstant.DOSE_UNIT, ""));
+            midIncidentAuditDetail.setUseDay((Integer) itemMap.getOrDefault(SystemEventAttrConstant.USE_DAY, 0));
             midIncidentAuditDetail.setProjectType(itemMap.getOrDefault(Constant.PROJECT_TYPE_KEY, "default").toString());
             midIncidentAuditService.lambdaUpdate().setSql("amount = amount +" + amount.doubleValue()).eq(MidIncidentAudit::getId, midIncidentAudit.getId()).update();
 

+ 2 - 2
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/ruleengine/RuleEngine.java

@@ -398,8 +398,8 @@ public class RuleEngine {
                 midIncidentVisitDetailLog.setOrderCatalog(adviceDetailsVO.getOrder_catalog());
                 midIncidentVisitDetailLog.setSingleDoseNumber(adviceDetailsVO.getSingle_dose_number());
                 midIncidentVisitDetailLog.setSingleDoseUnit(adviceDetailsVO.getSingle_dose_unit());
-                midIncidentVisitDetailLog.setMedicalDeptCode(adviceDetailsVO.getMedical_project_code());
-                midIncidentVisitDetailLog.setMedicalDeptName(adviceDetailsVO.getMedical_project_name());
+                midIncidentVisitDetailLog.setMedicalDeptCode(midIncidentWarningVO.getMedical_dept_code());
+                midIncidentVisitDetailLog.setMedicalDeptName(midIncidentWarningVO.getMedical_dept_name());
                 midIncidentVisitDetailLog.setMedicalProjectName(adviceDetailsVO.getMedical_project_name());
                 midIncidentVisitDetailLog.setTakeFrequence(adviceDetailsVO.getTake_frequence());
                 midIncidentVisitDetailLog.setMedicalSpecification(adviceDetailsVO.getMedical_specification());

+ 14 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/service/IMedicalInsRuleProjectService.java

@@ -1,6 +1,7 @@
 package org.jeecg.modules.medical.service;
 
 import org.jeecg.common.api.vo.Result;
+import org.jeecg.modules.medical.common.bo.ExportRuleTitleDTO;
 import org.jeecg.modules.medical.entity.MedicalInsRuleProject;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.springframework.web.servlet.ModelAndView;
@@ -8,6 +9,8 @@ import org.springframework.web.servlet.ModelAndView;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.UnsupportedEncodingException;
+import java.util.List;
+import java.util.Map;
 
 /**
  * @Description: medical_ins_rule_project
@@ -19,5 +22,15 @@ public interface IMedicalInsRuleProjectService extends IService<MedicalInsRulePr
 
     ModelAndView exportTemplateXls(HttpServletRequest request, MedicalInsRuleProject object, Class<MedicalInsRuleProject> clazz, String title) throws UnsupportedEncodingException;
 
-    Result<?> importTemplateExcel(HttpServletRequest request, HttpServletResponse response, Class<MedicalInsRuleProject> medicalInsRuleProjectClass);
+    Result<?> importTemplateExcel(HttpServletRequest request, HttpServletResponse response,
+                                  Class<MedicalInsRuleProject> medicalInsRuleProjectClass, Map<String, Integer> args1);
+
+    /**
+     * 根据已有数据,检查数据库中是否存在
+     *
+     * @param list
+     * @param exportRuleTitle
+     * @return
+     */
+    List<MedicalInsRuleProject> loadDbExistsList(List<MedicalInsRuleProject> list, ExportRuleTitleDTO exportRuleTitle);
 }

+ 141 - 9
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/service/impl/MedicalInsRuleProjectServiceImpl.java

@@ -1,29 +1,36 @@
 package org.jeecg.modules.medical.service.impl;
 
+import com.alibaba.fastjson.util.BiFunction;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import net.sf.saxon.s9api.TeeDestination;
 import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.exception.JeecgBootException;
 import org.jeecg.common.system.query.QueryGenerator;
-import org.jeecg.common.system.vo.DictDto;
+import org.jeecg.common.system.util.JwtUtil;
 import org.jeecg.common.system.vo.LoginUser;
 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.common.bo.ExportRuleFieldDTO;
 import org.jeecg.modules.medical.common.bo.ExportRuleTitleDTO;
+import org.jeecg.modules.medical.entity.MaterialItems;
 import org.jeecg.modules.medical.entity.MedicalInsRuleProject;
 import org.jeecg.modules.medical.mapper.MedicalInsRuleProjectMapper;
 import org.jeecg.modules.medical.service.IMedicalInsRuleProjectService;
+import org.jeecg.modules.system.service.ISysDataSourceService;
 import org.jeecg.modules.system.service.ISysDictService;
+import org.jeecg.modules.utils.DefaultExcelImportServer;
 import org.jeecg.modules.utils.DefaultExcelImportUtil;
-import org.jeecgframework.poi.excel.ExcelImportUtil;
 import org.jeecgframework.poi.excel.annotation.Excel;
 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.jeecgframework.poi.util.PoiPublicUtil;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
@@ -40,10 +47,10 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
-import java.lang.reflect.Array;
 import java.lang.reflect.Field;
 import java.net.URLEncoder;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -57,10 +64,14 @@ import java.util.stream.Collectors;
 @RequiredArgsConstructor(onConstructor = @__(@Autowired))
 public class MedicalInsRuleProjectServiceImpl extends ServiceImpl<MedicalInsRuleProjectMapper, MedicalInsRuleProject> implements IMedicalInsRuleProjectService {
 
+    public static final String PROJECTCODE = "projectCode";
+    public static final String CORRELATIONPROJECTCODE = "correlationProjectCode";
+
     @Value("${jeecg.path.upload}")
     private String upLoadPath;
 
     private final ISysDictService sysDictService;
+    private final ExcelImportUtilService<MedicalInsRuleProject, String> excelImportUtilService;
 
     @Override
     public ModelAndView exportTemplateXls(HttpServletRequest request, MedicalInsRuleProject object, Class<MedicalInsRuleProject> clazz, String title) throws UnsupportedEncodingException {
@@ -148,7 +159,25 @@ public class MedicalInsRuleProjectServiceImpl extends ServiceImpl<MedicalInsRule
 
     @Transactional(readOnly = false)
     @Override
-    public Result<?> importTemplateExcel(HttpServletRequest request, HttpServletResponse response, Class<MedicalInsRuleProject> medicalInsRuleProjectClass) {
+    public Result<?> importTemplateExcel(HttpServletRequest request, HttpServletResponse response,
+                                         Class<MedicalInsRuleProject> medicalInsRuleProjectClass, Map<String, Integer> args1) {
+
+        String username = "";
+        try {
+            username = JwtUtil.getUsername(request.getHeader("X-Access-Token"));
+        } catch (Exception e) {
+            log.error("找不到用户登录的tokne");
+        }
+        final String finalUsername = username;
+        if (CollectionUtils.isEmpty(args1) || args1.containsKey("id")) {
+            log.error("导入时,必须携带项目规则id,参数为id");
+            throw new JeecgBootException("项目规则id不可为空");
+        }
+        Integer id = args1.get("id");
+        if (null == id) {
+            log.error("导入时,必须携带项目规则id,参数为id, id为null");
+            throw new JeecgBootException("项目规则id不可为空");
+        }
 
 
         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
@@ -163,24 +192,32 @@ public class MedicalInsRuleProjectServiceImpl extends ServiceImpl<MedicalInsRule
 
 
             //需要ID
-            ExportRuleTitleDTO exportRuleTitle = baseMapper.selectTitleNameById(2);
+            ExportRuleTitleDTO exportRuleTitle = baseMapper.selectTitleNameById(id);
             if (null == exportRuleTitle) {
                 log.error("根据规则id={},获取不到规则表头配置");
                 throw new JeecgBootException("找不到规则表头");
             }
+            // 查询字段名称
+            List<String> fieldList = new ArrayList<>();
             List<String> reserveList = new ArrayList<>();
             if (StringUtils.hasText(exportRuleTitle.getSelectedRoles())) {
                 String[] split = exportRuleTitle.getSelectedRoles().split(",");
                 if (split.length > 0) {
                     // 获取标头
-                    List<MedicalDto> dictDtos = sysDictService.queryDictByKeys(new ArrayList<>(Arrays.asList(split)));
+                    fieldList = new ArrayList<>(Arrays.asList(split));
+                    List<MedicalDto> dictDtos = sysDictService.queryDictByKeys(fieldList);
                     if (!CollectionUtils.isEmpty(dictDtos)) {
                         reserveList = dictDtos.stream().map(MedicalDto::getText).collect(Collectors.toList());
                     }
                 }
             }
+            // 获取本规则的字段名
+            List<ExportRuleFieldDTO> ruleFieldDTOS = baseMapper.selectRuleFieldListByFieldList(fieldList);
+            if (CollectionUtils.isEmpty(ruleFieldDTOS)) {
+                log.error("找不到规则={}对应的字段映射,字段={}", id);
+                throw new JeecgBootException("获取不到规则对应的字段映射");
+            }
 
-            LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
 
 
             Field[] fields = PoiPublicUtil.getClassFields(medicalInsRuleProjectClass);
@@ -207,11 +244,50 @@ public class MedicalInsRuleProjectServiceImpl extends ServiceImpl<MedicalInsRule
             // 设置忽略列表
             params.setIgnoreHeaderList(ignoreField);
             try {
+                List<String> excelFieldLists = new DefaultExcelImportServer().getExcelFieldLists(file.getInputStream(), 0);
+                if (CollectionUtils.isEmpty(excelFieldLists)) {
+                    log.error("规则导入时,上传的文档没有找不到标题头");
+                    throw new JeecgBootException("规则导入时,找不到Excel的标题头,请确认模板是否正确");
+                }
+                //检查有没有比预期的多
+                //检查有没有比预期的少
+
+
 //                List<MedicalInsRuleProject> list = ExcelImportUtil.importExcel(file.getInputStream(), MedicalInsRuleProject.class, params);
-                List<MedicalInsRuleProject> list = DefaultExcelImportUtil.importExcel(file.getInputStream(), MedicalInsRuleProject.class, params);
+                List<MedicalInsRuleProject> list = DefaultExcelImportUtil
+                        .importExcel(file.getInputStream(), MedicalInsRuleProject.class, params);
                 //update-begin-author:taoyan date:20190528 for:批量插入数据
+
+                // 根据条件,查询数据库去重。
+                List<MedicalInsRuleProject> dbExistsList = this.loadDbExistsList(list, exportRuleTitle);
+                // 更新列表
+                List<MedicalInsRuleProject> updateList = new ArrayList<>();
+                // 新增列表
+                List<MedicalInsRuleProject> 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)) {
+                        this.updateBatchById(updateList, 500);
+                    }
+                    // 取出差集
+                    instalList = excelImportUtilService.getInsertDatas(list, dbExistsList, this::getDuplicateRm);
+                    //extractDiffSet.apply(list, dbExistsList);
+                }
                 long start = System.currentTimeMillis();
-                this.saveBatch(list);
+                if (!CollectionUtils.isEmpty(instalList)) {
+//                    this.saveBatch(instalList, 500);
+//                    insertService.apply(instalList, 500);
+                    this.saveBatch(instalList, 500);
+                }
                 //400条 saveBatch消耗时间1592毫秒  循环插入消耗时间1947毫秒
                 //1200条  saveBatch消耗时间3687毫秒 循环插入消耗时间5212毫秒
                 log.info("消耗时间" + (System.currentTimeMillis() - start) + "毫秒");
@@ -237,4 +313,60 @@ public class MedicalInsRuleProjectServiceImpl extends ServiceImpl<MedicalInsRule
         }
         return Result.error("文件导入失败!");
     }
+
+    private String getDuplicateRm(MedicalInsRuleProject medicalInsRuleProject) {
+        return medicalInsRuleProject.getProjectCode().concat(ifnull(medicalInsRuleProject.getCorrelationProjectCode()));
+    }
+
+
+    private String ifnull(String str) {
+        if (StringUtils.hasText(str)) {
+            return str;
+        }
+        return "";
+    }
+
+    /**
+     * 根据导入数据,检查数据库是否存在
+     *
+     * @param list
+     * @param exportRuleTitle
+     * @return
+     */
+    @Override
+    public List<MedicalInsRuleProject> loadDbExistsList(List<MedicalInsRuleProject> list, ExportRuleTitleDTO exportRuleTitle) {
+        // 固定这两个字段,projectCode为必须,correlationProjectCode为可选
+        if (exportRuleTitle.getSelectedRoles().indexOf(PROJECTCODE) <=  -1) {
+            log.warn("导入时,没有找到字段={}, 本次导入不做导入数据与数据库去重", PROJECTCODE);
+            return new ArrayList<>();
+        }
+        if (CollectionUtils.isEmpty(list)) {
+            return new ArrayList<>();
+        }
+        QueryWrapper<MedicalInsRuleProject> queryWrapper = new QueryWrapper<MedicalInsRuleProject>();
+        for (MedicalInsRuleProject item : list) {
+            String projectCode = item.getProjectCode();
+            if (!StringUtils.hasText(projectCode)) {
+                log.error("根据模板导入时,没有找到projectCode请检查导入文件内容");
+                throw new JeecgBootException("没有找到项目编码,请检查导入内容");
+            }
+            String projectCodeField = oConvertUtils.camelToUnderline("projectCode");
+            queryWrapper.in(projectCodeField, projectCodeField);
+            if (exportRuleTitle.getSelectedRoles().indexOf(CORRELATIONPROJECTCODE) > -1) {
+                String correlationProjectCodeField = oConvertUtils.camelToUnderline(CORRELATIONPROJECTCODE);
+                String correlationProjectCode = item.getCorrelationProjectCode();
+                if (StringUtils.hasText(correlationProjectCode)) {
+                    queryWrapper.in(correlationProjectCodeField, correlationProjectCode);
+                }
+            }
+        }
+        return this.list(queryWrapper);
+    }
+
+    public static void main(String[] args) {
+//        String role = "a,b,c";
+//        System.out.println(role.indexOf("a") > -1);
+        String s = oConvertUtils.camelToUnderline("projectCode");
+        System.out.println(s);
+    }
 }

+ 57 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/utils/DefaultExcelImportServer.java

@@ -1,5 +1,6 @@
 package org.jeecg.modules.utils;
 
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
@@ -7,6 +8,8 @@ import org.apache.poi.ss.formula.functions.T;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.xssf.usermodel.XSSFSheet;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.hibernate.engine.jdbc.ReaderInputStream;
+import org.jeecg.common.exception.JeecgBootException;
 import org.jeecgframework.core.util.ApplicationContextUtil;
 import org.jeecgframework.poi.excel.annotation.ExcelTarget;
 import org.jeecgframework.poi.excel.entity.ImportParams;
@@ -32,6 +35,7 @@ import java.io.*;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.nio.file.Files;
 import java.util.*;
 
 /**
@@ -40,6 +44,7 @@ import java.util.*;
  * @description '这里描写类的用途'
  * @parentProject medical-java
  */
+@Slf4j
 public class DefaultExcelImportServer extends ImportBaseService {
 
     private final static Logger LOGGER = LoggerFactory.getLogger(ExcelImportServer.class);
@@ -589,4 +594,56 @@ public class DefaultExcelImportServer extends ImportBaseService {
         font.setColor(Font.COLOR_RED);
         errorCellStyle.setFont(font);
     }
+
+    /**
+     * 根据文件流,获取上传的Excel的表头
+     * @param inputstream
+     * @param sheetIdx
+     * @return
+     */
+    public List<String> getExcelFieldLists(InputStream inputstream, Integer sheetIdx) {
+        List<String> result = new ArrayList<>();
+        Workbook book = null;
+        if (!(inputstream.markSupported())) {
+            inputstream = new PushbackInputStream(inputstream, 8);
+        }
+        try {
+            book = WorkbookFactory.create(inputstream);
+            createErrorCellStyle(book);
+            Sheet sheet = book.getSheetAt(sheetIdx);
+            Iterator<Cell> cellTitle = null;
+            ExcelCollectionParams collectionParams = null;
+            Row headRow = null;
+            int headBegin = 2;
+            //update_begin-author:taoyan date:2020622 for:当文件行数小于代码里设置的TitleRows时headRow一直为空就会出现死循环
+            int allRowNum = sheet.getPhysicalNumberOfRows();
+            //找到首行表头,每个sheet都必须至少有一行表头
+            while(headRow == null && headBegin < allRowNum){
+                headRow = sheet.getRow(headBegin++);
+            }
+            if(headRow==null){
+                throw new Exception("不识别该文件");
+            }
+            cellTitle = headRow.cellIterator();
+            while (cellTitle.hasNext()) {
+                Cell cell = cellTitle.next();
+                String value = getKeyValue(cell);
+                if (StringUtils.isNotEmpty(value)) {
+                    log.info("表头字段={}", value);
+                    result.add(value);
+                }
+            }
+            return result;
+        } catch (Exception e) {
+            log.error("获取表字段头失败,错误信息={}", e.getMessage());
+            throw new JeecgBootException("获取表头失败,请检查");
+        }
+    }
+
+    public static void main(String[] args) throws IOException {
+        DefaultExcelImportServer ss = new DefaultExcelImportServer();
+        File file = new File("C:\\Users\\soft01\\Desktop\\999.xls");
+
+        ss.getExcelFieldLists(Files.newInputStream(file.toPath()), 0);
+    }
 }