浏览代码

自费上传接口

lighter 3 年之前
父节点
当前提交
969c560c31

+ 39 - 0
src/main/java/thyyxxk/sizyfeeoprnsystm/controller/SelfpayController.java

@@ -0,0 +1,39 @@
+package thyyxxk.sizyfeeoprnsystm.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import thyyxxk.sizyfeeoprnsystm.pojo.ResultVo;
+import thyyxxk.sizyfeeoprnsystm.service.SelfpayService;
+
+@RestController
+@RequestMapping("/selfpay")
+public class SelfpayController {
+    private final SelfpayService service;
+
+    @Autowired
+    public SelfpayController(SelfpayService service) {
+        this.service = service;
+    }
+
+    @GetMapping("/uploadSelfpayMedfee")
+    public JSONObject uploadSelfpayMedfee(@RequestParam("patNo") String patNo,
+                                                @RequestParam("times") int times,
+                                                @RequestParam("ledger") int ledger) {
+        return service.uploadSelfpayMedfee(patNo, times, ledger);
+    }
+
+    @GetMapping("/ledgerCheck")
+    public JSONObject ledgerCheck(@RequestParam("patNo") String patNo,
+                                            @RequestParam("times") int times,
+                                            @RequestParam("ledger") int ledger) {
+        return service.ledgerCheck(patNo, times, ledger);
+    }
+
+    @GetMapping("/cashCheck")
+    public JSONObject cashCheck(@RequestParam("patNo") String patNo,
+                                          @RequestParam("times") int times,
+                                          @RequestParam("ledger") int ledger) {
+        return service.cashCheck(patNo, times, ledger);
+    }
+}

+ 87 - 0
src/main/java/thyyxxk/sizyfeeoprnsystm/dao/SelfpayDao.java

@@ -0,0 +1,87 @@
+package thyyxxk.sizyfeeoprnsystm.dao;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+import thyyxxk.sizyfeeoprnsystm.pojo.FeeCounteract;
+import thyyxxk.sizyfeeoprnsystm.pojo.FeeDtle;
+import thyyxxk.sizyfeeoprnsystm.pojo.selfpay.FmiOwnpayPatnDise;
+import thyyxxk.sizyfeeoprnsystm.pojo.selfpay.FmiOwnpayPatnFee;
+import thyyxxk.sizyfeeoprnsystm.pojo.selfpay.FmiOwnpayPatnMdtrt;
+
+import java.math.BigDecimal;
+import java.util.LinkedList;
+import java.util.List;
+
+@Mapper
+public interface SelfpayDao {
+
+    @Select("select psnCertType='01',certno=b.social_no, " +
+            "psnName=rtrim(a.name),begntime=a.admiss_date, " +
+            "medType=isnull(a.med_type,'2101'), " +
+            "iptOpNo=rtrim(b.inpatient_no), " +
+            "inhospStas='1',valiFlag='1' " +
+            "from ${table} a, a_patient_mi b  " +
+            "where a.inpatient_no=#{patNo} " +
+            "and a.admiss_times=#{times} " +
+            "and a.inpatient_no=b.inpatient_no")
+    FmiOwnpayPatnMdtrt selectPatnMdtrt(@Param("table") String table,
+                                       @Param("patNo") String patNo,
+                                       @Param("times") int times);
+
+    @Select("select inoutDiagType='2',diagType='1',maindiagFlag='1',diagSrtNo=1, " +
+            "diagCode=rtrim(dis_diag),diagName=rtrim(dis_diag_comment) " +
+            "from ba_first_page1 where inpatient_no=#{patNo} and admiss_times=#{times} and dis_diag_no=1")
+    FmiOwnpayPatnDise selectPatnDise(@Param("patNo") String patNo,
+                                     @Param("times") int times);
+
+    @Select("select bkkpSn=detail_sn,feeOcurTime=charge_date,valiFlag='1',fixmedinsName='长沙泰和医院', medinsListCodg=rtrim(charge_code_mx)," +
+            "cnt=charge_amount,pric=charge_fee/charge_amount,detItemFeeSumamt=charge_fee, fixmedinsCode='H43010500370', " +
+            "medListCodg=isnull((select max(national_code) from yp_zd_dict where code=charge_code_mx),(select max(national_code) from zd_charge_item where code=charge_code_mx)), " +
+            "medinsListName=isnull((select top 1 name from yp_zd_dict where code=charge_code_mx),(select name from zd_charge_item where code=charge_code_mx)) " +
+            "from zy_detail_charge where inpatient_no=#{patNo} and admiss_times=#{times} and ledger_sn=#{ledger} and isnull(trans_flag_yb,0)=0")
+    LinkedList<FmiOwnpayPatnFee> selectOwnpayFees(@Param("patNo") String patNo, @Param("times") int times, @Param("ledger") int ledger);
+
+    @Select("select sum(charge_fee) from zy_detail_charge where inpatient_no=#{patNo} and admiss_times=#{times} and ledger_sn=#{ledger}")
+    BigDecimal selectSumFee(@Param("patNo") String patNo, @Param("times") int times, @Param("ledger") int ledger);
+
+    @Select("select social_no from a_patient_mi where inpatient_no=#{patNo}")
+    String selectSocialNo(@Param("patNo") String patNo);
+
+    @Update("<script>" +
+            "update zy_detail_charge set trans_flag_yb=1 where inpatient_no=#{patNo} and " +
+            "admiss_times=#{times} and detail_sn in " +
+            "<foreach collection='fees' item='fee' separator=',' open='(' close=')'>" +
+            "#{fee.bkkpSn}</foreach>" +
+            "</script>")
+    void updateTransFlag(@Param("patNo") String patNo,
+                         @Param("times") int times,
+                         @Param("fees") List<FmiOwnpayPatnFee> fees);
+
+    @Select("select charge_amount,charge_fee,detail_sn,ori_detail_sn from zy_detail_charge " +
+            "where inpatient_no=#{zyh} and admiss_times=#{zycs} and ledger_sn=#{sn} " +
+            "and isnull(infant_flag,0)!=1 and isnull(trans_flag_yb,0) not in (1,2) " +
+            "and isnull(ori_detail_sn,-1)!=-1")
+    List<FeeCounteract> selectNegativeFeesWithOriDetlSn(@Param("zyh") String zyh,
+                                                        @Param("zycs") Integer zycs,
+                                                        @Param("sn") Integer sn);
+
+    @Select("<script>" +
+            "select charge_amount,charge_fee,detail_sn from zy_detail_charge " +
+            "where inpatient_no=#{zyh} and admiss_times=#{zycs} and ledger_sn=#{sn} " +
+            "and isnull(trans_flag_yb,0) not in (1,2) and detail_sn in " +
+            "<foreach collection='list' item='detailSn' open='(' separator=',' close=')'>" +
+            "#{detailSn}" +
+            "</foreach>" +
+            "</script>")
+    List<FeeCounteract> selectPositiveFeesByDetlSn(@Param("zyh") String zyh,
+                                                   @Param("zycs") Integer zycs,
+                                                   @Param("sn") Integer sn,
+                                                   @Param("list") List<Integer> list);
+
+    @Update("update zy_detail_charge set trans_flag_yb=2 where inpatient_no=#{zyh} and " +
+            "admiss_times=#{zycs} and detail_sn in (#{sn}, #{sn2})")
+    void updateYbTransFlagInPair(@Param("zyh") String zyh, @Param("zycs") Integer zycs, @Param("sn") Integer sn, @Param("sn2") Integer sn2);
+
+}

+ 6 - 437
src/main/java/thyyxxk/sizyfeeoprnsystm/dicts/SiFunction.java

@@ -7,184 +7,6 @@ package thyyxxk.sizyfeeoprnsystm.dicts;
  **/
 public enum SiFunction {
 
-    /* ============================================ 人员信息 ============================================ */
-    /**
-     * 通过此交易获取人员信息(人员基本信息获取)
-     */
-    OBTAIN_BASIC_PERSON_INFO("1101"),
-
-    /* ========================================== 定点医药机构信息 ========================================== */
-    /**
-     * 通过此交易获取医药机构基本信息(医药机构信息获取)
-     */
-    OBTAIN_MEDICAL_INSTITUTION_INFO("1201"),
-
-    /* ============================================= 目录下载 =========================================== */
-    /**
-     * 根据本地最大版本号信息获取大于本地版本的目录信息(西药中成药目录下载)
-     */
-    DOWNLOAD_PATENT_AND_WESTERN_MEDICINE_CATALOGUE("1301"),
-
-    /**
-     * 根据本地最大版本号信息获取大于本地版本的目录信息(中药饮片目录下载)
-     */
-    DOWNLOAD_CHINESE_HERBAL_CATALOGUE("1302"),
-
-    /**
-     * 根据本地最大版本号信息获取大于本地版本的目录信息(医疗机构制剂目录下载)
-     */
-    DOWNLOAD_INSTITUTIONS_PREPARATIONS_CATALOGUE("1303"),
-
-    /**
-     * 根据本地最大版本号信息获取大于本地版本的目录信息(民族药品目录下载)
-     */
-    DOWNLOAD_ETHNIC_MEDICINE("1304"),
-
-    /**
-     * 根据本地最大版本号信息获取大于本地版本的目录信息(医疗服务项目目录下载)
-     */
-    DOWNLOAD_MEDICAL_SERVICE_ITEMS_CATALOGUE("1305"),
-
-    /**
-     * 根据本地最大版本号信息获取大于本地版本的目录信息(医用耗材目录下载)
-     */
-    DOWNLOAD_MEDICAL_SUPPLIES_CATALOGUE("1306"),
-
-    /**
-     * 根据本地最大版本号信息获取大于本地版本的目录信息(疾病与诊断目录下载)
-     */
-    DOWNLOAD_DISEASES_AND_DIAGNOSIS_CATALOGUE("1307"),
-
-    /**
-     * 根据本地最大版本号信息获取大于本地版本的目录信息(手术操作目录下载)
-     * */
-    DOWNLOAD_OPERATION_CATALOGUE("1308"),
-
-    /**
-     * 根据本地最大版本号信息获取大于本地版本的目录信息(门诊慢特病种目录下载)
-     * */
-    DOWNLOAD_OUTPATIENT_SPECIAL_CHRONIC_DISEASES_CATALOGUE("1309"),
-
-    /**
-     * 根据本地最大版本号信息获取大于本地版本的目录信息(按病种付费病种目录下载)
-     */
-    DOWNLOAD_PAY_BY_DISEASE_CATALOGUE("1310"),
-
-    /**
-     * 根据本地最大版本号信息获取大于本地版本的目录信息(日间手术治疗病种目录下载)
-     */
-    DOWNLOAD_DAYTIME_SURGERY_DISEASES_CATALOGUE("1311"),
-
-    /**
-     * 根据本地最大版本号信息获取大于本地版本的目录信息(医保目录信息查询)
-     */
-    DOWNLOAD_MEDICAL_INSURANCE_CATALOGUE("1312"),
-
-    /**
-     * 根据本地最大版本号信息获取大于本地版本的目录信息(肿瘤形态学目录下载)
-     * */
-    DOWNLOAD_TUMOR_MORPHOLOGY_CATALOGUE("1313"),
-
-    /**
-     * 根据本地最大版本号信息获取大于本地版本的目录信息(中医疾病目录下载)
-     */
-    DOWNLOAD_TRADITIONAL_CHINESE_DISEASES_CATALOGUE("1314"),
-
-
-    /**
-     * 根据本地最大版本号信息获取大于本地版本的目录信息(中医证候目录下载)
-     * */
-    DOWNLOAD_TCM_SYNDROME_CATALOGUE("1315"),
-
-    /**
-     * 通过此交易下载医疗目录与医保目录匹配信息(医疗目录与医保目录匹配信息下载)
-     */
-    DOWNLOAD_MEDICAL_INSURANCE_MATCH_CATALOGUE("1316"),
-
-    /**
-     * 通过此交易下载医药机构目录匹配信息(医药机构目录匹配信息下载)
-     */
-    DOWNLOAD_MEDICAL_INSTITUTION_MATCH_CATALOGUE("1317"),
-
-    /**
-     * 通过此交易下载医保目录限价信息(医保目录限价信息下载)
-     */
-    DOWNLOAD_MEDICAL_INSURANCE_PRICE_LIMIT_CATALOGUE("1318"),
-
-    /**
-     * 通过此交易下载医保目录先自付比例信息(医保目录先自付比例信息下载)
-     */
-    DOWNLOAD_MEDICAL_INSURANCE_PAY_FIRST_CATALOGUE("1319"),
-
-    /* =========================================== 其他信息 ========================================== */
-    /**
-     * 通过此交易下载字典表(字典表下载)
-     */
-    DOWNLOAD_DICTIONARY_LIST("1901"),
-
-    /* =========================================== 待遇检查 ========================================== */
-    /**
-     * 通过此交易检查人员的待遇享受情况,返回待遇信息(人员待遇享受检查)
-     */
-    CHECK_PERSON_TREATMENT("2001"),
-
-    /* =========================================== 药店结算 ========================================== */
-    /**
-     * 通过此交易进行药店购药,药店门诊慢特病购药的预结算(药店预结算)
-     */
-    DRUGSTORE_PRE_SETTLEMENT("2101"),
-
-    /**
-     * 通过此交易进行药店购药,药店门诊慢特病购药的结算(含费用明细上传)("药店结算")
-     */
-    DRUGSTORE_SETTLEMENT("2102"),
-
-    /**
-     * 通过此交易撤销药店结算(含费用明细撤销)(药店结算撤销)
-     */
-    REVOKE_DRUGSTORE_SETTLEMENT("2103"),
-
-    /* =========================================== 门急诊结算 ========================================== */
-    /**
-     * 通过此交易进行门诊挂号(门诊挂号)
-     */
-    OUTPATIENT_REGISTRATION("2201"),
-
-    /**
-     * 通过此交易进行门诊挂号的撤销(门诊挂号撤销)
-     */
-    REVOKE_OUTPATIENT_REGISTRATION("2202"),
-
-    /**
-     * 通过此交易上传门诊就诊及诊断信息(门诊就诊信息上传)
-     */
-    UPLOAD_OUTPATIENT_INFO("2203"),
-
-    /**
-     * 通过此交易上传门诊费用明细信息(门诊费用明细信息上传)
-     */
-    UPLOAD_OUTPATIENT_FEE_DETAILS("2204"),
-
-    /**
-     * 通过此交易撤销门诊费用明细信息(门诊费用明细信息撤销)
-     * */
-    REVOKE_OUTPATIENT_FEE_DETAILS("2205"),
-
-    /**
-     * 通过此交易进行门诊结算的预结算(门诊预结算)
-     */
-    OUTPATIENT_PRE_SETTLEMENT("2206"),
-
-    /**
-     * 通过此交易进行门诊结算的正式结算(门诊结算)
-     * */
-    OUTPATIENT_SETTLEMENT("2207"),
-
-    /**
-     * 通过此交易撤销门诊结算(门诊结算撤销)
-     * */
-    REVOKE_OUTPATIENT_SETTLEMENT("2208"),
-
     /* =========================================== 住院结算 ========================================== */
     /**
      * 通过此交易上传住院费用明细信息(住院费用明细上传)
@@ -201,260 +23,23 @@ public enum SiFunction {
      */
     HOSPITALIZATION_PRE_SETTLEMENT("2303"),
 
-    /**
-     * 通过此交易进行住院结算的正式结算(住院结算)
-     * */
-    HOSPITALIZATION_SETTLEMENT("2304"),
-
-    /**
-     * 通过此交易撤销住院结算(住院结算撤销)
-     * */
-    REVOKE_HOSPITALIZATION_SETTLEMENT("2305"),
-
-    /* =========================================== 住院办理 ========================================== */
-    /**
-     * 通过此交易进行入院登记办理(入院登记)
-     * */
-    ADMISSION_REGISTRATION("2401"),
-
-    /**
-     * 通过此交易进出院办理(出院办理)
-     */
-    DISCHARGE_PROCESSING("2402"),
-
-    /**
-     * 通过此交易进行入院信息变更(入院信息变更)
-     */
-    MODIFY_ADMISSION_INFO("2403"),
-
-    /**
-     * 通过此交易进行入院撤销(入院撤销)
-     */
-    REVOKE_ADMISSION("2404"),
-
-    /**
-     * 通过此交易进出院撤销(出院撤销)
-     */
-    REVOKE_DISCHARGE("2405"),
-
-    /* =========================================== 人员备案 ========================================== */
-    /**
-     * 通过此交易上传转院备案信息(转院备案)
-     */
-    TRANSFER_HOSPITAL_RECORD("2501"),
-
-    /**
-     * 通过此交易撤销上传的转院备案信息(转院备案撤销)
-     * */
-    REVOKE_TRANSFER_HOSPITAL_RECORD("2502"),
-
-    /**
-     * 通过此交易上传人员慢特病备案信息(人员慢特病备案)
-     */
-    SPECIAL_CHRONIC_DISEASES_RECORD("2503"),
-
-    /**
-     * 通过此交易撤销医保局还未处理的人员慢特病备案信息(人员慢特病备案撤销)
-     * */
-    REVOKE_SPECIAL_CHRONIC_DISEASES_RECORD("2504"),
-
-    /**
-     * 通过此交易上传人员定点备案信息(人员定点备案)
-     */
-    PERSONNEL_ASSIGNMENT_RECORD("2505"),
-
-    /**
-     * 通过此交易撤销医保局还未审核的人员定点备案信息(人员定点备案撤销)
-     * */
-    REVOKE_PERSONNEL_ASSIGNMENT_RECORD("2506"),
-
-    /* =========================================== 事务补偿业务 ========================================== */
-    /**
-     * 定点医药机构发起某项交易时,因网络中断或超时等原因导致无法获取接收方状态,
-     * 导致多方数据不一致或已确认接收方数据多时,可通过冲正取消接收方相应数据,保持双方数据一致(冲正交易)
-     * 重点说明:
-     * 1、可被冲正的交易包括:【2102】药店结算、【2103】药店结算撤销、【2207】门诊结算、【2208】门诊结算撤销、
-     *                    【2304】住院结算、【2305】住院结算撤销、【2401】入院办理。
-     * 2、将需要冲正的交易信息(原交易)中的“msgid 发送方报文ID”放入本次输入的“omsgid 原发送方报文ID”中;
-     * 3、将需要冲正的交易信息(原交易)中的“infno 交易编号”放入本次输入的“oinfno 原交易编号”中;
-     * */
-    AUTO_RECOVERY_TRADE("2601"),
-
-    /* =========================================== 明细审核 ========================================== */
-    /**
-     * 通过此交易进行事前、事中的明细审核分析(明细审核分析服务)
-     * */
-    ITEMIZED_REVIEW_ANALYSIS_SERVICES("3101"),
-
-    /* =========================================== 医药机构费用结算业务 ========================================== */
-    /**
-     * 对通过此交易进行医药机构费用结算对总账(医药机构费用结算对总账)
-     */
-    INSTITUTION_SETTLEMENT_LEDGER_CHECK("3201"),
-
-    /**
-     * 通过此交易,在医药机构费用结算总账不平时,进行对明细账(医药机构费用结算对明细账)
-     */
-    INSTITUTION_SETTLEMENT_DETAIL_CHECK("3202"),
-
-    /* =========================================== 目录对照 ========================================== */
-    /**
-     * 通过此交易上传目录对照信息(目录对照上传)
-     */
-    UPLOAD_CATALOGUE_CONTRAST("3301"),
-
-    /**
-     * 通过此交易删除上传的目录对照信息(目录对照撤销)
-     */
-    REVOKE_CATALOGUE_CONTRAST("3302"),
-
-    /* =========================================== 科室管理 ========================================== */
-    /**
-     * 通过此交易上传科室信息(科室信息上传)
-     */
-    UPLOAD_DEPARTMENT_INFO("3401"),
-
-    /**
-     * 通过此交易批量上传科室信息(批量科室信息上传)
-     */
-    UPLOAD_DEPARTMENT_INFO_IN_BATCH("3401A"),
-
-    /**
-     * 通过此交易变更科室信息(科室信息变更)
-     */
-    MODIFY_DEPARTMENT_INFO("3402"),
-
-    /**
-     * 通过此交易撤销科室信息(科室信息撤销)
-     * */
-    REVOKE_DEPARTMENT_INFO("3403"),
-
-    /* =========================================== 进销存管理 ========================================== */
-    /**
-     * 通过此交易上传商品盘存信息(商品盘存上传)
-     */
-    UPLOAD_COMMODITY_INVENTORY("3501"),
-
-    /**
-     * 通过此交易上传商品的库存变化(商品库存变更)
-     */
-    CHANGE_COMMODITY_INVENTORY("3502"),
-
-    /**
-     * 通过此交易上传商品采购信息(商品采购)
-     */
-    UPLOAD_COMMODITY_PURCHASE("3503"),
-
-    /**
-     * 通过此交易上传商品采购退货信息(商品采购退货)
-     * */
-    UPLOAD_COMMODITY_PURCHASE_RETURN("3504"),
-
-    /**
-     * 通过此交易上传商品销售信息(商品销售)
-     */
-    UPLOAD_COMMODITY_SALES("3505"),
-
-    /**
-     * 通过此交易上传商品销售退货信息(商品销售退货)
-     */
-    UPLOAD_COMMODITY_SALES_RETURN("3506"),
-
-    /**
-     * 通过此交易删除某一批次商品信息(商品信息删除)
-     */
-    DELETE_COMMODITY_INFO("3507"),
-
-    /**
-     * 通过此交易上传医疗保障基金结算清单信息(医疗保障基金结算清单信息上传)
-     * */
-    UPLOAD_SI_SETTLE_INFO("4101"),
 
     /* =========================================== 自费病人就医信息 ========================================== */
     /**
      * 通过此交易上传自费病人费用明细信息(自费病人费用明细信息上传)
      */
-    UPLOAD_SELF_FUNDED_PATIENT_FEE_DETAIL("4201"),
-
-    /* =========================================== 基础信息查询 ========================================== */
-    /**
-     * 通过此交易获取当前医疗机构的科室基本信息(科室信息查询)
-     */
-    QUERY_DEPARTMENT_INFO("5101"),
-
-    /**
-     * 通过此交易获取当前医药机构的医师、护士、药师人员信息(医执人员信息查询)
-     */
-    QUERY_MEDICAL_STAFF_INFO("5102"),
-
-    /* =========================================== 医保服务查询 ========================================== */
-    /**
-     * 根据人员信息获取该人员在本机构一段时间内的就诊信息(就诊信息查询)
-     */
-    QUERY_VISIT_INFO("5201"),
-
-    /**
-     * 根据就诊信息获取该人员当次就诊的诊断信息(诊断信息查询)
-     */
-    QUERY_DIAGNOSIS_INFO("5202"),
-
-    /**
-     * 根据条件信息获取该人员在本机构一段时间内的结算信息(结算信息查询)
-     */
-    QUERY_SETTLEMENT_INFO("5203"),
-
-    /**
-     * 根据人员就诊信息获取该笔结算的明细信息(费用明细查询)
-     */
-    QUERY_FEE_DETAILS("5204"),
-
-    /**
-     * 根据人员信息获取该人员在一段时间内的门诊慢特病用药信息(人员慢特病用药记录查询)
-     */
-    QUERY_SPECIAL_CHRONIC_DISEASES_MEDICAL_RECORD("5205"),
-
-    /**
-     * 根据人员信息获取该人员的累计信息(人员累计信息查询)
-     */
-    QUERY_PERSONNEL_CUMULATIVE_INFO("5206"),
-
-    /* =========================================== 医药机构服务查询 ========================================== */
-    /**
-     * 根据个人信息获取该人员当前有效的慢特病备案信息(人员慢特病备案查询)
-     */
-    QUERY_SPECIAL_CHRONIC_DISEASES_ACCREDITATION("5301"),
-
-    /**
-     * 通过此交易获取该人员当前的定点信息(人员定点信息查询)
-     */
-    QUERY_PERSONNEL_ASSIGNMENT_INFO("5302"),
-
-    /**
-     * 通过此交易获取当前定点医疗机构的在院病人信息(在院信息查询)
-     */
-    QUERY_IN_HOSPITAL_PATIENTS_INFO("5303"),
-
-    /**
-     * 通过此交易获取该人员在本机构一段时间内的转院信息(转院信息查询)
-     */
-    QUERY_PERSONNEL_TRANSFER_HOSPITAL_INFO("5304"),
+    UPLOAD_SELF_FUNDED_PATIENT_FEE_DETAIL("4261"),
 
-    /* =========================================== 检查检验互认结果查询 ========================================== */
     /**
-     * 通过此交易在开医技医嘱时获取项目互认的结果(项目互认信息查询
+     * 通过此交易与已上传总费用进行比对(已上传费用对账接口)
      */
-    QUERY_MUTUAL_ACCREDIT_INFO("5401"),
+    SELF_FUNDED_UPLOADED_LEDGER_CHECK("4262"),
 
     /**
-     * 通过此交易在根据互认结果列表获取诊断明细(报告明细信息查询
+     * 通过此交易医院可查询病人零报时发票金额和已上传费用总额不同的记录(自费病人零报金额不符查询接口)
      */
-    QUERY_DIAGNOSIS_REPORT_DETAIL("5402"),
+    SELF_FUNDED_CASH_AMOUNT_ERROR_QUERY("4263"),
 
-    /* =========================================== 药店线上支付 ========================================== */
-    /**
-     * 通过此交易,定点零售药店上传药店线上支付使用的费用明细(药店线上费用明细上传)
-     */
-    UPLOAD_DRUGSTORE_ONLINE_FEE_DETAIL("6101"),
 
     /* =========================================== 签到签退 ========================================== */
     /**
@@ -465,23 +50,7 @@ public enum SiFunction {
     /**
      * 通过此交易进行调用方签退(签退)
      */
-    SIGN_OUT("9002"),
-
-    /**
-     * 获取政策项费用
-     * */
-    LIST_POL_ITEM_CODE_PAY_INFO("100001"),
-
-    /* =========================================== 上传下载 ========================================== */
-    /**
-     * 通过此交易上传文件(文件上传)
-     */
-    UPLOAD_FILE("9101"),
-
-    /**
-     * 通过此交易下载【1301-1319】目录信息下载、【5204】费用明细查询、【3202】医药机构费用结算对明细账交易生成的文件(文件下载)
-     */
-    DOWNLOAD_FILE("9102");
+    SIGN_OUT("9002");
 
     private final String code;
 

+ 16 - 0
src/main/java/thyyxxk/sizyfeeoprnsystm/pojo/selfpay/FmiOwnpayPatnDise.java

@@ -0,0 +1,16 @@
+package thyyxxk.sizyfeeoprnsystm.pojo.selfpay;
+
+import lombok.Data;
+
+@Data
+public class FmiOwnpayPatnDise {
+    private String fixmedinsCode;
+    private String fixmedinsName;
+    private Integer diagSrtNo;
+    private String mdtrtId;
+    private String inoutDiagType;
+    private String diagType;
+    private String maindiagFlag;
+    private String diagCode;
+    private String diagName;
+}

+ 21 - 0
src/main/java/thyyxxk/sizyfeeoprnsystm/pojo/selfpay/FmiOwnpayPatnFee.java

@@ -0,0 +1,21 @@
+package thyyxxk.sizyfeeoprnsystm.pojo.selfpay;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+public class FmiOwnpayPatnFee {
+    private String bkkpSn;
+    private Date feeOcurTime;
+    private String fixmedinsCode;
+    private String fixmedinsName;
+    private BigDecimal cnt;
+    private BigDecimal pric;
+    private BigDecimal detItemFeeSumamt;
+    private String medListCodg;
+    private String medinsListCodg;
+    private String medinsListName;
+    private String valiFlag;
+}

+ 23 - 0
src/main/java/thyyxxk/sizyfeeoprnsystm/pojo/selfpay/FmiOwnpayPatnMdtrt.java

@@ -0,0 +1,23 @@
+package thyyxxk.sizyfeeoprnsystm.pojo.selfpay;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class FmiOwnpayPatnMdtrt {
+    private String mdtrtId;
+    private String fixmedinsCode;
+    private String fixmedinsName;
+    private String psnCertType;
+    private String certno;
+    private String psnName;
+    private Date begntime;
+    private Date endtime;
+    private String medType;
+    private String iptOpNo;
+    private String inhospStas;
+    private String diseNo;
+    private String diseName;
+    private String valiFlag;
+}

+ 161 - 0
src/main/java/thyyxxk/sizyfeeoprnsystm/service/SelfpayService.java

@@ -0,0 +1,161 @@
+package thyyxxk.sizyfeeoprnsystm.service;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import thyyxxk.sizyfeeoprnsystm.dao.SelfpayDao;
+import thyyxxk.sizyfeeoprnsystm.dicts.SiFunction;
+import thyyxxk.sizyfeeoprnsystm.pojo.FeeCounteract;
+import thyyxxk.sizyfeeoprnsystm.pojo.Overview;
+import thyyxxk.sizyfeeoprnsystm.pojo.selfpay.FmiOwnpayPatnDise;
+import thyyxxk.sizyfeeoprnsystm.pojo.selfpay.FmiOwnpayPatnFee;
+import thyyxxk.sizyfeeoprnsystm.pojo.selfpay.FmiOwnpayPatnMdtrt;
+import thyyxxk.sizyfeeoprnsystm.utils.SiUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Queue;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
+
+@Slf4j
+@Service
+public class SelfpayService {
+    private final SelfpayDao dao;
+    private final ExecService exec;
+
+    @Autowired
+    public SelfpayService(SelfpayDao dao, ExecService exec) {
+        this.dao = dao;
+        this.exec = exec;
+    }
+
+    public JSONObject uploadSelfpayMedfee(String patNo, int times, int ledger) {
+        beforeUpload(patNo, times, ledger);
+        JSONObject input = new JSONObject();
+        input.put("upType", "1");
+        String mdtrtId = makeSelfpayMdtrtId(patNo, times, ledger);
+        FmiOwnpayPatnMdtrt patnMdtrt = dao.selectPatnMdtrt("zy_actpatient", patNo, times);
+        if (null == patnMdtrt) {
+            patnMdtrt = dao.selectPatnMdtrt("zy_inactpatient", patNo, times);
+            patnMdtrt.setInhospStas("0");
+        }
+        if (patnMdtrt.getMedType().equals("") || patnMdtrt.getMedType().equals("01")) {
+            patnMdtrt.setMedType("2101");
+        }
+        patnMdtrt.setMdtrtId(mdtrtId);
+        patnMdtrt.setFixmedinsCode(SiUtil.INSTITUTION_ID);
+        patnMdtrt.setFixmedinsName(SiUtil.INSTITUTION_NAME);
+        FmiOwnpayPatnDise dise = dao.selectPatnDise(patNo, times);
+        patnMdtrt.setDiseNo(dise.getDiagCode());
+        patnMdtrt.setDiseName(dise.getDiagName());
+
+        input.put("fmiOwnpayPatnMdtrtDDTO", JSONObject.parseObject(
+                JSONObject.toJSONStringWithDateFormat(patnMdtrt, "yyyy-MM-dd")));
+
+        dise.setFixmedinsCode(SiUtil.INSTITUTION_ID);
+        dise.setFixmedinsName(SiUtil.INSTITUTION_NAME);
+        dise.setMdtrtId(mdtrtId);
+        JSONArray array = new JSONArray();
+        array.add(JSONObject.parseObject(JSONObject.toJSONString(dise)));
+        input.put("fmiOwnpayPatnDiseListDDTOS", array);
+        Queue<FmiOwnpayPatnFee> fees = dao.selectOwnpayFees(patNo, times, ledger);
+        return executeUpload(patNo, times, input, fees);
+    }
+
+    private JSONObject executeUpload(String patNo, int times, JSONObject input, Queue<FmiOwnpayPatnFee> fees) {
+        List<FmiOwnpayPatnFee> list = new ArrayList<>();
+        JSONObject result = null;
+        while (!fees.isEmpty()) {
+            list.add(fees.poll());
+            if (list.size() == 100) {
+                JSONArray patnFeeList = JSONArray.parseArray(JSONArray.toJSONStringWithDateFormat(list, "yyyy-MM-dd HH:mm:ss"));
+                input.put("fmiOwnpayPatnFeeListDDTO", patnFeeList);
+                result = exec.executeTrade(input, SiFunction.UPLOAD_SELF_FUNDED_PATIENT_FEE_DETAIL);
+                log.info("自费费用上传\n参数:{}\n结果:{}", input, result);
+                if (result.getIntValue("code") == 0) {
+                    dao.updateTransFlag(patNo, times, list);
+                }
+                list.clear();
+            }
+        }
+        if (list.size() > 0) {
+            JSONArray patnFeeList = JSONArray.parseArray(JSONArray.toJSONStringWithDateFormat(list, "yyyy-MM-dd HH:mm:ss"));
+            input.put("fmiOwnpayPatnFeeListDDTO", patnFeeList);
+            result = exec.executeTrade(input, SiFunction.UPLOAD_SELF_FUNDED_PATIENT_FEE_DETAIL);
+            log.info("自费费用上传\n参数:{}\n结果:{}", input, result);
+            if (result.getIntValue("code") == 0) {
+                dao.updateTransFlag(patNo, times, list);
+            }
+            list.clear();
+        }
+        return result;
+    }
+
+    private String makeSelfpayMdtrtId(String patNo, int times, int ledger) {
+        return patNo + "_" + times + "_" + ledger;
+    }
+
+    public JSONObject ledgerCheck(String patNo, int times, int ledger) {
+        JSONObject obj = new JSONObject();
+        obj.put("mdtrtId", makeSelfpayMdtrtId(patNo, times, ledger));
+        obj.put("fixmedinsCode", SiUtil.INSTITUTION_ID);
+        obj.put("totalFeeSumamt", dao.selectSumFee(patNo, times, ledger));
+        JSONObject result = exec.executeTrade(obj, SiFunction.SELF_FUNDED_UPLOADED_LEDGER_CHECK);
+        log.info("自费已上传费用对账\n参数:{}\n结果:{}", obj, result);
+        return result;
+    }
+
+    public JSONObject cashCheck(String patNo, int times, int ledger) {
+        JSONObject obj = new JSONObject();
+        obj.put("mdtrtId", makeSelfpayMdtrtId(patNo, times, ledger));
+        obj.put("fixmedinsCode", SiUtil.INSTITUTION_ID);
+        obj.put("certno", dao.selectSocialNo(patNo));
+        obj.put("pageNum", 1);
+        obj.put("pageSize", 100);
+        JSONObject result = exec.executeTrade(obj, SiFunction.SELF_FUNDED_CASH_AMOUNT_ERROR_QUERY);
+        log.info("自费病人零报金额不符查询\n参数:{}\n结果:{}", obj, result);
+        return result;
+    }
+
+    private void beforeUpload(String patNo, int times, int ledger) {
+        List<FeeCounteract> negative = dao.selectNegativeFeesWithOriDetlSn(patNo, times, ledger);
+        if (null == negative || negative.isEmpty()) {
+            log.info("正负相抵完成,抵消费用总条目:0");
+            return;
+        }
+        List<FeeCounteract> positive = new ArrayList<>();
+        List<Integer> tempSn = new ArrayList<>();
+        for (FeeCounteract feeCounteract : negative) {
+            tempSn.add(feeCounteract.getOriDetailSn());
+            if (tempSn.size() == 30) {
+                positive.addAll(dao.selectPositiveFeesByDetlSn(patNo, times, ledger, tempSn));
+                tempSn.clear();
+            }
+        }
+        if (tempSn.size() > 0) {
+            positive.addAll(dao.selectPositiveFeesByDetlSn(patNo, times, ledger, tempSn));
+        }
+        ConcurrentHashMap<Integer, FeeCounteract> posKeyVal = new ConcurrentHashMap<>();
+        positive.forEach(itm -> {
+            if (!posKeyVal.containsKey(itm.getDetailSn())) {
+                posKeyVal.put(itm.getDetailSn(), itm);
+            }
+        });
+
+        AtomicInteger count = new AtomicInteger();
+        negative.forEach(itm -> {
+            if (posKeyVal.containsKey(itm.getOriDetailSn())) {
+                FeeCounteract pos = posKeyVal.get(itm.getOriDetailSn());
+                if (itm.getChargeAmount() + pos.getChargeAmount() == 0d
+                        && itm.getChargeFee() + pos.getChargeFee() == 0d) {
+                    dao.updateYbTransFlagInPair(patNo, times, itm.getDetailSn(), itm.getOriDetailSn());
+                    count.addAndGet(2);
+                }
+            }
+        });
+        log.info("正负相抵完成,抵消费用总条目:{}", count.get());
+    }
+}