Bladeren bron

添加门诊读卡功能。

lighter 3 jaren geleden
bovenliggende
commit
9b6e7848c7

+ 6 - 4
src/main/java/thyyxxk/simzfeeoprnsystm/dao/SiMzDao.java

@@ -17,7 +17,7 @@ public interface SiMzDao {
                            @Param("times") int times,
                            @Param("nullCtnt") String nullCtnt);
 
-    @Select("select a.psn_no, " +
+    @Select("select a.psn_no, mdtrtCertType='02', " +
             "b.visit_date as begntime, " +
             "a.certno as mdtrtCertNo, " +
             "a.psn_cert_type, " +
@@ -74,8 +74,10 @@ public interface SiMzDao {
     @Update("update t_mt_receipt set yb_trans_flag=0 where patient_id=#{patNo} and times=#{times}")
     void afterRevokeFees(@Param("patNo") String patNo, @Param("times") int times);
 
-    @Select("select psn_no,insuplc_admdvs,certno as mdtrtCertNo,certno, psn_cert_type,psn_type,psn_name,med_type,mdtrt_id,insutype, " +
-            "medfeeSumamt=(select sum(charge_fee) from t_mt_receipt where patient_id=#{patNo} and t_mt_receipt.times=#{times}) " +
+    @Select("select psn_no,insuplc_admdvs,mdtrtCertType='02',certno as mdtrtCertNo,certno, " +
+            "psn_cert_type,psn_type,psn_name,med_type,mdtrt_id,insutype, " +
+            "medfeeSumamt=(select sum(charge_fee) from t_mt_receipt where " +
+            "patient_id=#{patNo} and t_mt_receipt.times=#{times}) " +
             "from t_si_pat_info where pat_no=#{patNo} and times=#{times}")
     MzPreSetlmt selectPreSetlmt(@Param("patNo") String patNo, @Param("times") int times);
 
@@ -102,7 +104,7 @@ public interface SiMzDao {
     @Select("select * from t_si_setlinfo where pat_no=#{patNo} and times=#{times} and revoked=0")
     SiSetlinfo selectSettledInfo(@Param("patNo") String patNo, @Param("times") int times);
 
-    @Select("select psn_no,certno as mdtrtCertNo, " +
+    @Select("select psn_no,certno as mdtrtCertNo,mdtrtCertType='02', " +
             "psn_cert_type,certno,med_type,insuplc_admdvs, " +
             "medfeeSumamt=(select sum(charge_fee) from t_mt_receipt where patient_id=#{patNo} and t_mt_receipt.times=#{times}), " +
             "mdtrt_id,insutype,fulamt_ownpay_amt,overlmt_amt as overlmtSelfpay, " +

+ 24 - 4
src/main/java/thyyxxk/simzfeeoprnsystm/dicts/MdtrtCertType.java

@@ -9,18 +9,22 @@ import thyyxxk.simzfeeoprnsystm.utils.StringUtil;
  */
 public enum MdtrtCertType {
 
-    MEDICAL_INSURANCE_ELECTRONIC_VOUCHER("01", "医保电子凭证"),
+    MEDICAL_INSURANCE_ELECTRONIC_VOUCHER("01", "医保电子凭证", "qrcode"),
 
-    RESIDENT_IDENTITY_CARD("02", "居民身份证"),
+    RESIDENT_IDENTITY_CARD("02", "居民身份证", "idcard"),
 
-    SOCIAL_SECURITY_CARD("03", "社会保障卡");
+    SOCIAL_SECURITY_CARD("03", "社会保障卡", "sicard"),
+
+    OTHER("99", "其他", "other");
 
     private final String code;
     private final String name;
+    private final String label;
 
-    MdtrtCertType(String code, String name) {
+    MdtrtCertType(String code, String name, String label) {
         this.code = code;
         this.name = name;
+        this.label = label;
     }
 
     public String getCode() {
@@ -31,6 +35,10 @@ public enum MdtrtCertType {
         return name;
     }
 
+    public String getLabel() {
+        return label;
+    }
+
     public static MdtrtCertType get(String code) {
         if (StringUtil.isBlank(code)) {
             return null;
@@ -42,4 +50,16 @@ public enum MdtrtCertType {
         }
         return null;
     }
+
+    public static MdtrtCertType getByLabel(String label) {
+        if (StringUtil.isBlank(label)) {
+            return RESIDENT_IDENTITY_CARD;
+        }
+        for (MdtrtCertType mdtrtCertType : MdtrtCertType.values()) {
+            if (label.trim().equals(mdtrtCertType.getLabel())) {
+                return mdtrtCertType;
+            }
+        }
+        return RESIDENT_IDENTITY_CARD;
+    }
 }

+ 30 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/dicts/ReadCardBizType.java

@@ -0,0 +1,30 @@
+package thyyxxk.simzfeeoprnsystm.dicts;
+
+import thyyxxk.simzfeeoprnsystm.utils.StringUtil;
+
+public enum ReadCardBizType {
+    REGISTRATION("01101"),
+    SETTLEMENT("01301");
+
+    private final String code;
+
+    public String getCode() {
+        return code;
+    }
+
+    ReadCardBizType(String code) {
+        this.code = code;
+    }
+
+    public static ReadCardBizType get(String code) {
+        if (StringUtil.isBlank(code)) {
+            return null;
+        }
+        for (ReadCardBizType readCardBizType : ReadCardBizType.values()) {
+            if (code.trim().equals(readCardBizType.getCode())) {
+                return readCardBizType;
+            }
+        }
+        return null;
+    }
+}

+ 11 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/pojo/MzPatientInfo.java

@@ -32,4 +32,15 @@ public class MzPatientInfo {
     private String deptClass;
     private String icdCode;
     private String icdText;
+    private Integer saved;
+
+    private String mdtrtCertType;
+    private String mdtrtCertNo;
+    private Object readCardResult;
+    private String readCardBizType;
+
+
+    public Integer getSaved() {
+        return null == saved ? 0 : saved;
+    }
 }

+ 74 - 6
src/main/java/thyyxxk/simzfeeoprnsystm/service/SiMzFeeService.java

@@ -43,14 +43,40 @@ public class SiMzFeeService {
     }
 
     public ResultVo<String> outpatientRegistration(MzPatientInfo p) {
-        JSONObject input = exec.makeTradeHeaderWithInsureArea(SiFunction.OUTPATIENT_REGISTRATION,
-                p.getInsuplcAdmdvs(), p.getStaffId());
         Regstrtn regstrtn = mzDao.selectRegstrtn(p.getPatNo(), p.getTimes());
         if (null == regstrtn) {
             return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "mz_visit_table患者信息为空,请联系医生重开处方。");
         }
+
+        ReadCardBizType readCardBizType = ReadCardBizType.get(p.getReadCardBizType());
+        if (readCardBizType != ReadCardBizType.REGISTRATION && !p.getInsuplcAdmdvs().startsWith("43")) {
+            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "省外异地的患者请读社保卡登记!");
+        }
+        if (readCardBizType == ReadCardBizType.REGISTRATION) {
+            MdtrtCertType mdtrtCertType = MdtrtCertType.getByLabel(p.getMdtrtCertType());
+            regstrtn.setMdtrtCertType(mdtrtCertType.getCode());
+            if (mdtrtCertType == MdtrtCertType.SOCIAL_SECURITY_CARD) {
+                String[] out = p.getReadCardResult().toString().split("\\|");
+                if (!p.getName().trim().equals(out[4].trim())) {
+                    return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "社保卡姓名与HIS姓名不一致,请确认是否人证相符。");
+                }
+                regstrtn.setMdtrtCertNo(out[2]);
+                regstrtn.setCardSn(out[3]);
+            } else if (mdtrtCertType == MdtrtCertType.MEDICAL_INSURANCE_ELECTRONIC_VOUCHER) {
+                JSONObject qrinfo = new JSONObject(FilterUtil.cast(p.getReadCardResult()));
+                if (!p.getName().trim().equals(qrinfo.getString("userName").trim())) {
+                    return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "电子医保凭证姓名与HIS姓名不一致,请确认是否人证相符。");
+                }
+                if (!p.getSocialNo().trim().equals(qrinfo.getString("idNo").trim())) {
+                    return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "电子医保凭证身份证与HIS身份证不一致,请确认是否人证相符。");
+                }
+                regstrtn.setMdtrtCertNo(qrinfo.getString("ecToken"));
+            }
+        }
+
+        JSONObject input = exec.makeTradeHeaderWithInsureArea(SiFunction.OUTPATIENT_REGISTRATION,
+                p.getInsuplcAdmdvs(), p.getStaffId());
         regstrtn.setInsutype(p.getInsutype());
-        regstrtn.setMdtrtCertType(MdtrtCertType.RESIDENT_IDENTITY_CARD.getCode());
         regstrtn.setPsnType(p.getPsnType());
         regstrtn.setIptOtpNo(p.getPatNo());
         String ref = JSONObject.toJSONStringWithDateFormat(regstrtn, "yyyy-MM-dd HH:mm:ss");
@@ -261,10 +287,31 @@ public class SiMzFeeService {
         ResultVo<FundDetail> fundDetail1 = getFundDetailResultVo(p);
         if (fundDetail1 != null) return fundDetail1;
         MzPreSetlmt mzPreSetlmt = mzDao.selectPreSetlmt(p.getPatNo(), p.getTimes());
+        ReadCardBizType readCardBizType = ReadCardBizType.get(p.getReadCardBizType());
+        if (readCardBizType == ReadCardBizType.SETTLEMENT) {
+            MdtrtCertType mdtrtCertType = MdtrtCertType.getByLabel(p.getMdtrtCertType());
+            mzPreSetlmt.setMdtrtCertType(mdtrtCertType.getCode());
+            if (mdtrtCertType == MdtrtCertType.SOCIAL_SECURITY_CARD) {
+                String[] out = p.getReadCardResult().toString().split("\\|");
+                if (!p.getName().trim().equals(out[4].trim())) {
+                    return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "社保卡姓名与HIS姓名不一致,请确认是否人证相符。");
+                }
+                mzPreSetlmt.setMdtrtCertNo(out[2]);
+                mzPreSetlmt.setCardSn(out[3]);
+            } else if (mdtrtCertType == MdtrtCertType.MEDICAL_INSURANCE_ELECTRONIC_VOUCHER) {
+                JSONObject qrinfo = JSONObject.parseObject(p.getReadCardResult().toString());
+                if (!p.getName().trim().equals(qrinfo.getString("userName").trim())) {
+                    return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "电子医保凭证姓名与HIS姓名不一致,请确认是否人证相符。");
+                }
+                if (!p.getSocialNo().trim().equals(qrinfo.getString("idNo").trim())) {
+                    return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "电子医保凭证身份证与HIS身份证不一致,请确认是否人证相符。");
+                }
+                mzPreSetlmt.setMdtrtCertNo(qrinfo.getString("ecToken"));
+            }
+        }
         mzPreSetlmt.setMedfeeSumamt(mzPreSetlmt.getMedfeeSumamt().setScale(2, RoundingMode.HALF_UP));
         JSONObject input = exec.makeTradeHeaderWithInsureArea(SiFunction.OUTPATIENT_PRE_SETTLEMENT,
                 mzPreSetlmt.getInsuplcAdmdvs(), p.getStaffId());
-        mzPreSetlmt.setMdtrtCertType(MdtrtCertType.RESIDENT_IDENTITY_CARD.getCode());
         mzPreSetlmt.setPsnSetlway(PsnSetlWay.SETTLE_BY_ITEMS.getCode());
         mzPreSetlmt.setAcctUsedFlag(YesOrNo.NO.getCodeStr());
         mzPreSetlmt.setChrgBchno(p.getPatNo() + "_" + p.getTimes());
@@ -317,7 +364,28 @@ public class SiMzFeeService {
         Setlmt setlmt = mzDao.selectSetlmt(p.getPatNo(), p.getTimes());
         JSONObject input = exec.makeTradeHeaderWithInsureArea(SiFunction.OUTPATIENT_SETTLEMENT,
                 setlmt.getInsuplcAdmdvs(), p.getStaffId());
-        setlmt.setMdtrtCertType(MdtrtCertType.RESIDENT_IDENTITY_CARD.getCode());
+        ReadCardBizType readCardBizType = ReadCardBizType.get(p.getReadCardBizType());
+        if (readCardBizType == ReadCardBizType.SETTLEMENT) {
+            MdtrtCertType mdtrtCertType = MdtrtCertType.getByLabel(p.getMdtrtCertType());
+            setlmt.setMdtrtCertType(mdtrtCertType.getCode());
+            if (mdtrtCertType == MdtrtCertType.SOCIAL_SECURITY_CARD) {
+                String[] out = p.getReadCardResult().toString().split("\\|");
+                if (!p.getName().trim().equals(out[4].trim())) {
+                    return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "社保卡姓名与HIS姓名不一致,请确认是否人证相符。");
+                }
+                setlmt.setMdtrtCertNo(out[2]);
+                setlmt.setCardSn(out[3]);
+            } else if (mdtrtCertType == MdtrtCertType.MEDICAL_INSURANCE_ELECTRONIC_VOUCHER) {
+                JSONObject qrinfo = JSONObject.parseObject(p.getReadCardResult().toString());
+                if (!p.getName().trim().equals(qrinfo.getString("userName").trim())) {
+                    return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "电子医保凭证姓名与HIS姓名不一致,请确认是否人证相符。");
+                }
+                if (!p.getSocialNo().trim().equals(qrinfo.getString("idNo").trim())) {
+                    return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "电子医保凭证身份证与HIS身份证不一致,请确认是否人证相符。");
+                }
+                setlmt.setMdtrtCertNo(qrinfo.getString("ecToken"));
+            }
+        }
         setlmt.setMedfeeSumamt(setlmt.getMedfeeSumamt().setScale(2, RoundingMode.HALF_UP));
         setlmt.setPsnSetlway(PsnSetlWay.SETTLE_BY_ITEMS.getCode());
         setlmt.setChrgBchno(p.getPatNo() + "_" + p.getTimes());
@@ -347,7 +415,7 @@ public class SiMzFeeService {
             setlEntity.setInsuplcAdmdvs(setlmt.getInsuplcAdmdvs());
             setlEntity.setBegntime(mzDao.selectBegntime(p.getPatNo(), p.getTimes()));
             setlEntity.setEndtime(setlEntity.getSetlTime());
-            setlEntity.setMzSaved(0);
+            setlEntity.setMzSaved(p.getSaved());
             setlinfoDao.insert(setlEntity);
             setlinfoDao.updateSiZyInfoSetlId(p.getPatNo(), p.getTimes(), 0, setlEntity.getSetlId(),
                     setlEntity.getMedinsSetlId(), input.getString("msgid"));