浏览代码

HIS与医保对账(住院、门诊)

lighter 2 年之前
父节点
当前提交
d39ce89b8c

+ 2 - 2
src/main/java/thyyxxk/webserver/controller/medicalinsurance/SiManageController.java

@@ -41,8 +41,8 @@ public class SiManageController {
     }
 
     @PostMapping("/institutionSettlementDetailCheck")
-    public ResultVo<List<InsSetlDetlChkRslt>> institutionSettlementDetailCheck(@RequestBody InsSetlDetlChk insSetlDetlChk) {
-        return service.institutionSettlementDetailCheck(insSetlDetlChk);
+    public ResultVo<List<InsSetlDetlChkRslt>> institutionSettlementDetailCheck(@RequestBody InstStlLdgChk instStlLdgChk) {
+        return service.institutionSettlementDetailCheck(instStlLdgChk);
     }
 
     @PostMapping("/uploadCatalogueContrast")

+ 21 - 7
src/main/java/thyyxxk/webserver/dao/his/medicalinsurance/SiManageDao.java

@@ -53,17 +53,31 @@ public interface SiManageDao {
                                                           @Param("start") String start,
                                                           @Param("end") String end);
 
-    @Select("select pat_no,times,ledger_sn,medfee_sumamt,acct_pay,fund_pay_sumamt,hosp_part_amt " +
-            "from t_si_setlinfo where setl_type=#{clrType} and revoked=0 and setl_time>=#{start} and setl_time<=#{end} ")
+    @Select("select visitId=pat_no+'_'+cast(times as varchar)+'_'+cast(ledger_sn as varchar), " +
+            "setl_id,mdtrt_id,psn_no,medins_setl_id as msgId,medfee_sumamt,acct_pay,fund_pay_sumamt, " +
+            "hosp_part_amt from t_si_setlinfo where setl_type=#{clrType} and revoked=0 and " +
+            "setl_time>=#{start} and setl_time<=#{end} ")
     List<InstSetlLdgChkBrf> selectSetlinfoBrfsForHisCheck(@Param("clrType") String clrType,
                                                           @Param("start") String start,
                                                           @Param("end") String end);
 
-    @Select("select rtrim(inpatient_no) as patNo,admiss_times as times,ledger_sn,total_charge as medfee_sumamt, " +
-            "acct_pay,fund_pay_sumamt,hosp_part_amt from zy_ledger_file where account_date>=#{start} and " +
-            "account_date<=#{end} and responce_type in ('ad','ae','af','ag','ah','ak') and ledger_sn>0")
-    List<InstSetlLdgChkBrf> selectLedgerBrfsForHisCheck(@Param("start") String start,
-                                                        @Param("end") String end);
+    @Select("select visitId=rtrim(inpatient_no)+'_'+cast(admiss_times as varchar)+'_'+cast(ledger_sn as varchar), " +
+            "total_charge as medfee_sumamt,acct_pay,fund_pay_sumamt,hosp_part_amt from zy_ledger_file where " +
+            "account_date>=#{start} and account_date<=#{end} and responce_type in ('ad','ae','af','ag','ah','ak') and ledger_sn>0")
+    List<InstSetlLdgChkBrf> selectHisZyBrfsForHisCheck(@Param("start") String start,
+                                                       @Param("end") String end);
+
+    @Select("select visitId=b.patient_id+'_'+cast(b.times as varchar)+'_0' from " +
+            "(select patient_id,times from mz_deposit_file where charge_date>=#{start} and charge_date<=#{end} " +
+            "and pay_mark=0 group by patient_id, times) a, " +
+            "(select patient_id,times from t_mt_receipt where input_date>=#{start} and input_date<=#{end} " +
+            "and yb_trans_flag=1 group by patient_id, times) " +
+            "b where a.patient_id=b.patient_id and a.times=b.times")
+    List<String> selectHisMzBrfsForHisCheck(@Param("start") String start,
+                                            @Param("end") String end);
+
+    @Select("select count(1) from mz_deposit_file where patient_id=#{patNo} and times=#{times} and pay_mark=0")
+    int mzDepositCount(@Param("patNo") String patNo, @Param("times") String times);
 
     @Select("select pat_no,times,ledger_sn,setl_id,mdtrt_id,psn_no,medfee_sumamt,acct_pay,fund_pay_sumamt,psn_cash_pay,hosp_part_amt " +
             "from t_si_setlinfo where clr_type=#{clrType} and revoked=0 and clr_optins=#{clrOptins} and fund_pay_sumamt!=0 " +

+ 0 - 81
src/main/java/thyyxxk/webserver/entity/medicalinsurance/manage/InsSetlDetlChk.java

@@ -1,81 +0,0 @@
-package thyyxxk.webserver.entity.medicalinsurance.manage;
-
-import com.alibaba.fastjson.annotation.JSONField;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import lombok.Data;
-import org.springframework.format.annotation.DateTimeFormat;
-
-import java.math.BigDecimal;
-import java.util.Date;
-
-/**
- * @description: 费用结算明细对账参数
- * @author: DingJie
- * @create: 2021/7/3010:58
- */
-@Data
-public class InsSetlDetlChk {
-    /**
-     * 结算经办机构
-     * */
-    @JSONField(name = "setl_optins")
-    private String setlOptins;
-    
-    /**
-     * 文件查询号
-     * */
-    @JSONField(name = "file_qury_no")
-    private String fileQuryNo;
-    
-    /**
-     * 对账开始日期
-     * */
-    @JSONField(name = "stmt_begndate")
-    @DateTimeFormat(pattern = "yyyy-MM-dd")
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    private Date stmtBegndate;
-    
-    /**
-     * 对账结束日期
-     * */
-    @JSONField(name = "stmt_enddate")
-    @DateTimeFormat(pattern = "yyyy-MM-dd")
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    private Date stmtEnddate;
-    
-    /**
-     * 医疗费总额
-     * */
-    @JSONField(name = "medfee_sumamt")
-    private BigDecimal medfeeSumamt;
-    
-    /**
-     * 基金支付总额
-     * */
-    @JSONField(name = "fund_pay_sumamt")
-    private BigDecimal fundPaySumamt;
-    
-    /**
-     * 现金支付金额
-     * */
-    @JSONField(name = "cash_payamt")
-    private BigDecimal cashPayamt;
-    
-    /**
-     * 定点医药机构结算笔数
-     * */
-    @JSONField(name = "fixmedins_setl_cnt")
-    private Integer fixmedinsSetlCnt;
-    
-    /**
-     * 清算类别
-     * */
-    @JSONField(name = "clr_type")
-    private String clrType;
-    
-    /**
-     * 退费结算标志
-     * */
-    @JSONField(name = "refd_setl_flag")
-    private String refdSetlFlag = "0";
-}

+ 31 - 0
src/main/java/thyyxxk/webserver/entity/medicalinsurance/manage/InsSetlDetlChkRslt.java

@@ -7,6 +7,7 @@ import lombok.Data;
  * */
 @Data
 public class InsSetlDetlChkRslt {
+    private String visitId;
     private String psnNo;
     private String mdtrtId;
     private String setlId;
@@ -17,6 +18,36 @@ public class InsSetlDetlChkRslt {
     private String medfeeSumamt;
     private String fundPaySumamt;
 
+    public InsSetlDetlChkRslt() {
+    }
+
+    public InsSetlDetlChkRslt(InstSetlLdgChkBrf brf) {
+        this.visitId = brf.getVisitId();
+        this.psnNo = brf.getPsnNo();
+        this.mdtrtId = brf.getMdtrtId();
+        this.setlId = brf.getSetlId();
+        this.msgId = brf.getMsgId();
+        this.memo = analyzeMemo(brf);
+        this.medfeeSumamt = this.memo.equals("对账成功。") ? brf.getMedfeeSumamt().toString() :
+                "医保:" + brf.getMedfeeSumamt() + ";<br/>HIS:" + brf.getMedfeeSumamt2();
+        this.fundPaySumamt = this.memo.equals("对账成功。") ? brf.getFundPaySumamt().toString() :
+                "医保:" + brf.getFundPaySumamt() + ";<br/>HIS:" + brf.getFundPaySumamt2();
+    }
+
+    private String analyzeMemo(InstSetlLdgChkBrf brf) {
+        if (null == brf.getMedfeeSumamt()) {
+            return "对账失败:不存在该笔医保结算记录。";
+        }
+        if (null == brf.getMedfeeSumamt2()) {
+            return "对账失败:不存在该笔HIS结算记录。";
+        }
+        if (brf.getMedfeeSumamt().compareTo(brf.getMedfeeSumamt2()) == 0 &&
+                brf.getFundPaySumamt().compareTo(brf.getFundPaySumamt2()) == 0) {
+            return "对账成功。";
+        }
+        return "对账失败:医保金额与HIS金额不一致。";
+    }
+
     public InsSetlDetlChkRslt(String[] arr) {
         psnNo = arr[0];
         mdtrtId = arr[1];

+ 22 - 3
src/main/java/thyyxxk/webserver/entity/medicalinsurance/manage/InstSetlLdgChkBrf.java

@@ -3,18 +3,37 @@ package thyyxxk.webserver.entity.medicalinsurance.manage;
 import lombok.Data;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 
 @Data
 public class InstSetlLdgChkBrf {
-    private String patNo;
-    private Integer times;
-    private Integer ledgerSn;
+    private String visitId;
     private String setlId;
     private String mdtrtId;
     private String psnNo;
+    private String msgId;
     private BigDecimal medfeeSumamt;
     private BigDecimal acctPay;
     private BigDecimal fundPaySumamt;
     private BigDecimal psnCashPay;
     private BigDecimal hospPartAmt;
+
+    private BigDecimal medfeeSumamt2;
+    private BigDecimal fundPaySumamt2;
+
+    public BigDecimal getMedfeeSumamt() {
+        return null == medfeeSumamt ? null : medfeeSumamt.setScale(2, RoundingMode.HALF_UP);
+    }
+
+    public BigDecimal getFundPaySumamt() {
+        return null == fundPaySumamt ? null : fundPaySumamt.setScale(2, RoundingMode.HALF_UP);
+    }
+
+    public BigDecimal getMedfeeSumamt2() {
+        return null == medfeeSumamt2 ? null : medfeeSumamt2.setScale(2, RoundingMode.HALF_UP);
+    }
+
+    public BigDecimal getFundPaySumamt2() {
+        return null == fundPaySumamt2 ? null : fundPaySumamt2.setScale(2, RoundingMode.HALF_UP);
+    }
 }

+ 18 - 0
src/main/java/thyyxxk/webserver/entity/medicalinsurance/manage/InstStlLdgChk.java

@@ -77,6 +77,24 @@ public class InstStlLdgChk {
     @JSONField(name = "fixmedins_setl_cnt")
     private Integer fixmedinsSetlCnt;
 
+    /**
+     * 文件查询号
+     * */
+    @JSONField(name = "file_qury_no")
+    private String fileQuryNo;
+
+    /**
+     * 现金支付金额
+     * */
+    @JSONField(name = "cash_payamt")
+    private BigDecimal cashPayamt;
+
+    /**
+     * 退费结算标志
+     * */
+    @JSONField(name = "refd_setl_flag")
+    private String refdSetlFlag = "0";
+
     public Integer getMode() {
         return null == mode ? 1 : mode;
     }

+ 72 - 26
src/main/java/thyyxxk/webserver/service/medicalinsurance/SiManageService.java

@@ -177,7 +177,33 @@ public class SiManageService {
         fillInstStlLdgChk(instStlLdgChk, setlBrfs);
 
         if (instStlLdgChk.getMode() == 2) {
-            List<InstSetlLdgChkBrf> hisBrfs = dao.selectLedgerBrfsForHisCheck(startdate, enddate);
+            if (instStlLdgChk.getClrType().equals("11")) {
+                List<String> mzVisitIds = dao.selectHisMzBrfsForHisCheck(startdate, enddate);
+                List<String> unfoundTempList = new ArrayList<>();
+                for (InstSetlLdgChkBrf setl : setlBrfs) {
+                    if (!mzVisitIds.contains(setl.getVisitId())) {
+                        unfoundTempList.add(setl.getVisitId());
+                    }
+                }
+                if (unfoundTempList.size() == 0) {
+                    return ResultVoUtil.success("对账结果:平。对账结果说明:结算笔数:" + setlBrfs.size());
+                }
+                int offset = 0;
+                for (String visitId : unfoundTempList) {
+                    String[] arr = visitId.split("_");
+                    if (dao.mzDepositCount(arr[0], arr[1]) == 0) {
+                        log.info("not found visitId: {}", visitId);
+                        offset += 1;
+                    }
+                }
+                if (offset == 0) {
+                    return ResultVoUtil.success("对账结果:平。对账结果说明:结算笔数:" + setlBrfs.size());
+                }
+                return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR,
+                        "对账结果:不平。对账结果说明:有" + offset + "条医保结算没有找到对应的HIS门诊收费。");
+            }
+
+            List<InstSetlLdgChkBrf> hisBrfs = dao.selectHisZyBrfsForHisCheck(startdate, enddate);
             if (hisBrfs.size() != setlBrfs.size()) {
                 return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR,
                         "对账结果:不平。对账结果说明:医保结算笔数:" + setlBrfs.size() + ";HIS结算笔数:" + hisBrfs.size());
@@ -240,10 +266,12 @@ public class SiManageService {
     private void fillInstStlLdgChk(InstStlLdgChk instStlLdgChk, List<InstSetlLdgChkBrf> brfs) {
         BigDecimal medfeesum = new BigDecimal("0");
         BigDecimal acctpaysum = new BigDecimal("0");
+        BigDecimal psnCashPay = new BigDecimal("0");
         BigDecimal fundpaysum = new BigDecimal("0");
         for (InstSetlLdgChkBrf brf : brfs) {
             medfeesum = DecimalUtil.add(medfeesum, brf.getMedfeeSumamt());
             acctpaysum = DecimalUtil.add(acctpaysum, brf.getAcctPay());
+            psnCashPay = DecimalUtil.add(psnCashPay, brf.getPsnCashPay());
             fundpaysum = DecimalUtil.add(fundpaysum, brf.getFundPaySumamt());
             if (null != brf.getHospPartAmt()) {
                 fundpaysum = DecimalUtil.minus(fundpaysum, brf.getHospPartAmt());
@@ -251,42 +279,60 @@ public class SiManageService {
         }
         instStlLdgChk.setMedfeeSumamt(medfeesum);
         instStlLdgChk.setAcctPay(acctpaysum);
+        instStlLdgChk.setCashPayamt(psnCashPay);
         instStlLdgChk.setFundPaySumamt(fundpaysum);
         instStlLdgChk.setFixmedinsSetlCnt(brfs.size());
     }
 
-    public ResultVo<List<InsSetlDetlChkRslt>> institutionSettlementDetailCheck(InsSetlDetlChk insSetlDetlChk) {
+    public ResultVo<List<InsSetlDetlChkRslt>> institutionSettlementDetailCheck(InstStlLdgChk setlChk) {
+        String startdate = DateUtil.getDayStartTime(setlChk.getStmtBegndate());
+        String enddate = DateUtil.getDayEndTime(setlChk.getStmtEnddate());
+        if (setlChk.getMode() == 2) {
+            if (setlChk.getClrType().equals("11")) {
+                return ResultVoUtil.fail(ExceptionEnum.INVALID_PARAM, "门诊暂不支持HIS与医保的明细对账。");
+            }
+            List<InstSetlLdgChkBrf> setlBrfs = dao.selectSetlinfoBrfsForHisCheck(setlChk.getClrType(), startdate, enddate);
+            List<InstSetlLdgChkBrf> hisBrfs = dao.selectHisZyBrfsForHisCheck(startdate, enddate);
+            Map<String, InstSetlLdgChkBrf> hisMap = new HashMap<>();
+            for (InstSetlLdgChkBrf brf : hisBrfs) {
+                hisMap.put(brf.getVisitId(), brf);
+            }
+            List<InsSetlDetlChkRslt> list = new ArrayList<>();
+            for (InstSetlLdgChkBrf setl : setlBrfs) {
+                InstSetlLdgChkBrf temp = hisMap.remove(setl.getVisitId());
+                if (null != temp) {
+                    setl.setMedfeeSumamt2(temp.getMedfeeSumamt());
+                    setl.setFundPaySumamt2(temp.getFundPaySumamt());
+                }
+                list.add(new InsSetlDetlChkRslt(setl));
+            }
+            if (hisMap.size() > 0) {
+                for (Map.Entry<String, InstSetlLdgChkBrf> entry : hisMap.entrySet()) {
+                    InstSetlLdgChkBrf value = entry.getValue();
+                    value.setMedfeeSumamt2(value.getMedfeeSumamt());
+                    value.setFundPaySumamt2(value.getFundPaySumamt());
+                    value.setMedfeeSumamt(null);
+                    value.setFundPaySumamt(null);
+                    list.add(new InsSetlDetlChkRslt(value));
+                }
+            }
+            return ResultVoUtil.success(list);
+        }
+
+        List<InstSetlLdgChkBrf> setlBrfs = dao.selectSetlChkBrfs(setlChk.getClrType(),
+                setlChk.getSetlOptins(), startdate, enddate);
+        fillInstStlLdgChk(setlChk, setlBrfs);
         String snowId = SnowFlakeId.instance().nextId();
         String filename = snowId + ".txt";
         StringBuilder fsIn = new StringBuilder();
-        String startdate = DateUtil.getDayStartTime(insSetlDetlChk.getStmtBegndate());
-        String enddate = DateUtil.getDayEndTime(insSetlDetlChk.getStmtEnddate());
-        List<InstSetlLdgChkBrf> brfs = dao.selectSetlChkBrfs(insSetlDetlChk.getClrType(),
-                insSetlDetlChk.getSetlOptins(), startdate, enddate);
-        BigDecimal medfeesum = new BigDecimal("0");
-        BigDecimal psnCashPay = new BigDecimal("0");
-        BigDecimal fundpaysum = new BigDecimal("0");
-        for (InstSetlLdgChkBrf brf : brfs) {
-            medfeesum = DecimalUtil.add(medfeesum, brf.getMedfeeSumamt());
-            psnCashPay = DecimalUtil.add(psnCashPay, brf.getPsnCashPay());
-            fundpaysum = DecimalUtil.add(fundpaysum, brf.getFundPaySumamt());
-            if (null != brf.getHospPartAmt()) {
-                fundpaysum = DecimalUtil.minus(fundpaysum, brf.getHospPartAmt());
-                brf.setFundPaySumamt(DecimalUtil.minus(brf.getFundPaySumamt(), brf.getHospPartAmt()));
-            }
-        }
-        insSetlDetlChk.setMedfeeSumamt(medfeesum);
-        insSetlDetlChk.setCashPayamt(psnCashPay);
-        insSetlDetlChk.setFundPaySumamt(fundpaysum);
-        insSetlDetlChk.setFixmedinsSetlCnt(brfs.size());
-        for (InstSetlLdgChkBrf item : brfs) {
+        for (InstSetlLdgChkBrf item : setlBrfs) {
             fsIn.append(item.getSetlId()).append("\t")
                     .append(item.getMdtrtId()).append("\t")
                     .append(item.getPsnNo()).append("\t")
                     .append(item.getMedfeeSumamt()).append("\t")
                     .append(item.getFundPaySumamt()).append("\t")
                     .append(item.getAcctPay()).append("\t")
-                    .append(insSetlDetlChk.getRefdSetlFlag()).append("\n");
+                    .append(setlChk.getRefdSetlFlag()).append("\n");
         }
         try {
             Files.write(Paths.get(filename), fsIn.toString().getBytes());
@@ -297,13 +343,13 @@ public class SiManageService {
             ResultVo<String> uplRes = upldServcie.uploadFile(JSONObject.parseObject(fsUploadIn), filename);
             ZipUtil.deleteFile(zipFile);
             if (uplRes.getCode().equals(ExceptionEnum.SUCCESS.getCode())) {
-                insSetlDetlChk.setFileQuryNo(uplRes.getData());
+                setlChk.setFileQuryNo(uplRes.getData());
             }
         } catch (IOException e) {
             log.error("医药机构费用结算对明细账出错", e);
         }
         JSONObject input = exec.makeTradeHeader(SiFunction.INSTITUTION_SETTLEMENT_DETAIL_CHECK);
-        String ref = JSONObject.toJSONStringWithDateFormat(insSetlDetlChk, "yyyy-MM-dd");
+        String ref = JSONObject.toJSONStringWithDateFormat(setlChk, "yyyy-MM-dd");
         input.getJSONObject("input").put("data", JSONObject.parseObject(ref));
         JSONObject result = exec.executeTrade(input, SiFunction.INSTITUTION_SETTLEMENT_DETAIL_CHECK);
         log.info("【操作员:{}】,医药机构费用结算对明细账:\n参数:{},\n结果:{}", TokenUtil.getTokenUserId(), input, result);

+ 1 - 2
src/main/java/thyyxxk/webserver/service/medicalinsurance/SiZyService.java

@@ -15,7 +15,6 @@ import thyyxxk.webserver.entity.ResultVo;
 import thyyxxk.webserver.entity.inpatient.patient.NotUploadedFee;
 import thyyxxk.webserver.entity.medicalinsurance.log.SiLog;
 import thyyxxk.webserver.entity.medicalinsurance.inpatient.*;
-import thyyxxk.webserver.entity.medicalinsurance.manage.InsSetlDetlChk;
 import thyyxxk.webserver.entity.medicalinsurance.manage.InsSetlDetlChkRslt;
 import thyyxxk.webserver.entity.medicalinsurance.manage.InstStlLdgChk;
 import thyyxxk.webserver.entity.medicalinsurance.query.SiPatInfo;
@@ -589,7 +588,7 @@ public class SiZyService {
                 ldgChk.setStmtEnddate(setlinfoEntity.getSetlTime());
                 ResultVo<String> totalLedgerCheck = manageService.institutionSettlementLedgerCheck(ldgChk);
                 if (totalLedgerCheck.getCode() != ExceptionEnum.SUCCESS.getCode()) {
-                    InsSetlDetlChk detlChk = new InsSetlDetlChk();
+                    InstStlLdgChk detlChk = new InstStlLdgChk();
                     detlChk.setSetlOptins(ldgChk.getSetlOptins());
                     detlChk.setStmtBegndate(ldgChk.getStmtBegndate());
                     detlChk.setStmtEnddate(ldgChk.getStmtEnddate());