Browse Source

添加异地结算统计功能

lighter 3 years ago
parent
commit
2f1c3b425e

+ 5 - 0
src/main/java/thyyxxk/webserver/controller/medicalinsurance/SiQueryController.java

@@ -124,4 +124,9 @@ public class SiQueryController {
     public ResultVo<List<Integer>> fetchSiTimesList(@RequestParam("patNo") String patNo) {
         return service.fetchSiTimesList(patNo);
     }
+
+    @PostMapping("/selectSetlinfoStatistics")
+    public ResultVo<List<SetlStatisticResult>> selectSetlinfoStatistics(@RequestBody @Validated SetlCondition condition) {
+        return service.selectSetlinfoStatistics(condition);
+    }
 }

+ 31 - 9
src/main/java/thyyxxk/webserver/dao/his/medicalinsurance/SiQueryDao.java

@@ -23,7 +23,7 @@ public interface SiQueryDao {
      *
      * @param patNo 门诊号
      * @return 门诊患者的身份证和姓名
-     * */
+     */
     @Select("select social_no,rtrim(name) as name,times from mz_patient_mi where patient_id=#{patNo}")
     QryPsnBsInfo selectMzSocialAndName(@Param("patNo") String patNo);
 
@@ -71,9 +71,9 @@ public interface SiQueryDao {
     /**
      * 获取患者的医保基本信息
      *
-     * @param patNo 住院号
-     * @param times 住院次数
-     * @param ledgerSn    账页号
+     * @param patNo    住院号
+     * @param times    住院次数
+     * @param ledgerSn 账页号
      * @return 医保基本信息
      */
     @Select("select * from t_si_pat_info where pat_no=#{patNo} and times=#{times} and ledger_sn=#{ledgerSn}")
@@ -96,14 +96,14 @@ public interface SiQueryDao {
     /**
      * 获取患者的医保个人编号
      *
-     * @param patNo 住院号
+     * @param patNo   住院号
      * @param medType 医疗类别
      * @return 患者的医保个人编号
      */
     @Select("select top 1 insuplc_admdvs as code, psn_no as name from t_si_pat_info where pat_no=#{patNo} and med_type=#{medType} " +
             "and insuplc_admdvs is not null ")
     PureCodeName selectPsnNoByPatNoAndMedType(@Param("patNo") String patNo,
-                                        @Param("medType") String medType);
+                                              @Param("medType") String medType);
 
     /**
      * 获取患者的医保基本信息
@@ -126,9 +126,9 @@ public interface SiQueryDao {
     @Update("update t_si_pat_info set mdtrt_id=#{nullCtnt}, adm_reg_msgid=#{nullCtnt}, setl_id=#{nullCtnt} " +
             "where pat_no=#{inpatientNo} and times=#{admissTimes} and ledger_sn=#{ledgerSn}")
     void clearMdtrtIdForZy(@Param("inpatientNo") String inpatientNo,
-                      @Param("admissTimes") int admissTimes,
-                      @Param("ledgerSn") int ledgerSn,
-                      @Param("nullCtnt") String nullCtnt);
+                           @Param("admissTimes") int admissTimes,
+                           @Param("ledgerSn") int ledgerSn,
+                           @Param("nullCtnt") String nullCtnt);
 
     @Select("select type=#{type},pat_no,times,ledger_sn,psn_name,setl_id,gend,setl_time,medfee_sumamt,psn_no " +
             "from t_si_setlinfo where pat_no=#{patNo} and times=#{times} and isnull(revoked,0)!=1")
@@ -274,4 +274,26 @@ public interface SiQueryDao {
                           @Param("sn") int sn,
                           @Param("mdtrtId") String mdtrtId,
                           @Param("insutype") String insutype);
+
+    @Select("select a.pat_no,a.times,a.ledger_sn,b.insuplc_admdvs,a.medfee_sumamt,a.insutype,a.hifmi_pay, " +
+            "a.hifp_pay,a.cvlserv_pay,a.fund_pay_sumamt,a.acct_pay from t_si_setlinfo a, t_si_pat_info b " +
+            "where a.revoked=0 and a.setl_type=21 and a.insutype=#{insutype} and a.setl_time>=#{begntime} " +
+            "and a.setl_time<=#{endtime} and a.pat_no=b.pat_no and a.times=b.times and a.ledger_sn=b.ledger_sn " +
+            "and b.insuplc_admdvs!='439900' and b.insuplc_admdvs like '43%' and b.insuplc_admdvs not like '4301%' ")
+    List<BaseSetlStatistics> selectBaseSetlStatisticsInProvince(@Param("begntime") String begntime,
+                                                                @Param("endtime") String endtime,
+                                                                @Param("insutype") String insutype);
+
+    @Select("select a.pat_no,a.times,a.ledger_sn,b.insuplc_admdvs,a.medfee_sumamt,a.insutype,a.hifmi_pay, " +
+            "a.hifp_pay,a.cvlserv_pay,a.fund_pay_sumamt,a.acct_pay from t_si_setlinfo a, t_si_pat_info b " +
+            "where a.revoked=0 and a.setl_type=21 and a.insutype=#{insutype} and a.setl_time>=#{begntime} " +
+            "and a.setl_time<=#{endtime} and a.pat_no=b.pat_no and a.times=b.times and a.ledger_sn=b.ledger_sn " +
+            "and b.insuplc_admdvs!='439900' and b.insuplc_admdvs not like '43%' ")
+    List<BaseSetlStatistics> selectBaseSetlStatisticsOutProvince(@Param("begntime") String begntime,
+                                                                @Param("endtime") String endtime,
+                                                                @Param("insutype") String insutype);
+
+    @Select("select name from t_si_admdvs where code=#{code}")
+    String selectAdmdvsName(@Param("code") String code);
+
 }

+ 33 - 0
src/main/java/thyyxxk/webserver/entity/medicalinsurance/query/BaseSetlStatistics.java

@@ -0,0 +1,33 @@
+package thyyxxk.webserver.entity.medicalinsurance.query;
+
+import lombok.Data;
+
+@Data
+public class BaseSetlStatistics {
+    private String patNo;
+    private Integer times;
+    private Integer ledgerSn;
+    private String insuplcAdmdvs;
+    private String medfeeSumamt;
+    private String insutype;
+    /**
+     * 基本医疗保险统筹基金支出
+     */
+    private String hifpPay;
+    /**
+     * 居民大病保险资金支出
+     */
+    private String hifmiPay;
+    /**
+     * 公务员医疗补助资金支出
+     */
+    private String cvlservPay;
+    /**
+     * 基金支付总额
+     */
+    private String fundPaySumamt;
+    /**
+     * 个人账户支出
+     */
+    private String acctPay;
+}

+ 16 - 0
src/main/java/thyyxxk/webserver/entity/medicalinsurance/query/SetlCondition.java

@@ -0,0 +1,16 @@
+package thyyxxk.webserver.entity.medicalinsurance.query;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+@Data
+public class SetlCondition {
+    @NotBlank(message = "请选择年月!")
+    private String month;
+    @NotBlank(message = "请选择险种类型!")
+    private String insutype;
+    @NotNull(message = "请选择参保地!")
+    private Integer admdvs;
+}

+ 16 - 0
src/main/java/thyyxxk/webserver/entity/medicalinsurance/query/SetlStatisticResult.java

@@ -0,0 +1,16 @@
+package thyyxxk.webserver.entity.medicalinsurance.query;
+
+import lombok.Data;
+
+@Data
+public class SetlStatisticResult {
+    private String admdvsName;
+    private Integer psnSumamt;
+    private String medfeeSumamt;
+    private String baseMedFundpaySumamt;
+    private String bigDssFundpaySumamt;
+    private String clvFundpaySumamt;
+    private String othFundpaySumamt;
+    private String acctpaySumamt;
+    private String fundpaySumamt;
+}

+ 79 - 0
src/main/java/thyyxxk/webserver/service/medicalinsurance/SiQueryService.java

@@ -1183,4 +1183,83 @@ public class SiQueryService {
     public ResultVo<List<SiMzMatnDise>> queryMzMatnDises() {
         return ResultVoUtil.success(dao.selectAllMzMatnDises());
     }
+
+    public ResultVo<List<SetlStatisticResult>> selectSetlinfoStatistics(SetlCondition condition) {
+        String begntime = condition.getMonth() + "-01 00:00:00.000";
+        String endtime = DateUtil.getMonthEndtime(condition.getMonth());
+        List<BaseSetlStatistics> baseStatistics;
+        if (condition.getAdmdvs() == 1) {
+            baseStatistics = dao.selectBaseSetlStatisticsInProvince(begntime, endtime, condition.getInsutype());
+        } else {
+            baseStatistics = dao.selectBaseSetlStatisticsOutProvince(begntime, endtime, condition.getInsutype());
+        }
+        if (null == baseStatistics || baseStatistics.isEmpty()) {
+            return ResultVoUtil.fail(ExceptionEnum.NO_DATA_EXIST);
+        }
+
+        Map<String, List<BaseSetlStatistics>> tempMap = new HashMap<>();
+        baseStatistics.forEach(itm -> {
+            String key = itm.getInsuplcAdmdvs();
+            if (tempMap.containsKey(key)) {
+                tempMap.get(key).add(itm);
+            } else {
+                List<BaseSetlStatistics> tempList = new ArrayList<>();
+                tempList.add(itm);
+                tempMap.put(key, tempList);
+            }
+        });
+
+        Map<String, List<BaseSetlStatistics>> admNameMap = new HashMap<>();
+        for (Map.Entry<String, List<BaseSetlStatistics>> entry : tempMap.entrySet()) {
+            String admdvs = entry.getKey();
+            String admdvsName = dao.selectRegionName(admdvs);
+            if (StringUtil.isBlank(admdvsName)) {
+                admdvsName = dao.selectAdmdvsName(admdvs);
+                if (StringUtil.isBlank(admdvsName)) {
+                    admdvs = admdvs.substring(0, 4) + "00";
+                    admdvsName = dao.selectRegionName(admdvs);
+                }
+            }
+            if (admNameMap.containsKey(admdvsName)) {
+                admNameMap.get(admdvsName).addAll(entry.getValue());
+            } else {
+                admNameMap.put(admdvsName, entry.getValue());
+            }
+        }
+
+        List<SetlStatisticResult> resultList = new ArrayList<>();
+        for (Map.Entry<String, List<BaseSetlStatistics>> entry : admNameMap.entrySet()) {
+            List<BaseSetlStatistics> mapStatistics = entry.getValue();
+            SetlStatisticResult resultItem = new SetlStatisticResult();
+            resultItem.setAdmdvsName(entry.getKey());
+            resultItem.setPsnSumamt(mapStatistics.size());
+            String medfeeSumamt = "0";
+            String baseMedFundpaySumamt = "0";
+            String bigDssFundpaySumamt = "0";
+            String clvFundpaySumamt = "0";
+            String acctpaySumamt = "0";
+            String othFundpaySumamt = "0";
+            String fundpaySumamt = "0";
+            for (BaseSetlStatistics itm : mapStatistics) {
+                medfeeSumamt = DecimalUtil.add(medfeeSumamt, itm.getMedfeeSumamt());
+                baseMedFundpaySumamt = DecimalUtil.add(baseMedFundpaySumamt, itm.getHifpPay());
+                bigDssFundpaySumamt = DecimalUtil.add(bigDssFundpaySumamt, itm.getHifmiPay());
+                clvFundpaySumamt = DecimalUtil.add(clvFundpaySumamt, itm.getCvlservPay());
+                acctpaySumamt = DecimalUtil.add(acctpaySumamt, itm.getAcctPay());
+                fundpaySumamt = DecimalUtil.add(fundpaySumamt, itm.getFundPaySumamt());
+                String othpay = DecimalUtil.minusLink(itm.getFundPaySumamt(), itm.getHifpPay(),
+                        itm.getHifmiPay(), itm.getCvlservPay(), itm.getAcctPay());
+                othFundpaySumamt = DecimalUtil.add(othFundpaySumamt, othpay);
+            }
+            resultItem.setMedfeeSumamt(medfeeSumamt);
+            resultItem.setBaseMedFundpaySumamt(baseMedFundpaySumamt);
+            resultItem.setBigDssFundpaySumamt(bigDssFundpaySumamt);
+            resultItem.setClvFundpaySumamt(clvFundpaySumamt);
+            resultItem.setAcctpaySumamt(acctpaySumamt);
+            resultItem.setOthFundpaySumamt(othFundpaySumamt);
+            resultItem.setFundpaySumamt(fundpaySumamt);
+            resultList.add(resultItem);
+        }
+        return ResultVoUtil.success(resultList);
+    }
 }

+ 14 - 0
src/main/java/thyyxxk/webserver/utils/DateUtil.java

@@ -74,6 +74,20 @@ public class DateUtil {
         return smdate.format(date) + " 23:59:59.999";
     }
 
+    public static String getMonthEndtime(String day) {
+        String[] split = day.split("-");
+        int year = Integer.parseInt(split[0]);
+        int month = Integer.parseInt(split[1]);
+        Calendar cal = Calendar.getInstance();
+        cal.set(Calendar.YEAR, year);
+        cal.set(Calendar.MONTH, month - 1);
+        cal.set(Calendar.DAY_OF_MONTH, 1);
+        cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DATE));
+        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+        String enddate =  df.format(cal.getTime());
+        return enddate + " 23:59:59.999";
+    }
+
     public static Date getDatetimeAfterCentury(Date date) {
         Calendar calendar = Calendar.getInstance();
         calendar.setTime(date);

+ 9 - 0
src/main/java/thyyxxk/webserver/utils/DecimalUtil.java

@@ -39,6 +39,15 @@ public class DecimalUtil {
         return ad.subtract(bd).setScale(2, RoundingMode.HALF_UP).toString();
     }
 
+    public static String minusLink(String a, String b, String c, String d, String e) {
+        BigDecimal ad = new BigDecimal(a);
+        BigDecimal bd = new BigDecimal(b);
+        BigDecimal cd = new BigDecimal(c);
+        BigDecimal dd = new BigDecimal(d);
+        BigDecimal ed = new BigDecimal(e);
+        return ad.subtract(bd).subtract(cd).subtract(dd).subtract(ed).setScale(2, RoundingMode.HALF_UP).toString();
+    }
+
     public static BigDecimal add(BigDecimal a, BigDecimal b) {
         return a.add(b).setScale(2, RoundingMode.HALF_UP);
     }

+ 0 - 3
src/main/java/thyyxxk/webserver/utils/SiUtil.java

@@ -46,9 +46,6 @@ public class SiUtil {
     }
 
     public static String getInstitutionArea(String insureArea) {
-        if ("".equals(insureArea)) {
-            return INSTITUTION_AREA;
-        }
         return insureArea.startsWith("4301") ? INSTITUTION_AREA : "439900";
     }