Forráskód Böngészése

把门诊医保拆分为单独一个模块

lighter 4 éve
commit
3f84410bc8
44 módosított fájl, 3744 hozzáadás és 0 törlés
  1. 33 0
      .gitignore
  2. 84 0
      pom.xml
  3. 13 0
      src/main/java/thyyxxk/simzfeeoprnsystm/SiMzFeeOprnSystmApplication.java
  4. 59 0
      src/main/java/thyyxxk/simzfeeoprnsystm/controller/SiMzFeeController.java
  5. 132 0
      src/main/java/thyyxxk/simzfeeoprnsystm/dao/SiMzDao.java
  6. 14 0
      src/main/java/thyyxxk/simzfeeoprnsystm/dao/SiSetldetailDao.java
  7. 34 0
      src/main/java/thyyxxk/simzfeeoprnsystm/dao/SiSetlinfoDao.java
  8. 11 0
      src/main/java/thyyxxk/simzfeeoprnsystm/dao/StaffDao.java
  9. 49 0
      src/main/java/thyyxxk/simzfeeoprnsystm/dicts/ClrType.java
  10. 45 0
      src/main/java/thyyxxk/simzfeeoprnsystm/dicts/MdtrtCertType.java
  11. 43 0
      src/main/java/thyyxxk/simzfeeoprnsystm/dicts/PsnSetlWay.java
  12. 496 0
      src/main/java/thyyxxk/simzfeeoprnsystm/dicts/SiFunction.java
  13. 27 0
      src/main/java/thyyxxk/simzfeeoprnsystm/dicts/YesOrNo.java
  14. 13 0
      src/main/java/thyyxxk/simzfeeoprnsystm/pojo/CodeName.java
  15. 68 0
      src/main/java/thyyxxk/simzfeeoprnsystm/pojo/Diseinfo.java
  16. 208 0
      src/main/java/thyyxxk/simzfeeoprnsystm/pojo/FeeDetail.java
  17. 17 0
      src/main/java/thyyxxk/simzfeeoprnsystm/pojo/FundDetail.java
  18. 16 0
      src/main/java/thyyxxk/simzfeeoprnsystm/pojo/MtPartInfo.java
  19. 28 0
      src/main/java/thyyxxk/simzfeeoprnsystm/pojo/MzDepositFile.java
  20. 35 0
      src/main/java/thyyxxk/simzfeeoprnsystm/pojo/MzPatientInfo.java
  21. 109 0
      src/main/java/thyyxxk/simzfeeoprnsystm/pojo/MzPreSetlmt.java
  22. 149 0
      src/main/java/thyyxxk/simzfeeoprnsystm/pojo/MzReceipt.java
  23. 24 0
      src/main/java/thyyxxk/simzfeeoprnsystm/pojo/MzVisit.java
  24. 18 0
      src/main/java/thyyxxk/simzfeeoprnsystm/pojo/OrderNo.java
  25. 107 0
      src/main/java/thyyxxk/simzfeeoprnsystm/pojo/Regstrtn.java
  26. 46 0
      src/main/java/thyyxxk/simzfeeoprnsystm/pojo/ResultVo.java
  27. 126 0
      src/main/java/thyyxxk/simzfeeoprnsystm/pojo/Setlmt.java
  28. 167 0
      src/main/java/thyyxxk/simzfeeoprnsystm/pojo/SiPatInfo.java
  29. 59 0
      src/main/java/thyyxxk/simzfeeoprnsystm/pojo/SiSetldetail.java
  30. 265 0
      src/main/java/thyyxxk/simzfeeoprnsystm/pojo/SiSetlinfo.java
  31. 33 0
      src/main/java/thyyxxk/simzfeeoprnsystm/pojo/SpcChrDiseAcct.java
  32. 127 0
      src/main/java/thyyxxk/simzfeeoprnsystm/service/ExecService.java
  33. 394 0
      src/main/java/thyyxxk/simzfeeoprnsystm/service/SiMzFeeService.java
  34. 111 0
      src/main/java/thyyxxk/simzfeeoprnsystm/utils/DateUtil.java
  35. 70 0
      src/main/java/thyyxxk/simzfeeoprnsystm/utils/DecimalUtil.java
  36. 34 0
      src/main/java/thyyxxk/simzfeeoprnsystm/utils/ExceptionEnum.java
  37. 11 0
      src/main/java/thyyxxk/simzfeeoprnsystm/utils/FilterUtil.java
  38. 38 0
      src/main/java/thyyxxk/simzfeeoprnsystm/utils/ResultVoUtil.java
  39. 137 0
      src/main/java/thyyxxk/simzfeeoprnsystm/utils/SiUtil.java
  40. 97 0
      src/main/java/thyyxxk/simzfeeoprnsystm/utils/SnowFlakeId.java
  41. 16 0
      src/main/java/thyyxxk/simzfeeoprnsystm/utils/StringUtil.java
  42. 35 0
      src/main/resources/application.yml
  43. 133 0
      src/main/resources/logback-spring.xml
  44. 13 0
      src/test/java/thyyxxk/simzfeeoprnsystm/SiMzFeeOprnSystmApplicationTests.java

+ 33 - 0
.gitignore

@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/

+ 84 - 0
pom.xml

@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.6.1</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <groupId>thyyxxk</groupId>
+    <artifactId>SiMzFeeOprnSystm</artifactId>
+    <version>1.0</version>
+    <name>SiMzFeeOprnSystm</name>
+    <description>SiMzFeeOprnSystm</description>
+    <properties>
+        <java.version>1.8</java.version>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.4.3.4</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <scope>runtime</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>com.microsoft.sqlserver</groupId>
+            <artifactId>mssql-jdbc</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>net.sourceforge.jtds</groupId>
+            <artifactId>jtds</artifactId>
+            <version>1.3.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.78</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <excludes>
+                        <exclude>
+                            <groupId>org.projectlombok</groupId>
+                            <artifactId>lombok</artifactId>
+                        </exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 13 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/SiMzFeeOprnSystmApplication.java

@@ -0,0 +1,13 @@
+package thyyxxk.simzfeeoprnsystm;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SiMzFeeOprnSystmApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(SiMzFeeOprnSystmApplication.class, args);
+    }
+
+}

+ 59 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/controller/SiMzFeeController.java

@@ -0,0 +1,59 @@
+package thyyxxk.simzfeeoprnsystm.controller;
+
+import thyyxxk.simzfeeoprnsystm.pojo.FundDetail;
+import thyyxxk.simzfeeoprnsystm.pojo.MzPatientInfo;
+import thyyxxk.simzfeeoprnsystm.pojo.SpcChrDiseAcct;
+import thyyxxk.simzfeeoprnsystm.pojo.*;
+import thyyxxk.simzfeeoprnsystm.service.SiMzFeeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/mzFee")
+public class SiMzFeeController {
+    private final SiMzFeeService service;
+
+    @Autowired
+    public SiMzFeeController(SiMzFeeService service) {
+        this.service = service;
+    }
+
+    @PostMapping("/outpatientRegistration")
+    public ResultVo<String> outpatientRegistration(@RequestBody MzPatientInfo p) {
+        return service.outpatientRegistration(p);
+    }
+
+    @PostMapping("/revokeOutpatientRegistration")
+    public ResultVo<String> revokeOutpatientRegistration(@RequestBody MzPatientInfo p) {
+        return service.revokeOutpatientRegistration(p);
+    }
+
+    @PostMapping("/uploadOutpatientFeeDetails")
+    public ResultVo<SiPatInfo> uploadOutpatientFeeDetails(@RequestBody SpcChrDiseAcct p) {
+        return service.uploadOutpatientFeeDetails(p);
+    }
+
+    @PostMapping("/revokeOutpatientFeeDetails")
+    public ResultVo<String> revokeOutpatientFeeDetails(@RequestBody MzPatientInfo p) {
+        return service.revokeOutpatientFeeDetails(p);
+    }
+
+    @PostMapping("/outpatientPreSettlement")
+    public ResultVo<FundDetail> outpatientPreSettlement(@RequestBody MzPatientInfo p) {
+        return service.outpatientPreSettlement(p);
+    }
+
+    @PostMapping("/outpatientSettlement")
+    public ResultVo<FundDetail> outpatientSettlement(@RequestBody MzPatientInfo p) {
+        return service.outpatientSettlement(p);
+    }
+
+    @PostMapping("/revokeOutpatientSettlement")
+    public ResultVo<String> revokeOutpatientSettlement(@RequestBody MzPatientInfo p) {
+        return service.revokeOutpatientSettlement(p);
+    }
+
+}

+ 132 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/dao/SiMzDao.java

@@ -0,0 +1,132 @@
+package thyyxxk.simzfeeoprnsystm.dao;
+
+import thyyxxk.simzfeeoprnsystm.pojo.*;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+
+@Mapper
+public interface SiMzDao {
+    @Select("select * from t_si_pat_info where pat_no=#{patNo} and times=#{times}")
+    SiPatInfo selectSiPatInfoForMz(@Param("patNo") String patNo,
+                                   @Param("times") int times);
+
+    @Update("update t_si_pat_info set mdtrt_id=#{nullCtnt}, setl_id=#{nullCtnt} where pat_no=#{patientId} and times=#{times} ")
+    void clearMdtrtIdForMz(@Param("patientId") String patientId,
+                           @Param("times") int times,
+                           @Param("nullCtnt") String nullCtnt);
+
+    @Select("select a.psn_no, " +
+            "b.visit_date as begntime, " +
+            "a.certno as mdtrtCertNo, " +
+            "a.psn_cert_type, " +
+            "a.certno, " +
+            "a.psn_name, " +
+            "rtrim(b.doctor_code) as atddrNo, " +
+            "drName=(select rtrim(name) from a_employee_mi where code=b.doctor_code), " +
+            "rtrim(b.visit_dept_code) as deptCode, " +
+            "deptName=(select rtrim(name) from zd_unit_code where code=b.visit_dept_code), " +
+            "caty=(select si_caty from zd_unit_code where code=b.visit_dept_code) " +
+            "from t_si_pat_info a, mz_visit_table b where a.pat_no=#{patNo} and a.times=#{times} " +
+            "and a.pat_no=b.patient_id and a.times=b.times")
+    Regstrtn selectRegstrtn(@Param("patNo") String patNo, @Param("times") int times);
+
+    @Select("select times from mz_patient_mi where patient_id=#{patientId} ")
+    Integer selectMaxTimes(@Param("patientId") String patientId);
+
+    @Select("select insuplc_admdvs from t_si_pat_info where " +
+            "pat_no=#{patNo} and times=#{times} and ledger_sn=#{ledgerSn}")
+    String selectAdmdvs(@Param("patNo") String patNo,
+                        @Param("times") int times,
+                        @Param("ledgerSn") int ledgerSn);
+
+    @Update("update t_si_pat_info set insuplc_admdvs=#{insuplcAdmdvs},psn_type=#{psnType},emp_name=#{empName}," +
+            "mdtrt_id=#{mdtrtId},insutype=#{insutype},visit_datetime=#{visitDate} " +
+            "where pat_no=#{patNo} and times=#{times} ")
+    void afterRegistrtn(MzPatientInfo p);
+
+    @Select("select count(1) from mt_part_info where patient_id=#{patNo} and times=#{times}")
+    int selectMtPartCount(@Param("patNo") String patNo, @Param("times") int times);
+
+    @Insert("insert into mt_part_info (patient_id, times, icd, balance, serial_apply, responce_type, " +
+            "hic_no, icd_code, icd_name, second_icd_code, third_icd_code, mz_serial_no, create_datetime) values "+
+            "(#{patientId},#{times},null,null,#{bizType},'03',#{hicNo},#{icdCode},#{icdName}," +
+            "#{secondIcdCode},#{thirdIcdCode},#{mzSerialNo},getdate())")
+    void insertMtPartInfo(MtPartInfo info);
+
+    @Select("select feedetlSn=(patient_id + '_' + cast(times as varchar) + '_' + cast(receipt_no as varchar) + '_' + " +
+            "cast(order_no as varchar) + '_' + cast(item_no as varchar)), " +
+            "receipt_no as rxno, input_date as feeOcurTime, " +
+            "medListCodg=isnull((select max(national_code) from yp_zd_dict where code=his_item_code), " +
+            "(select max(national_code) from zd_charge_item where code=his_item_code)), " +
+            "his_item_code as medinsListCodg, " +
+            "charge_fee as detItemFeeSumamt, " +
+            "quantity as cnt, price as pric, " +
+            "bilgDeptCodg=(select rtrim(dept_code) from a_employee_mi where code=input_staff) , " +
+            "bilgDeptName=(select rtrim(name) from zd_unit_code where code=(select rtrim(dept_code) from a_employee_mi where code=input_staff)), " +
+            "input_staff as bilgDrCodg, " +
+            "input_man as bilgDrName " +
+            "from t_mt_receipt where patient_id=#{patNo} and times=#{times} and yb_trans_flag=0 ")
+    List<FeeDetail> selectOutpatientFees(@Param("patNo") String patNo, @Param("times") int times);
+
+    @Update("update t_mt_receipt set yb_trans_flag=1,chrgitm_lv=#{chrgLv},med_chrgitm_type=#{chrgType} where " +
+            "patient_id=#{patNo} and times=#{times} and receipt_no=#{recNo} and order_no=#{odrNo} and item_no=#{itmNo}")
+    void afterUploadFees(@Param("patNo") String patNo,
+                         @Param("times") int times,
+                         @Param("recNo") int recNo,
+                         @Param("odrNo") int odrNo,
+                         @Param("itmNo") int itmNo,
+                         @Param("chrgLv") String chrgLv,
+                         @Param("chrgType") String chrgType);
+
+    @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}) " +
+            "from t_si_pat_info where pat_no=#{patNo} and times=#{times}")
+    MzPreSetlmt selectPreSetlmt(@Param("patNo") String patNo, @Param("times") int times);
+
+    @Select("select diagType='1', " +
+            "diagSrtNo=1, " +
+            "rtrim(icd_code) as diagCode, " +
+            "rtrim(icd_text) as diagName, " +
+            "rtrim(visit_dept_code) as diagDept, " +
+            "rtrim(doctor_code) as diseDorNo, " +
+            "diseDorName=(select rtrim(name) from a_employee_mi where code=doctor_code), " +
+            "visit_date as diagTime, " +
+            "valiFlag='1' " +
+            "from mz_visit_table where patient_id=#{patNo} and times=#{times}")
+    Diseinfo selectDiseinfo(@Param("patNo") String patNo, @Param("times") int times);
+
+    @Update("update t_si_pat_info set dise_code=#{code},dise_name=#{name} where pat_no=#{patNo} and times=#{times}")
+    void updatePatDiseinfo(@Param("patNo") String patNo, @Param("times") int times,
+                           @Param("code") String code, @Param("name") String name);
+
+    @Update("update t_si_pat_info set fulamt_ownpay_amt=#{fulamtOwnpayAmt}, overlmt_amt=#{overlmtAmt}, " +
+            "preselfpay_amt=#{preselfpayAmt}, inscp_scp_amt=#{inscpScpAmt} where pat_no=#{patNo} and times=#{times}")
+    void updateSortOfAmt(SiPatInfo patInfo);
+
+    @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, " +
+            "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, " +
+            "preselfpay_amt,inscp_scp_amt " +
+            "from t_si_pat_info where pat_no=#{patNo} and times=#{times}")
+    Setlmt selectSetlmt(@Param("patNo") String patNo, @Param("times") int times);
+
+    @Update("update t_si_setlinfo set revoked=1 where pat_no=#{patNo} and times=#{times}")
+    void deleteSetlInfo(@Param("patNo") String patNo, @Param("times") int times);
+
+    @Update("delete from t_si_setldetail where pat_no=#{patNo} and times=#{times}")
+    void deleteSetlDetail(@Param("patNo") String patNo, @Param("times") int times);
+
+    @Update("update t_si_pat_info set rvk_setl_msgid=#{rvkSetlMsgid} where pat_no=#{patNo} and times=#{times}")
+    void updateRvkSetlMsgid(@Param("patNo") String patNo, @Param("times") int times, @Param("rvkSetlMsgid") String rvkSetlMsgid);
+
+    @Select("select * from t_si_mz_diag where pat_no=#{patNo} and times=#{times}")
+    List<Diseinfo> selectMzDiags(@Param("patNo") String patNo, @Param("times") int times);
+}

+ 14 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/dao/SiSetldetailDao.java

@@ -0,0 +1,14 @@
+package thyyxxk.simzfeeoprnsystm.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import thyyxxk.simzfeeoprnsystm.pojo.SiSetldetail;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @description: 医保结算基金分项信息
+ * @author: DingJie
+ * @create: 2021/7/1317:27
+ */
+@Mapper
+public interface SiSetldetailDao extends BaseMapper<SiSetldetail> {
+}

+ 34 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/dao/SiSetlinfoDao.java

@@ -0,0 +1,34 @@
+package thyyxxk.simzfeeoprnsystm.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import thyyxxk.simzfeeoprnsystm.pojo.SiSetlinfo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Update;
+
+/**
+ * @description: 结算基本信息
+ * @author: DingJie
+ * @create: 2021/7/1317:20
+ */
+@Mapper
+public interface SiSetlinfoDao extends BaseMapper<SiSetlinfo> {
+
+    /**
+     * 更新患者的医保基本信息(结算id)
+     *
+     * @param patNo  住院号/门诊号
+     * @param times  住院次数/门诊次数
+     * @param ledgerSn     账页号
+     * @param setlId       结算id
+     * @param medinsSetlId 医药机构结算ID,存放发送方报文ID
+     */
+    @Update("update t_si_pat_info set setl_id=#{setlId},medins_setl_id=#{medinsSetlId}," +
+            "setl_msgid=#{setlMsgid} where pat_no=#{patNo} and times=#{times} and ledger_sn=#{ledgerSn}")
+    void updateSiZyInfoSetlId(@Param("patNo") String patNo,
+                              @Param("times") int times,
+                              @Param("ledgerSn") int ledgerSn,
+                              @Param("setlId") String setlId,
+                              @Param("medinsSetlId") String medinsSetlId,
+                              @Param("setlMsgid") String setlMsgid);
+}

+ 11 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/dao/StaffDao.java

@@ -0,0 +1,11 @@
+package thyyxxk.simzfeeoprnsystm.dao;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+@Mapper
+public interface StaffDao {
+    @Select("select rtrim(name) from a_employee_mi where code=#{staffId}")
+    String selectStaffName(@Param("staffId") String staffId);
+}

+ 49 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/dicts/ClrType.java

@@ -0,0 +1,49 @@
+package thyyxxk.simzfeeoprnsystm.dicts;
+
+import thyyxxk.simzfeeoprnsystm.utils.StringUtil;
+
+/**
+ * @description: 清算类别
+ * @author: DingJie
+ * @create: 2021/7/1010:54
+ */
+public enum ClrType {
+
+    OUTPATIENT("11", "门诊"),
+
+    INPATIENT("21", "住院"),
+
+    DRUGSTORE("41", "药店购药"),
+
+    DELAY_SETTLEMENT("51", "暂缓结算"),
+
+    OTHERS("99", "其他");
+
+    private final String code;
+    private final String name;
+
+    ClrType(String code, String name) {
+        this.code = code;
+        this.name = name;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public static ClrType get(String code) {
+        if (StringUtil.isBlank(code)) {
+            return null;
+        }
+        for (ClrType clrType : ClrType.values()) {
+            if (code.trim().equals(clrType.getCode())) {
+                return clrType;
+            }
+        }
+        return null;
+    }
+}

+ 45 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/dicts/MdtrtCertType.java

@@ -0,0 +1,45 @@
+package thyyxxk.simzfeeoprnsystm.dicts;
+
+import thyyxxk.simzfeeoprnsystm.utils.StringUtil;
+
+/**
+ * @description: 就诊凭证类型
+ * @author: DingJie
+ * @create: 2021/7/129:17
+ */
+public enum MdtrtCertType {
+
+    MEDICAL_INSURANCE_ELECTRONIC_VOUCHER("01", "医保电子凭证"),
+
+    RESIDENT_IDENTITY_CARD("02", "居民身份证"),
+
+    SOCIAL_SECURITY_CARD("03", "社会保障卡");
+
+    private final String code;
+    private final String name;
+
+    MdtrtCertType(String code, String name) {
+        this.code = code;
+        this.name = name;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public static MdtrtCertType get(String code) {
+        if (StringUtil.isBlank(code)) {
+            return null;
+        }
+        for (MdtrtCertType mdtrtCertType : MdtrtCertType.values()) {
+            if (code.trim().equals(mdtrtCertType.getCode())) {
+                return mdtrtCertType;
+            }
+        }
+        return null;
+    }
+}

+ 43 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/dicts/PsnSetlWay.java

@@ -0,0 +1,43 @@
+package thyyxxk.simzfeeoprnsystm.dicts;
+
+import thyyxxk.simzfeeoprnsystm.utils.StringUtil;
+
+/**
+ * @description: 个人结算方式
+ * @author: DingJie
+ * @create: 2021/7/2216:31
+ */
+public enum PsnSetlWay {
+
+    SETTLE_BY_ITEMS("01", "按项目结算"),
+
+    SETTLE_BY_QUOTA("02", "按定额结算");
+
+    private final String code;
+    private final String name;
+
+    PsnSetlWay(String code, String name) {
+        this.code = code;
+        this.name = name;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public static PsnSetlWay get(String code) {
+        if (StringUtil.isBlank(code)) {
+            return null;
+        }
+        for (PsnSetlWay psnSetlWay : PsnSetlWay.values()) {
+            if (code.trim().equals(psnSetlWay.getCode())) {
+                return psnSetlWay;
+            }
+        }
+        return null;
+    }
+}

+ 496 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/dicts/SiFunction.java

@@ -0,0 +1,496 @@
+package thyyxxk.simzfeeoprnsystm.dicts;
+
+/**
+ * @description: Medical insurance interface function No.
+ * @author: DingJie
+ * @create: 2021-05-11 15:32:09
+ **/
+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"),
+
+    /* =========================================== 住院结算 ========================================== */
+    /**
+     * 通过此交易上传住院费用明细信息(住院费用明细上传)
+     */
+    UPLOAD_HOSPITALIZATION_FEE_DETAILS("2301"),
+
+    /**
+     * 通过此交易撤销住院费用明细信息(住院费用明细撤销)
+     * */
+    REVOKE_HOSPITALIZATION_FEE_DETAILS("2302"),
+
+    /**
+     * 通过此交易进行住院结算的预结算(住院预结算)
+     */
+    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"),
+
+    /* =========================================== 检查检验互认结果查询 ========================================== */
+    /**
+     * 通过此交易在开医技医嘱时获取项目互认的结果(项目互认信息查询)
+     */
+    QUERY_MUTUAL_ACCREDIT_INFO("5401"),
+
+    /**
+     * 通过此交易在根据互认结果列表获取诊断明细(报告明细信息查询)
+     */
+    QUERY_DIAGNOSIS_REPORT_DETAIL("5402"),
+
+    /* =========================================== 药店线上支付 ========================================== */
+    /**
+     * 通过此交易,定点零售药店上传药店线上支付使用的费用明细(药店线上费用明细上传)
+     */
+    UPLOAD_DRUGSTORE_ONLINE_FEE_DETAIL("6101"),
+
+    /* =========================================== 签到签退 ========================================== */
+    /**
+     * 通过此交易进行调用方签到(签到)
+     */
+    SIGN_IN("9001"),
+
+    /**
+     * 通过此交易进行调用方签退(签退)
+     */
+    SIGN_OUT("9002"),
+
+    /**
+     * 获取政策项费用
+     * */
+    LIST_POL_ITEM_CODE_PAY_INFO("100001"),
+
+    /* =========================================== 上传下载 ========================================== */
+    /**
+     * 通过此交易上传文件(文件上传)
+     */
+    UPLOAD_FILE("9101"),
+
+    /**
+     * 通过此交易下载【1301-1319】目录信息下载、【5204】费用明细查询、【3202】医药机构费用结算对明细账交易生成的文件(文件下载)
+     */
+    DOWNLOAD_FILE("9102");
+
+    private final String code;
+
+    SiFunction(String code) {
+        this.code = code;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+}

+ 27 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/dicts/YesOrNo.java

@@ -0,0 +1,27 @@
+package thyyxxk.simzfeeoprnsystm.dicts;
+
+/**
+ * @description: 1是0否
+ * @author: DingJie
+ * @create: 2021/7/915:55
+ */
+public enum YesOrNo {
+    YES(1),
+
+    NO(0);
+
+    private final int code;
+
+    YesOrNo(int code) {
+        this.code = code;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public String getCodeStr() {
+        return String.valueOf(code);
+    }
+
+}

+ 13 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/pojo/CodeName.java

@@ -0,0 +1,13 @@
+package thyyxxk.simzfeeoprnsystm.pojo;
+
+import lombok.Data;
+
+@Data
+public class CodeName {
+    private String codeRs;
+    private String name;
+
+    public String getStaff() {
+        return "【工号:" + codeRs + ",姓名:" + name + "】";
+    }
+}

+ 68 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/pojo/Diseinfo.java

@@ -0,0 +1,68 @@
+package thyyxxk.simzfeeoprnsystm.pojo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @description: 门诊诊断
+ * @author: DingJie
+ * @create: 2021/7/2218:24
+ */
+@Data
+public class Diseinfo {
+    /**
+     * 诊断类别
+     * */
+    @JSONField(name = "diag_type")
+    private String diagType;
+    
+    /**
+     * 诊断排序号
+     * */
+    @JSONField(name = "diag_srt_no")
+    private Integer diagSrtNo;
+    
+    /**
+     * 诊断代码
+     * */
+    @JSONField(name = "diag_code")
+    private String diagCode;
+    
+    /**
+     * 诊断名称
+     * */
+    @JSONField(name = "diag_name")
+    private String diagName;
+    
+    /**
+     * 诊断科室
+     * */
+    @JSONField(name = "diag_dept")
+    private String diagDept;
+    
+    /**
+     * 诊断医生编码
+     * */
+    @JSONField(name = "dise_dor_no")
+    private String diseDorNo;
+    
+    /**
+     * 诊断医生姓名
+     * */
+    @JSONField(name = "dise_dor_name")
+    private String diseDorName;
+    
+    /**
+     * 诊断时间
+     * */
+    @JSONField(name = "diag_time")
+    private Date diagTime;
+    
+    /**
+     * 有效标志
+     * */
+    @JSONField(name = "vali_flag")
+    private String valiFlag;
+}

+ 208 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/pojo/FeeDetail.java

@@ -0,0 +1,208 @@
+package thyyxxk.simzfeeoprnsystm.pojo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @description: 费用明细
+ * @author: DingJie
+ * @create: 2021/7/209:02
+ */
+@Data
+public class FeeDetail {
+    /**
+     * 费用明细流水号(单次就诊内唯一)
+     * */
+    @JSONField(name = "feedetl_sn")
+    private String feedetlSn;
+
+    /**
+     * 就诊ID
+     * */
+    @JSONField(name = "mdtrt_id")
+    private String mdtrtId;
+
+    /**
+     * 人员编号
+     * */
+    @JSONField(name = "psn_no")
+    private String psnNo;
+
+    /**
+     * 收费批次号(同一收费批次号病种编号必须一致)
+     * */
+    @JSONField(name = "chrg_bchno")
+    private String chrgBchno;
+
+    /**
+     * 处方号(外购处方时,传入外购处方的处方号;非外购处方,传入医药机构处方号)
+     * */
+    private String rxno;
+
+    /**
+     * 外购处方标志
+     * */
+    @JSONField(name = "rx_circ_flag")
+    private String rxCircFlag;
+
+    /**
+     * 费用发生时间
+     * */
+    @JSONField(name = "fee_ocur_time")
+    private Date feeOcurTime;
+
+    /**
+     * 医疗目录编码
+     * */
+    @JSONField(name = "med_list_codg")
+    private String medListCodg;
+
+    /**
+     * 医药机构目录编码
+     * */
+    @JSONField(name = "medins_list_codg")
+    private String medinsListCodg;
+
+    /**
+     * 明细项目费用总额
+     * */
+    @JSONField(name = "det_item_fee_sumamt")
+    private Double detItemFeeSumamt;
+
+    /**
+     * 数量
+     * */
+    private Double cnt;
+
+    /**
+     * 单价
+     * */
+    private Double pric;
+
+    /**
+     * 开单科室编码
+     * */
+    @JSONField(name = "bilg_dept_codg")
+    private String bilgDeptCodg;
+
+    /**
+     * 开单科室名称
+     * */
+    @JSONField(name = "bilg_dept_name")
+    private String bilgDeptName;
+
+    /**
+     * 开单医生编码
+     * */
+    @JSONField(name = "bilg_dr_codg")
+    private String bilgDrCodg;
+
+    /**
+     * 开单医师姓名
+     * */
+    @JSONField(name = "bilg_dr_name")
+    private String bilgDrName;
+
+    /**
+     * 医院审批标志
+     * 医院审批标志,配合目录的限制使用标志使用:
+     * a). 当目录限制使用标志为“是”时:
+     * 	i)	医院审批标志为“0”或“2”时,明细按照自费处理;
+     * 	ii)	医院审批标志为“1”时,明细按纳入报销处理。
+     * b). 当目录限制使用标志为“否”时:
+     * 	i)	医院审批标志为“0”或“1”时,明细按照实际情况处理;
+     * 	ii)	医院审批标志为“2”时,明细按照自费处理。
+     * */
+    @JSONField(name = "hosp_appr_flag")
+    private String hospApprFlag;
+
+    /**
+     * ====================
+     * 以下为非必填字段
+     * ====================
+     * 病种编码(按照标准编码填写:按病种结算病种目录代码(bydise_setl_list_code)、门诊慢特病病种目录代码(opsp_dise_cod))
+     * */
+    @JSONField(name = "dise_codg")
+    private String diseCodg;
+
+    /**
+     * 单次剂量描述
+     * */
+    @JSONField(name = "sin_dos_dscr")
+    private String sinDosDscr;
+
+    /**
+     * 使用频次描述
+     * */
+    @JSONField(name = "used_frqu_dscr")
+    private String usedFrquDscr;
+
+    /**
+     * 周期天数
+     * */
+    @JSONField(name = "prd_days")
+    private Double prdDays;
+
+    /**
+     * 用药途径描述
+     * */
+    @JSONField(name = "medc_way_dscr")
+    private String medcWayDscr;
+
+    /**
+     * 受单科室编码
+     * */
+    @JSONField(name = "acord_dept_codg")
+    private String acordDeptCodg;
+
+    /**
+     * 受单科室名称
+     * */
+    @JSONField(name = "acord_dept_name")
+    private String acordDeptName;
+
+    /**
+     * 受单医生编码
+     * */
+    @JSONField(name = "orders_dr_code")
+    private String ordersDrCode;
+
+    /**
+     * 受单医生姓名
+     * */
+    @JSONField(name = "orders_dr_name")
+    private String ordersDrName;
+
+    /**
+     * 中药使用方式
+     * */
+    @JSONField(name = "tcmdrug_used_way")
+    private String tcmdrugUsedWay;
+
+    /**
+     * 外检标志
+     * */
+    @JSONField(name = "etip_flag")
+    private String etipFlag;
+
+    /**
+     * 外检医院编码
+     * */
+    @JSONField(name = "etip_hosp_code")
+    private String etipHospCode;
+
+    /**
+     * 出院带药标志
+     * */
+    @JSONField(name = "dscg_tkdrug_flag")
+    private String dscgTkdrugFlag;
+
+    /**
+     * 生育费用标志
+     * */
+    @JSONField(name = "matn_fee_flag")
+    private String matnFeeFlag;
+
+}

+ 17 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/pojo/FundDetail.java

@@ -0,0 +1,17 @@
+package thyyxxk.simzfeeoprnsystm.pojo;
+
+import lombok.Data;
+
+/**
+ * @description: 试算、结算报销
+ * @author: DingJie
+ * @create: 2021/7/2011:31
+ */
+@Data
+public class FundDetail {
+    private String totalCost;
+    private String fundPay;
+    private String acctPay;
+    private String cashPay;
+    private String selfPay;
+}

+ 16 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/pojo/MtPartInfo.java

@@ -0,0 +1,16 @@
+package thyyxxk.simzfeeoprnsystm.pojo;
+
+import lombok.Data;
+
+@Data
+public class MtPartInfo {
+    private String patientId;
+    private Integer times;
+    private String hicNo;
+    private String bizType;
+    private String icdCode;
+    private String icdName;
+    private String secondIcdCode;
+    private String thirdIcdCode;
+    private String mzSerialNo;
+}

+ 28 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/pojo/MzDepositFile.java

@@ -0,0 +1,28 @@
+package thyyxxk.simzfeeoprnsystm.pojo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Date;
+
+@Data
+public class MzDepositFile {
+    private String patNo;
+    private Integer times;
+    private Integer receiptNo;
+    private Date chargeDate;
+    private BigDecimal chargeFee;
+    private Integer status;
+
+    public BigDecimal getChargeFee() {
+        if (null == chargeFee) {
+            return BigDecimal.ZERO;
+        }
+        return chargeFee.setScale(2, RoundingMode.HALF_UP);
+    }
+
+    public Integer getStatus() {
+        return null == status ? 0 : status;
+    }
+}

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

@@ -0,0 +1,35 @@
+package thyyxxk.simzfeeoprnsystm.pojo;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @description: 门诊患者基本信息
+ * @author: DingJie
+ * @create: 2021-06-28 14:40:10
+ **/
+@Data
+public class MzPatientInfo {
+    private String staffId;
+    private String patNo;
+    private Integer times;
+    private Integer ledgerSn;
+    private String name;
+    private String socialNo;
+    private String psnNo;
+    private String insuplcAdmdvs;
+    private String insutype;
+    private String empName;
+    private String mdtrtId;
+    private String medType;
+    private String psnType;
+    private Date visitDate;
+    private String doctorCode;
+    private String doctorName;
+    private String deptCode;
+    private String deptName;
+    private String deptClass;
+    private String icdCode;
+    private String icdText;
+}

+ 109 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/pojo/MzPreSetlmt.java

@@ -0,0 +1,109 @@
+package thyyxxk.simzfeeoprnsystm.pojo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @description: 门诊预结算入参
+ * @author: DingJie
+ * @create: 2021/7/2010:38
+ */
+@Data
+public class MzPreSetlmt {
+    /**
+     * 人员编号
+     * */
+    @JSONField(name = "psn_no")
+    private String psnNo;
+
+    /**
+     * 参保地医保区划
+     * */
+    @JSONField(name = "insuplc_admdvs")
+    private String insuplcAdmdvs;
+
+    /**
+     * 就诊凭证类型
+     * */
+    @JSONField(name = "mdtrt_cert_type")
+    private String mdtrtCertType;
+
+    /**
+     * 就诊凭证编号(就诊凭证类型为“01”时填写电子凭证令牌,为“02”时填写身份证号,为“03”时填写社会保障卡卡号)
+     * */
+    @JSONField(name = "mdtrt_cert_no")
+    private String mdtrtCertNo;
+
+    /**
+     * 卡识别码(就诊凭证类型为“03”时必填)
+     * */
+    @JSONField(name = "card_sn")
+    private String cardSn;
+
+    /**
+     * 证件类型
+     * */
+    @JSONField(name = "psn_cert_type")
+    private String psnCertType;
+
+    /**
+     * 证件号码
+     * */
+    private String certno;
+
+    /**
+     * 人员类别
+     * */
+    @JSONField(name = "psn_type")
+    private String psnType;
+
+    /**
+     * 人员姓名
+     * */
+    @JSONField(name = "psn_name")
+    private String psnName;
+
+    /**
+     * 医疗类别
+     * */
+    @JSONField(name = "med_type")
+    private String medType;
+
+    /**
+     * 医疗费总额
+     * */
+    @JSONField(name = "medfee_sumamt")
+    private BigDecimal medfeeSumamt;
+
+    /**
+     * 个人结算方式
+     * */
+    @JSONField(name = "psn_setlway")
+    private String psnSetlway;
+
+    /**
+     * 就诊ID
+     * */
+    @JSONField(name = "mdtrt_id")
+    private String mdtrtId;
+
+    /**
+     * 收费批次号
+     * */
+    @JSONField(name = "chrg_bchno")
+    private String chrgBchno;
+
+    /**
+     * 个人账户使用标志
+     * */
+    @JSONField(name = "acct_used_flag")
+    private String acctUsedFlag;
+
+    /**
+     * 险种类型
+     * */
+    private String insutype;
+
+}

+ 149 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/pojo/MzReceipt.java

@@ -0,0 +1,149 @@
+package thyyxxk.simzfeeoprnsystm.pojo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Date;
+
+/**
+ * @author dj
+ */
+@Data
+public class MzReceipt {
+    private String drugName;
+    private String patientId;
+    private Integer times;
+    private Integer receiptNo;
+    private Integer orderNo;
+    private Integer itemNo;
+    private String chargeItemCode;
+    private String chargeBillCode;
+    private Double quantity;
+    private BigDecimal unitPrice;
+    private Integer payMark;
+    private String serial;
+    private String serialNo;
+    private String frequency;
+    private Double drugQuan;
+    private String drugUnit;
+    private String supplyCode;
+    private Integer orderDays;
+    private Date chargeDate;
+    /**
+     * 00 项目,其他 药品
+     * */
+    private String groupNo;
+    private String specification;
+    private Integer confirmFlag;
+    private String instructionText;
+    private Integer drugWin;
+    private String priceTime;
+    private String dosage;
+    private String mediItemType;
+    private String billItemCode;
+    private String doctorCode;
+    private String doctorName;
+    private String name;
+    private String responceType;
+    private String tcNo;
+    private String tcName;
+    private BigDecimal price;
+    private BigDecimal chargeFee;
+    private Boolean checked;
+
+    public String getDrugName() {
+        return null == drugName ? "" : (drugName).trim();
+    }
+
+    public String getPatientId() {
+        return null == patientId ? "" : (patientId).trim();
+    }
+
+    public String getChargeItemCode() {
+        return null == chargeItemCode ? "" : (chargeItemCode).trim();
+    }
+
+    public String getChargeBillCode() {
+        return null == chargeBillCode ? "" : (chargeBillCode).trim();
+    }
+
+    public String getSerial() {
+        return null == serial ? "" : (serial).trim();
+    }
+
+    public String getSerialNo() {
+        return null == serialNo ? "" : (serialNo).trim();
+    }
+
+    public String getGroupNo() {
+        return null == groupNo ? "" : (groupNo).trim();
+    }
+
+    public String getSpecification() {
+        return null == specification ? "" : (specification).trim();
+    }
+
+    public String getDosage() {
+        return null == dosage ? "" : (dosage).trim();
+    }
+
+    public String getDoctorCode() {
+        return null == doctorCode ? "" : (doctorCode).trim();
+    }
+
+    public String getName() {
+        return null == name ? "" : (name).trim();
+    }
+
+    public String getResponceType() {
+        return null == responceType ? "" : (responceType).trim();
+    }
+
+    public String getTcNo() {
+        return null == tcNo ? "" : (tcNo).trim();
+    }
+
+    public String getTcName() {
+        return null == tcName ? "" : (tcName).trim();
+    }
+
+    public String getMediItemType() {
+        if ("TC".equals(billItemCode.trim())) {
+            return "TC";
+        }
+        switch (billItemCode.trim()) {
+            // 西药
+            case "010":
+            case "1":
+                return "1";
+            // 中成药
+            case "011":
+            case "2":
+                return "2";
+            // 中草药
+            case "012":
+            case "3":
+                return "3";
+            // 其他
+            default:
+                return "0";
+        }
+    }
+
+    public String getBillItemCode() {
+        return null == billItemCode ? "" : (billItemCode).trim();
+    }
+
+    public BigDecimal getPrice() {
+        BigDecimal price= (getUnitPrice() == null ? BigDecimal.ZERO : getUnitPrice()).setScale(2, RoundingMode.HALF_UP);
+        if(BigDecimal.ZERO.compareTo(price)==0){
+            price=BigDecimal.valueOf(0.01);
+        }
+        return price.multiply(BigDecimal.valueOf(getDrugWin() == null ? 1D : getDrugWin()));
+    }
+
+    public BigDecimal getChargeFee() {
+        return getPrice().multiply(BigDecimal.valueOf(getQuantity() == null ? 1D : getQuantity()));
+    }
+}

+ 24 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/pojo/MzVisit.java

@@ -0,0 +1,24 @@
+package thyyxxk.simzfeeoprnsystm.pojo;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class MzVisit {
+    private String patientId;
+    private Integer times;
+    private String visitDeptCode;
+    private String visitDeptName;
+    private String doctorCode;
+    private String doctorName;
+    private Date visitDate;
+    private String icdCode;
+    private Integer receiptNo;
+    private Integer orderNo;
+    private Date opDay;
+    private String windowsNo;
+    private Integer receiveFlag;
+    private String icdText;
+    private String responceType;
+}

+ 18 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/pojo/OrderNo.java

@@ -0,0 +1,18 @@
+package thyyxxk.simzfeeoprnsystm.pojo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author dj
+ */
+@Data
+public class OrderNo {
+    private String patientId;
+    private Integer times;
+    private Integer receiptNo;
+    private Integer orderNo;
+    private BigDecimal totalFee;
+    private Boolean status;
+}

+ 107 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/pojo/Regstrtn.java

@@ -0,0 +1,107 @@
+package thyyxxk.simzfeeoprnsystm.pojo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @description: 门诊挂号入参
+ * @author: DingJie
+ * @create: 2021/7/2110:13
+ */
+@Data
+public class Regstrtn {
+    /**
+     * 人员编号
+     * */
+    @JSONField(name = "psn_no")
+    private String psnNo;
+
+    /**
+     * 险种类型
+     * */
+    private String insutype;
+
+    /**
+     * 挂号时间 yyyy-MM-dd HH:mm:ss
+     * */
+    private Date begntime;
+
+    /**
+     * 就诊凭证类型
+     * */
+    @JSONField(name = "mdtrt_cert_type")
+    private String mdtrtCertType;
+
+    /**
+     * 就诊凭证编号(就诊凭证类型为“01”时填写电子凭证令牌,为“02”时填写身份证号,为“03”时填写社会保障卡卡号)
+     * */
+    @JSONField(name = "mdtrt_cert_no")
+    private String mdtrtCertNo;
+
+    /**
+     * 卡识别码(就诊凭证类型为“03”时必填)
+     * */
+    @JSONField(name = "card_sn")
+    private String cardSn;
+
+    /**
+     * 证件类型
+     * */
+    @JSONField(name = "psn_cert_type")
+    private String psnCertType;
+
+    /**
+     * 证件号码
+     * */
+    private String certno;
+
+    /**
+     * 人员类别
+     * */
+    @JSONField(name = "psn_type")
+    private String psnType;
+
+    /**
+     * 人员姓名
+     * */
+    @JSONField(name = "psn_name")
+    private String psnName;
+
+    /**
+     * 门诊号
+     * */
+    @JSONField(name = "ipt_otp_no")
+    private String iptOtpNo;
+
+    /**
+     * 医师编码
+     * */
+    @JSONField(name = "atddr_no")
+    private String atddrNo;
+
+    /**
+     * 医师姓名
+     * */
+    @JSONField(name = "dr_name")
+    private String drName;
+
+    /**
+     * 科室编码
+     * */
+    @JSONField(name = "dept_code")
+    private String deptCode;
+
+    /**
+     * 科室名称
+     * */
+    @JSONField(name = "dept_name")
+    private String deptName;
+
+    /**
+     * 科别
+     * */
+    private String caty;
+
+}

+ 46 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/pojo/ResultVo.java

@@ -0,0 +1,46 @@
+package thyyxxk.simzfeeoprnsystm.pojo;
+
+import thyyxxk.simzfeeoprnsystm.utils.ExceptionEnum;
+import lombok.Data;
+
+@Data
+public class ResultVo<T> {
+    private Integer code;
+    private String message;
+    private T data;
+
+
+    public ResultVo() {
+        this.code = ExceptionEnum.SUCCESS.getCode();
+        this.message = ExceptionEnum.SUCCESS.getMessage();
+    }
+
+    public ResultVo(T data) {
+        this.code = ExceptionEnum.SUCCESS.getCode();
+        this.message = ExceptionEnum.SUCCESS.getMessage();
+        this.data = data;
+    }
+
+
+    public ResultVo(ExceptionEnum exceptionEnum) {
+        this.code = exceptionEnum.getCode();
+        this.message = exceptionEnum.getMessage();
+    }
+
+    public ResultVo(ExceptionEnum exceptionEnum, String message) {
+        this.code = exceptionEnum.getCode();
+        this.message = message;
+    }
+
+    public ResultVo(ExceptionEnum exceptionEnum, T data) {
+        this.code = exceptionEnum.getCode();
+        this.message = exceptionEnum.getMessage();
+        this.data = data;
+    }
+
+    public ResultVo(ExceptionEnum exceptionEnum, String message, T data) {
+        this.code = exceptionEnum.getCode();
+        this.message = message;
+        this.data = data;
+    }
+}

+ 126 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/pojo/Setlmt.java

@@ -0,0 +1,126 @@
+package thyyxxk.simzfeeoprnsystm.pojo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @description: 门诊结算入参
+ * @author: DingJie
+ * @create: 2021/7/2010:55
+ */
+@Data
+public class Setlmt {
+    /**
+     * 人员编号
+     * */
+    @JSONField(name = "psn_no")
+    private String psnNo;
+
+    /**
+     * 参保地医保区划
+     * */
+    @JSONField(name = "insuplc_admdvs")
+    private String insuplcAdmdvs;
+
+    /**
+     * 就诊凭证类型
+     * */
+    @JSONField(name = "mdtrt_cert_type")
+    private String mdtrtCertType;
+
+    /**
+     * 就诊凭证编号(就诊凭证类型为“01”时填写电子凭证令牌,为“02”时填写身份证号,为“03”时填写社会保障卡卡号)
+     * */
+    @JSONField(name = "mdtrt_cert_no")
+    private String mdtrtCertNo;
+
+    /**
+     * 卡识别码(就诊凭证类型为“03”时必填)
+     * */
+    @JSONField(name = "card_sn")
+    private String cardSn;
+
+    /**
+     * 证件类型
+     * */
+    @JSONField(name = "psn_cert_type")
+    private String psnCertType;
+
+    /**
+     * 证件号码
+     * */
+    private String certno;
+
+    /**
+     * 医疗类别
+     * */
+    @JSONField(name = "med_type")
+    private String medType;
+
+    /**
+     * 医疗费总额
+     * */
+    @JSONField(name = "medfee_sumamt")
+    private BigDecimal medfeeSumamt;
+
+    /**
+     * 个人结算方式
+     * */
+    @JSONField(name = "psn_setlway")
+    private String psnSetlway;
+
+    /**
+     * 就诊ID
+     * */
+    @JSONField(name = "mdtrt_id")
+    private String mdtrtId;
+
+    /**
+     * 收费批次号
+     * */
+    @JSONField(name = "chrg_bchno")
+    private String chrgBchno;
+
+    /**
+     * 险种类型
+     * */
+    private String insutype;
+
+    /**
+     * 个人账户使用标志
+     * */
+    @JSONField(name = "acct_used_flag")
+    private String acctUsedFlag;
+
+    /**
+     * 发票号
+     * */
+    private String invono;
+
+    /**
+     * 全自费金额
+     * */
+    @JSONField(name = "fulamt_ownpay_amt")
+    private BigDecimal fulamtOwnpayAmt;
+
+    /**
+     * 超限价金额
+     * */
+    @JSONField(name = "overlmt_selfpay")
+    private BigDecimal overlmtSelfpay;
+
+    /**
+     * 先行自付金额
+     * */
+    @JSONField(name = "preselfpay_amt")
+    private BigDecimal preselfpayAmt;
+
+    /**
+     * 符合政策范围金额
+     * */
+    @JSONField(name = "inscp_scp_amt")
+    private BigDecimal inscpScpAmt;
+
+}

+ 167 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/pojo/SiPatInfo.java

@@ -0,0 +1,167 @@
+package thyyxxk.simzfeeoprnsystm.pojo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class SiPatInfo implements Serializable {
+
+	private static final long serialVersionUID =  6489789106587927689L;
+
+	/**
+	 * 住院号/门诊号
+	 */
+	private String patNo;
+
+	/**
+	 * 住院次数/门诊次数
+	 */
+	private Integer times;
+
+	/**
+	 * 账页号(门诊为receiptNo)
+	 */
+	private Integer ledgerSn;
+
+	/**
+	 * 人员编号
+	 */
+	private String psnNo;
+
+	/**
+	 * 人员证件类型
+	 */
+	private String psnCertType;
+
+	/**
+	 * 证件号码
+	 */
+	private String certno;
+
+	/**
+	 * 人员姓名
+	 */
+	private String psnName;
+
+	/**
+	 * 性别
+	 */
+	private String gend;
+
+	/**
+	 * 民族
+	 */
+	private String naty;
+
+	/**
+	 * 出生日期
+	 */
+	private Date brdy;
+
+	/**
+	 * 年龄
+	 */
+	private Double age;
+
+	/**
+	 * 险种类型
+	 */
+	private String insutype;
+
+	/**
+	 * 医疗类别
+	 */
+	private String medType;
+
+	/**
+	 * 参保地医保区划,可通过【1101】人员信息获取交易取得
+	 */
+	private String insuplcAdmdvs;
+
+	/**
+	 * 人员类别
+	 */
+	private String psnType;
+
+	/**
+	 * 人员参保状态
+	 */
+	private String psnInsuStas;
+
+	/**
+	 * 个人参保日期
+	 */
+	private Date psnInsuDate;
+
+	/**
+	 * 暂停参保日期
+	 */
+	private Integer pausInsuDate;
+
+	/**
+	 * 公务员标志
+	 */
+	private String cvlservFlag;
+
+	/**
+	 * 单位名称
+	 */
+	private String empName;
+
+	/**
+	 * 人员身份类别
+	 */
+	private String psnIdetType;
+
+	/**
+	 * 人员类别等级
+	 */
+	private String psnTypeLv;
+
+	/**
+	 * 就诊ID
+	 */
+	private String mdtrtId;
+
+	/**
+	 * 结算ID
+	 */
+	private String setlId;
+
+	/**
+	 * 医药机构结算ID,存放发送方报文ID
+	 */
+	private String medinsSetlId;
+
+	/**
+	 * 全自费金额
+	 */
+	private Double fulamtOwnpayAmt;
+
+	/**
+	 * 超限价金额
+	 */
+	private Double overlmtAmt;
+
+	/**
+	 * 先行自付金额
+	 */
+	private Double preselfpayAmt;
+
+	/**
+	 * 符合政策范围金额
+	 */
+	private Double inscpScpAmt;
+
+	/**
+	 * 记录生成时间
+	 */
+	private Date createDatetime;
+
+	/**
+	 * 患者入院时间/门诊挂号时间
+	 */
+	private Date visitDatetime;
+}

+ 59 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/pojo/SiSetldetail.java

@@ -0,0 +1,59 @@
+package thyyxxk.simzfeeoprnsystm.pojo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@TableName(value = "t_si_setldetail")
+public class SiSetldetail implements Serializable {
+
+	private static final long serialVersionUID =  1691016964788042310L;
+
+	/**
+	 * 住院号/门诊号
+	 */
+	private String patNo;
+
+	/**
+	 * 住院次数/门诊次数
+	 */
+	private Integer times;
+
+	/**
+	 * 账页号(门诊为receiptNo)
+	 */
+	private Integer ledgerSn;
+
+	/**
+	 * 基金支付类型
+	 */
+	private String fundPayType;
+
+	/**
+	 * 符合政策范围金额
+	 */
+	private Double inscpScpAmt;
+
+	/**
+	 * 本次可支付限额金额
+	 */
+	private Double crtPaybLmtAmt;
+
+	/**
+	 * 基金支付金额
+	 */
+	private Double fundPayamt;
+
+	/**
+	 * 基金支付类型名称
+	 */
+	private String fundPayTypeName;
+
+	/**
+	 * 结算过程信息
+	 */
+	private String setlProcInfo;
+
+}

+ 265 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/pojo/SiSetlinfo.java

@@ -0,0 +1,265 @@
+package thyyxxk.simzfeeoprnsystm.pojo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName(value = "t_si_setlinfo")
+public class SiSetlinfo implements Serializable {
+
+	private static final long serialVersionUID =  6876991080910479303L;
+
+	/**
+	 * 住院号/门诊号
+	 */
+	private String patNo;
+
+	/**
+	 * 住院次数/门诊次数
+	 */
+	private Integer times;
+
+	/**
+	 * 账页号(门诊为receiptNo)
+	 */
+	private Integer ledgerSn;
+
+	/**
+	 * 就诊ID
+	 */
+	private String mdtrtId;
+
+	/**
+	 * 结算ID
+	 */
+	private String setlId;
+
+	/**
+	 * 人员编号
+	 */
+	private String psnNo;
+
+	/**
+	 * 人员姓名
+	 */
+	private String psnName;
+
+	/**
+	 * 人员证件类型
+	 */
+	private String psnCertType;
+
+	/**
+	 * 证件号码
+	 */
+	private String certno;
+
+	/**
+	 * 性别
+	 */
+	private String gend;
+
+	/**
+	 * 民族
+	 */
+	private String naty;
+
+	/**
+	 * 出生日期
+	 */
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	private Date brdy;
+
+	/**
+	 * 年龄
+	 */
+	private Double age;
+
+	/**
+	 * 险种类型
+	 */
+	private String insutype;
+
+	/**
+	 * 人员类别
+	 */
+	private String psnType;
+
+	/**
+	 * 公务员标志
+	 */
+	private String cvlservFlag;
+
+	/**
+	 * 结算时间
+	 */
+	private Date setlTime;
+
+	/**
+	 * 就诊凭证类型
+	 */
+	private String mdtrtCertType;
+
+	/**
+	 * 医疗类别
+	 */
+	private String medType;
+
+	/**
+	 * 医疗费总额
+	 */
+	private Double medfeeSumamt;
+
+	/**
+	 * 全自费金额
+	 */
+	private Double fulamtOwnpayAmt;
+
+	/**
+	 * 超限价自费费用
+	 */
+	private Double overlmtSelfpay;
+
+	/**
+	 * 先行自付金额
+	 */
+	private Double preselfpayAmt;
+
+	/**
+	 * 符合政策范围金额
+	 */
+	private Double inscpScpAmt;
+
+	/**
+	 * 实际支付起付线
+	 */
+	private Double actPayDedc;
+
+	/**
+	 * 基本医疗保险统筹基金支出
+	 */
+	private Double hifpPay;
+
+	/**
+	 * 基本医疗保险统筹基金支付比例
+	 */
+	private Double poolPropSelfpay;
+
+	/**
+	 * 公务员医疗补助资金支出
+	 */
+	private Double cvlservPay;
+
+	/**
+	 * 企业补充医疗保险基金支出
+	 */
+	private Double hifesPay;
+
+	/**
+	 * 居民大病保险资金支出
+	 */
+	private Double hifmiPay;
+
+	/**
+	 * 职工大额医疗费用补助基金支出
+	 */
+	private Double hifobPay;
+
+	/**
+	 * 医疗救助基金支出
+	 */
+	private Double mafPay;
+
+	/**
+	 * 医院负担金额
+	 */
+	private Double hospPartAmt;
+
+	/**
+	 * 其他支出
+	 */
+	private Double othPay;
+
+	/**
+	 * 基金支付总额
+	 */
+	private Double fundPaySumamt;
+
+	/**
+	 * 个人负担总金额
+	 */
+	private Double psnPartAmt;
+
+	/**
+	 * 个人账户支出
+	 */
+	private Double acctPay;
+
+	/**
+	 * 个人现金支出
+	 */
+	private Double psnCashPay;
+
+	/**
+	 * 余额
+	 */
+	private Double balc;
+
+	/**
+	 * 个人账户共济支付金额
+	 */
+	private Double acctMulaidPay;
+
+	/**
+	 * 医药机构结算ID
+	 */
+	private String medinsSetlId;
+
+	/**
+	 * 清算经办机构
+	 */
+	private String clrOptins;
+
+	/**
+	 * 清算方式
+	 */
+	private String clrWay;
+
+	/**
+	 * 清算类别
+	 */
+	private String clrType;
+
+	/**
+	 * 结算操作员
+	 * */
+	private String staffId;
+
+	/**
+	 * 是否已撤销
+	 * */
+	private Integer revoked;
+
+	/**
+	 * 结算类别:21-住院,11-门诊
+	 * */
+	private String setlType;
+
+	@TableField(exist = false)
+	private String gendName;
+	@TableField(exist = false)
+	private String insutypeName;
+	@TableField(exist = false)
+	private String psnTypeName;
+	@TableField(exist = false)
+	private String medTypeName;
+	@TableField(exist = false)
+	private String clrOptinsName;
+}

+ 33 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/pojo/SpcChrDiseAcct.java

@@ -0,0 +1,33 @@
+package thyyxxk.simzfeeoprnsystm.pojo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * @description: 慢特病备案内容
+ * @author: DingJie
+ * @create: 2021/7/2217:50
+ */
+@Data
+public class SpcChrDiseAcct {
+    private String patNo;
+
+    private Integer times;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date begndate;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date enddate;
+
+    private String opspDiseName;
+
+    private String opspDiseCode;
+
+    private String staffId;
+}

+ 127 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/service/ExecService.java

@@ -0,0 +1,127 @@
+package thyyxxk.simzfeeoprnsystm.service;
+
+import com.alibaba.fastjson.JSONObject;
+import thyyxxk.simzfeeoprnsystm.dao.StaffDao;
+import thyyxxk.simzfeeoprnsystm.dicts.SiFunction;
+import thyyxxk.simzfeeoprnsystm.utils.DateUtil;
+import thyyxxk.simzfeeoprnsystm.utils.SiUtil;
+import thyyxxk.simzfeeoprnsystm.utils.StringUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+/**
+ * @description: 签到签退
+ * @author: DingJie
+ * @create: 2021-05-28 15:57:26
+ **/
+@Slf4j
+@Service
+public class ExecService {
+    @Value("${si-api-url}")
+    private String siApiUrl;
+    private static final String RESULT_CODE = "infcode";
+    private static final String OUTPUT = "output";
+    private static final String MAC_ADDR = "FE-FC-FE-35-35-DE";
+    private static final String IP_ADDR = "218.104.151.243";
+    private final StaffDao dao;
+    private volatile String signNo;
+
+    @Autowired
+    public ExecService(StaffDao dao) {
+        this.dao = dao;
+    }
+
+    private synchronized String getSignNo() {
+        if (StringUtil.isBlank(signNo)) {
+            signIn();
+        }
+        return signNo;
+    }
+
+    public synchronized void signIn() {
+        JSONObject input = makeSignHeader(SiFunction.SIGN_IN);
+        JSONObject signIn = new JSONObject();
+        signIn.put("opter_no", "99999");
+        signIn.put("mac", MAC_ADDR);
+        signIn.put("ip", IP_ADDR);
+        input.getJSONObject("input").put("signIn", signIn);
+        JSONObject result = executeTrade(input, SiFunction.SIGN_IN);
+        log.info("医保签到:\n参数:{},\n结果:{}", input, result);
+        if (null != result && result.getIntValue(RESULT_CODE) == 0) {
+            try {
+                JSONObject output = result.getJSONObject(OUTPUT);
+                signNo = output.getJSONObject("signinoutb").getString("sign_no");
+                log.info("签到成功,签到号:{}", signNo);
+            } catch (Exception e) {
+                log.error("签到出错", e);
+            }
+        }
+    }
+
+    public void signOut() {
+        if (StringUtil.notBlank(signNo)) {
+            JSONObject input = makeSignHeader(SiFunction.SIGN_OUT);
+            JSONObject signOut = new JSONObject();
+            signOut.put("sign_no", signNo);
+            signOut.put("opter_no", "99999");
+            input.getJSONObject("input").put("signOut", signOut);
+            JSONObject result = executeTrade(input, SiFunction.SIGN_OUT);
+            log.info("医保签退:\n参数:{},\n结果:{}", input, result);
+            if (null != result && result.getIntValue(RESULT_CODE) == 0) {
+                signNo = null;
+            }
+        }
+    }
+
+    private JSONObject makeSignHeader(SiFunction function) {
+        JSONObject header = makePublicHeader("");
+        header.put("infno", function.getCode());
+        header.put("opter", "99999");
+        header.put("opter_name", "全院");
+        return header;
+    }
+
+    public JSONObject makeTradeHeaderWithInsureArea(SiFunction function, String insureArea, String staffId) {
+        String staffName = dao.selectStaffName(staffId);
+        JSONObject header = makePublicHeader(insureArea);
+        header.put("infno", function.getCode());
+        header.put("opter", staffId);
+        header.put("opter_name", staffName);
+        header.replace("sign_no", getSignNo());
+        return header;
+    }
+
+    public JSONObject makePublicHeader(String insureArea) {
+        if (null == insureArea) {
+            insureArea = "";
+        }
+        JSONObject header = new JSONObject();
+        JSONObject input = new JSONObject();
+        header.put("msgid", SiUtil.makeMsgId());
+        header.put("mdtrtarea_admvs", SiUtil.getInstitutionArea(insureArea));
+        header.put("insuplc_admdvs", insureArea);
+        header.put("recer_sys_code", SiUtil.INSTITUTION_AREA);
+        header.put("dev_no", "");
+        header.put("dev_safe_info", "");
+        header.put("cainfo", "");
+        header.put("signtype", "");
+        header.put("infver", SiUtil.API_VERSION);
+        header.put("opter_type", "1");
+        header.put("inf_time", DateUtil.now());
+        header.put("fixmedins_code", SiUtil.INSTITUTION_ID);
+        header.put("fixmedins_name", SiUtil.INSTITUTION_NAME);
+        header.put("sign_no", "");
+        header.put("input", input);
+        return header;
+    }
+
+    public JSONObject executeTrade(JSONObject input, SiFunction function) {
+        RestTemplate template = new RestTemplate();
+        return template.postForObject(siApiUrl,
+                new HttpEntity<>(input, SiUtil.getHttpHeaders(function)), JSONObject.class);
+    }
+}

+ 394 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/service/SiMzFeeService.java

@@ -0,0 +1,394 @@
+package thyyxxk.simzfeeoprnsystm.service;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import thyyxxk.simzfeeoprnsystm.dao.SiMzDao;
+import thyyxxk.simzfeeoprnsystm.dao.SiSetldetailDao;
+import thyyxxk.simzfeeoprnsystm.dao.SiSetlinfoDao;
+import thyyxxk.simzfeeoprnsystm.dicts.*;
+import thyyxxk.simzfeeoprnsystm.pojo.*;
+import thyyxxk.simzfeeoprnsystm.pojo.ResultVo;
+import thyyxxk.simzfeeoprnsystm.pojo.SiPatInfo;
+import thyyxxk.simzfeeoprnsystm.utils.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.List;
+
+@Slf4j
+@Service
+public class SiMzFeeService {
+    private final SiMzDao mzDao;
+    private final SiSetlinfoDao setlinfoDao;
+    private final SiSetldetailDao setldetailDao;
+    private final ExecService exec;
+    private static final String RESULT_CODE = "infcode";
+    private static final String ERROR_MESSAGE = "err_msg";
+    private static final String OUTPUT = "output";
+
+    @Autowired
+    public SiMzFeeService(SiMzDao mzDao, SiSetlinfoDao setlinfoDao, SiSetldetailDao setldetailDao, ExecService exec) {
+        this.mzDao = mzDao;
+        this.setlinfoDao = setlinfoDao;
+        this.setldetailDao = setldetailDao;
+        this.exec = exec;
+    }
+
+    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患者信息为空,请联系医生重开处方。");
+        }
+        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");
+        input.getJSONObject("input").put("data", JSONObject.parseObject(ref));
+        JSONObject result = exec.executeTrade(input, SiFunction.OUTPATIENT_REGISTRATION);
+        log.info("【操作员:{}】,门诊挂号:\n参数:{},\n结果:{}", p.getStaffId(), input, result);
+        if (null == result) {
+            return ResultVoUtil.fail(ExceptionEnum.NETWORK_ERROR);
+        }
+        if (null == result.getInteger(RESULT_CODE)) {
+            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "医保中心报错:" + result.getString("message"));
+        }
+        if (result.getIntValue(RESULT_CODE) == 0) {
+            JSONObject output = result.getJSONObject(OUTPUT).getJSONObject("data");
+            p.setMdtrtId(output.getString("mdtrt_id"));
+            p.setVisitDate(regstrtn.getBegntime());
+            mzDao.afterRegistrtn(p);
+            return ResultVoUtil.success("挂号成功。");
+        }
+        return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, result.getString(ERROR_MESSAGE));
+    }
+
+    public ResultVo<String> revokeOutpatientRegistration(MzPatientInfo p) {
+        if (null == p.getTimes()) {
+            p.setTimes(mzDao.selectMaxTimes(p.getPatNo()));
+        }
+        SiPatInfo siPatInfo = mzDao.selectSiPatInfoForMz(p.getPatNo(), p.getTimes());
+        if (null == siPatInfo || StringUtil.isBlank(siPatInfo.getMdtrtId())) {
+            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "此患者没有有效的医保挂号信息。");
+        }
+        JSONObject input = exec.makeTradeHeaderWithInsureArea(SiFunction.REVOKE_OUTPATIENT_REGISTRATION,
+                siPatInfo.getInsuplcAdmdvs(), p.getStaffId());
+        JSONObject data = new JSONObject();
+        data.put("psn_no", siPatInfo.getPsnNo());
+        data.put("mdtrt_id", siPatInfo.getMdtrtId());
+        data.put("ipt_otp_no", p.getPatNo());
+        input.getJSONObject("input").put("data", data);
+        JSONObject result = exec.executeTrade(input, SiFunction.REVOKE_OUTPATIENT_REGISTRATION);
+        log.info("【操作员:{}】,取消门诊挂号:\n参数:{},\n结果:{}", p.getStaffId(), input, result);
+        if (null == result) {
+            return ResultVoUtil.fail(ExceptionEnum.NETWORK_ERROR);
+        }
+        if (null == result.getInteger(RESULT_CODE)) {
+            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "医保中心报错:" + result.getString("message"));
+        }
+        if (result.getIntValue(RESULT_CODE) == 0) {
+            mzDao.clearMdtrtIdForMz(p.getPatNo(), p.getTimes(), null);
+            return ResultVoUtil.success("取消门诊挂号成功。");
+        }
+        return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, result.getString(ERROR_MESSAGE));
+    }
+
+    private ResultVo<String> uploadOutpatientInfo(SpcChrDiseAcct p, SiPatInfo siPatInfo, String staffId) {
+        JSONObject input = exec.makeTradeHeaderWithInsureArea(SiFunction.UPLOAD_OUTPATIENT_INFO,
+                siPatInfo.getInsuplcAdmdvs(), staffId);
+        JSONObject mdtrtinfo = new JSONObject();
+        List<Diseinfo> diseinfo;
+        if (StringUtil.notBlank(p.getOpspDiseCode())) {
+            diseinfo = new ArrayList<>();
+            Diseinfo diag = mzDao.selectDiseinfo(p.getPatNo(), p.getTimes());
+            diag.setDiagCode(p.getOpspDiseCode());
+            diag.setDiagName(p.getOpspDiseName());
+            diseinfo.add(diag);
+            mzDao.updatePatDiseinfo(siPatInfo.getPatNo(), siPatInfo.getTimes(), diag.getDiagCode(), diag.getDiagName());
+        } else {
+            diseinfo = mzDao.selectMzDiags(p.getPatNo(), p.getTimes());
+            if (null == diseinfo || diseinfo.isEmpty()) {
+                return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "患者的门诊诊断为空,请联系医生填写,或者自行补录。");
+            }
+        }
+        mdtrtinfo.put("mdtrt_id", siPatInfo.getMdtrtId());
+        mdtrtinfo.put("psn_no", siPatInfo.getPsnNo());
+        mdtrtinfo.put("med_type", siPatInfo.getMedType());
+        mdtrtinfo.put("begntime", DateUtil.formatDatetime(siPatInfo.getVisitDatetime()));
+        mdtrtinfo.put("main_cond_dscr", p.getOpspDiseName());
+        mdtrtinfo.put("dise_codg", p.getOpspDiseCode());
+        mdtrtinfo.put("dise_name", p.getOpspDiseName());
+        mdtrtinfo.put("birctrl_type", "");
+        mdtrtinfo.put("birctrl_matn_date", "");
+
+        String ref = JSONObject.toJSONString(diseinfo);
+        input.getJSONObject("input").put("mdtrtinfo", mdtrtinfo);
+        input.getJSONObject("input").put("diseinfo", JSONArray.parse(ref));
+        JSONObject result = exec.executeTrade(input, SiFunction.UPLOAD_OUTPATIENT_INFO);
+        log.info("【操作员:{}】门诊就诊信息上传:\n参数:{},\n结果:{}", staffId, input, result);
+        return SiUtil.makeReturnWithoutOutput(result, "门诊就诊信息上传成功。");
+    }
+
+    public ResultVo<SiPatInfo> uploadOutpatientFeeDetails(SpcChrDiseAcct p) {
+        String patNo = p.getPatNo();
+        if (null == p.getTimes()) {
+            p.setTimes(mzDao.selectMaxTimes(patNo));
+        }
+        SiPatInfo siPatInfo = mzDao.selectSiPatInfoForMz(patNo, p.getTimes());
+        if (null == siPatInfo || StringUtil.isBlank(siPatInfo.getMdtrtId())) {
+            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "【门诊号:" + patNo +
+                    "】未找到此患者的医保挂号信息,请核实。");
+        }
+        ResultVo<String> uplRes = uploadOutpatientInfo(p, siPatInfo, p.getStaffId());
+        if (null != uplRes && uplRes.getCode() != ExceptionEnum.SUCCESS.getCode()) {
+            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, uplRes.getMessage());
+        }
+        List<FeeDetail> feeDetails = mzDao.selectOutpatientFees(patNo, p.getTimes());
+        if (null == feeDetails || feeDetails.isEmpty()) {
+            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "此患者没有需要上传的费用。");
+        }
+        String batchNo = patNo + "_" + p.getTimes();
+        feeDetails.forEach(item -> {
+            item.setMdtrtId(siPatInfo.getMdtrtId());
+            item.setPsnNo(siPatInfo.getPsnNo());
+            item.setChrgBchno(batchNo);
+            item.setRxCircFlag(YesOrNo.NO.getCodeStr());
+            item.setHospApprFlag(YesOrNo.YES.getCodeStr());
+            if (siPatInfo.getMedType().equals("51")) {
+                item.setMatnFeeFlag("1");
+            }
+        });
+        JSONObject input = exec.makeTradeHeaderWithInsureArea(SiFunction.UPLOAD_OUTPATIENT_FEE_DETAILS,
+                siPatInfo.getInsuplcAdmdvs(), p.getStaffId());
+        String ref = JSONArray.toJSONString(feeDetails);
+        JSONArray feedetail = JSONArray.parseArray(ref);
+        input.getJSONObject("input").put("feedetail", feedetail);
+        JSONObject result = exec.executeTrade(input, SiFunction.UPLOAD_OUTPATIENT_FEE_DETAILS);
+        log.info("【操作员:{}】门诊费用明细信息上传:\n参数:{},\n结果:{}", p.getStaffId(), input, result);
+        if (null == result) {
+            return ResultVoUtil.fail(ExceptionEnum.NETWORK_ERROR);
+        }
+        if (null == result.getInteger(RESULT_CODE)) {
+            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "医保中心报错:" + result.getString("message"));
+        }
+        if (result.getIntValue(RESULT_CODE) == 0) {
+            JSONArray feeRes = result.getJSONObject(OUTPUT).getJSONArray("result");
+            double fulamtOwnpayAmt = 0d;
+            double overlmtAmt = 0d;
+            double preselfpayAmt = 0d;
+            double inscpScpAmt = 0d;
+            for (int i = 0; i < feeRes.size(); i++) {
+                JSONObject fee = feeRes.getJSONObject(i);
+                fulamtOwnpayAmt += fee.getDoubleValue("fulamt_ownpay_amt");
+                overlmtAmt += fee.getDoubleValue("overlmt_amt");
+                preselfpayAmt += fee.getDoubleValue("preselfpay_amt");
+                inscpScpAmt += fee.getDoubleValue("inscp_scp_amt");
+
+                String detlSn = fee.getString("feedetl_sn");
+                String chrgLv = fee.getString("chrgitm_lv");
+                String chrgType = fee.getString("med_chrgitm_type");
+                String[] sns = detlSn.split("_");
+                int times = Integer.parseInt(sns[1]);
+                int recNo = Integer.parseInt(sns[2]);
+                int odrNo = Integer.parseInt(sns[3]);
+                int itmNo = Integer.parseInt(sns[4]);
+                mzDao.afterUploadFees(patNo, times, recNo, odrNo, itmNo, chrgLv, chrgType);
+            }
+            siPatInfo.setFulamtOwnpayAmt(fulamtOwnpayAmt);
+            siPatInfo.setOverlmtAmt(overlmtAmt);
+            siPatInfo.setPreselfpayAmt(preselfpayAmt);
+            siPatInfo.setInscpScpAmt(inscpScpAmt);
+            mzDao.updateSortOfAmt(siPatInfo);
+            return ResultVoUtil.success(siPatInfo);
+        }
+        return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, result.getString(ERROR_MESSAGE));
+    }
+
+    public ResultVo<String> revokeOutpatientFeeDetails(MzPatientInfo p) {
+        if (null == p.getTimes()) {
+            p.setTimes(mzDao.selectMaxTimes(p.getPatNo()));
+        }
+        SiPatInfo siPatInfo = mzDao.selectSiPatInfoForMz(p.getPatNo(), p.getTimes());
+        log.info("patNo: {}, times: {}, sipatinfo: {}", p.getPatNo(), p.getTimes(), siPatInfo);
+        if (null == siPatInfo || StringUtil.isBlank(siPatInfo.getMdtrtId())) {
+            return ResultVoUtil.fail(ExceptionEnum.NULL_POINTER, "没有此患者的医保挂号信息!");
+        }
+        JSONObject input = exec.makeTradeHeaderWithInsureArea(SiFunction.REVOKE_OUTPATIENT_FEE_DETAILS,
+                siPatInfo.getInsuplcAdmdvs(), p.getStaffId());
+        JSONObject data = new JSONObject();
+        data.put("mdtrt_id", siPatInfo.getMdtrtId());
+        data.put("psn_no", siPatInfo.getPsnNo());
+        data.put("chrg_bchno", "0000");
+        input.getJSONObject("input").put("data", data);
+        JSONObject result = exec.executeTrade(input, SiFunction.REVOKE_OUTPATIENT_FEE_DETAILS);
+        log.info("【操作员:{}】门诊费用明细信息撤销,参数:{},结果:{}", p.getStaffId(), input, result);
+        if (null == result) {
+            return ResultVoUtil.fail(ExceptionEnum.NETWORK_ERROR);
+        }
+        if (null == result.getInteger(RESULT_CODE)) {
+            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "医保中心报错:" + result.getString("message"));
+        }
+        if (result.getIntValue(RESULT_CODE) == 0) {
+            mzDao.afterRevokeFees(p.getPatNo(), p.getTimes());
+            return ResultVoUtil.success("门诊费用明细信息撤销成功。");
+        }
+        return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, result.getString(ERROR_MESSAGE));
+    }
+
+    public ResultVo<FundDetail> outpatientPreSettlement(MzPatientInfo p) {
+        if (null == p.getTimes()) {
+            p.setTimes(mzDao.selectMaxTimes(p.getPatNo()));
+        }
+        ResultVo<FundDetail> fundDetail1 = getFundDetailResultVo(p);
+        if (fundDetail1 != null) return fundDetail1;
+        MzPreSetlmt mzPreSetlmt = mzDao.selectPreSetlmt(p.getPatNo(), p.getTimes());
+        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());
+        String ref = JSONObject.toJSONString(mzPreSetlmt);
+        input.getJSONObject("input").put("data", JSONObject.parseObject(ref));
+        JSONObject result = exec.executeTrade(input, SiFunction.OUTPATIENT_PRE_SETTLEMENT);
+        log.info("【操作员:{}】门诊预结算:\n参数:{},\n结果:{}", p.getStaffId(), input, result);
+        if (null == result) {
+            return ResultVoUtil.fail(ExceptionEnum.NETWORK_ERROR);
+        }
+        if (null == result.getInteger(RESULT_CODE)) {
+            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "医保中心报错:" + result.getString("message"));
+        }
+        if (result.getIntValue(RESULT_CODE) == 0) {
+            int mtPartCount = mzDao.selectMtPartCount(p.getPatNo(), p.getTimes());
+            if (mtPartCount == 0) {
+                MtPartInfo mtinfo = new MtPartInfo();
+                mtinfo.setPatientId(p.getPatNo());
+                mtinfo.setTimes(p.getTimes());
+                mtinfo.setHicNo(mzPreSetlmt.getPsnNo());
+                mtinfo.setBizType(mzPreSetlmt.getMedType());
+                mtinfo.setIcdCode("");
+                mtinfo.setIcdName("");
+                mtinfo.setMzSerialNo(mzPreSetlmt.getMdtrtId());
+                mzDao.insertMtPartInfo(mtinfo);
+            }
+            JSONObject setlinfo = result.getJSONObject(OUTPUT).getJSONObject("setlinfo");
+            FundDetail fundDetail = new FundDetail();
+            fundDetail.setTotalCost(setlinfo.getString("medfee_sumamt"));
+            fundDetail.setFundPay(setlinfo.getString("fund_pay_sumamt"));
+            fundDetail.setCashPay(setlinfo.getString("psn_cash_pay"));
+            fundDetail.setAcctPay(setlinfo.getString("acct_pay"));
+            fundDetail.setSelfPay(setlinfo.getString("psn_part_amt"));
+            return ResultVoUtil.success(fundDetail);
+        }
+        return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, result.getString(ERROR_MESSAGE));
+    }
+
+    private ResultVo<FundDetail> getFundDetailResultVo(MzPatientInfo p) {
+        SiSetlinfo sisetl = mzDao.selectSettledInfo(p.getPatNo(), p.getTimes());
+        if (null != sisetl && null != sisetl.getSetlId()) {
+            return getFundDetailResultVo(sisetl);
+        }
+        return null;
+    }
+
+    private ResultVo<FundDetail> getFundDetailResultVo(SiSetlinfo sisetl) {
+        FundDetail fundDetail = new FundDetail();
+        fundDetail.setTotalCost(String.valueOf(sisetl.getMedfeeSumamt()));
+        fundDetail.setFundPay(String.valueOf(sisetl.getFundPaySumamt()));
+        fundDetail.setCashPay(String.valueOf(sisetl.getPsnCashPay()));
+        fundDetail.setAcctPay(String.valueOf(sisetl.getAcctPay()));
+        fundDetail.setSelfPay(String.valueOf(sisetl.getPsnPartAmt()));
+        return ResultVoUtil.success(fundDetail);
+    }
+
+    public ResultVo<FundDetail> outpatientSettlement(MzPatientInfo p) {
+        ResultVo<FundDetail> fundDetail1 = getFundDetailResultVo(p);
+        if (fundDetail1 != null) return fundDetail1;
+        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());
+        setlmt.setMedfeeSumamt(setlmt.getMedfeeSumamt().setScale(2, RoundingMode.HALF_UP));
+        setlmt.setPsnSetlway(PsnSetlWay.SETTLE_BY_ITEMS.getCode());
+        setlmt.setChrgBchno(p.getPatNo() + "_" + p.getTimes());
+        setlmt.setAcctUsedFlag(YesOrNo.NO.getCodeStr());
+        setlmt.setInvono(SnowFlakeId.getInstance().nextId());
+        String ref = JSONObject.toJSONString(setlmt);
+        input.getJSONObject("input").put("data", JSONObject.parseObject(ref));
+        JSONObject result = exec.executeTrade(input, SiFunction.OUTPATIENT_SETTLEMENT);
+        log.info("【操作员:{}】门诊结算:\n参数:{},\n结果:{}", p.getStaffId(), input, result);
+        if (null == result) {
+            return ResultVoUtil.fail(ExceptionEnum.NETWORK_ERROR, "与医保中心的连接出现网络异常!");
+        }
+        if (null == result.getInteger(RESULT_CODE)) {
+            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "医保中心报错:" + result.getString("message"));
+        }
+        if (result.getIntValue(RESULT_CODE) == 0) {
+            JSONObject setlinfo = result.getJSONObject(OUTPUT).getJSONObject("setlinfo");
+            SiSetlinfo setlEntity = JSONObject.parseObject(setlinfo.toJSONString(), SiSetlinfo.class);
+            setlEntity.setPatNo(p.getPatNo());
+            setlEntity.setTimes(p.getTimes());
+            setlEntity.setLedgerSn(0);
+            setlEntity.setStaffId(p.getStaffId());
+            setlEntity.setRevoked(YesOrNo.NO.getCode());
+            setlEntity.setSetlType(ClrType.OUTPATIENT.getCode());
+            setlinfoDao.insert(setlEntity);
+            setlinfoDao.updateSiZyInfoSetlId(p.getPatNo(), p.getTimes(), 0, setlEntity.getSetlId(),
+                    setlEntity.getMedinsSetlId(), input.getString("msgid"));
+            JSONArray setldetail = result.getJSONObject(OUTPUT).getJSONArray("setldetail");
+            for (int i = 0; i < setldetail.size(); i++) {
+                SiSetldetail setldetailEntity = JSONObject.parseObject(setldetail.getJSONObject(i).toJSONString(),
+                        SiSetldetail.class);
+                setldetailEntity.setPatNo(p.getPatNo());
+                setldetailEntity.setTimes(p.getTimes());
+                setldetailEntity.setLedgerSn(0);
+                setldetailDao.insert(setldetailEntity);
+            }
+            return getFundDetailResultVo(setlEntity);
+        }
+        return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, result.getString(ERROR_MESSAGE));
+    }
+
+    public ResultVo<String> revokeOutpatientSettlement(MzPatientInfo p) {
+        if (null == p.getTimes()) {
+            p.setTimes(mzDao.selectMaxTimes(p.getPatNo()));
+        }
+        QueryWrapper<SiSetlinfo> wrapper = new QueryWrapper<>();
+        wrapper.eq("pat_no", p.getPatNo());
+        wrapper.eq("times", p.getTimes());
+        wrapper.eq("revoked", 0);
+        SiSetlinfo setlinfo = setlinfoDao.selectOne(wrapper);
+        if (null == setlinfo) {
+            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "此患者没有有效的结算信息。");
+        }
+        JSONObject input = exec.makeTradeHeaderWithInsureArea(SiFunction.REVOKE_OUTPATIENT_SETTLEMENT,
+                mzDao.selectAdmdvs(setlinfo.getPatNo(), setlinfo.getTimes(), setlinfo.getLedgerSn()), p.getStaffId());
+        JSONObject data = new JSONObject();
+        data.put("setl_id", setlinfo.getSetlId());
+        data.put("mdtrt_id", setlinfo.getMdtrtId());
+        data.put("psn_no", setlinfo.getPsnNo());
+        input.getJSONObject("input").put("data", data);
+        JSONObject result = exec.executeTrade(input, SiFunction.REVOKE_OUTPATIENT_SETTLEMENT);
+        log.info("【操作员:{}】门诊结算撤销:\n参数:{},\n结果:{}", p.getStaffId(), input, result);
+        if (null == result) {
+            return ResultVoUtil.fail(ExceptionEnum.NETWORK_ERROR);
+        }
+        if (null == result.getInteger(RESULT_CODE)) {
+            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "医保中心报错:" + result.getString("message"));
+        }
+        if (result.getIntValue(RESULT_CODE) == 0) {
+            mzDao.deleteSetlInfo(p.getPatNo(), p.getTimes());
+            mzDao.deleteSetlDetail(p.getPatNo(), p.getTimes());
+            mzDao.updateRvkSetlMsgid(p.getPatNo(), p.getTimes(), input.getString("msgid"));
+            return ResultVoUtil.success("门诊结算撤销成功。");
+        }
+        return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, result.getString(ERROR_MESSAGE));
+    }
+}

+ 111 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/utils/DateUtil.java

@@ -0,0 +1,111 @@
+package thyyxxk.simzfeeoprnsystm.utils;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * @author dj
+ */
+@Slf4j
+public class DateUtil {
+
+    public static String formatPriceTime(String priceTime) {
+        return null == priceTime ? "" : priceTime.split("\\.")[0].replace("T", " ");
+    }
+
+    public static String formatDatetime(Date date, String pattern) {
+        if (null == date) {
+            return "";
+        }
+        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
+        return sdf.format(date);
+    }
+
+    public static String formatDatetime(Date date) {
+        if (null == date) {
+            return "";
+        }
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        return sdf.format(date);
+    }
+
+    public static Date parse(String source) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        try {
+            return sdf.parse(source);
+        } catch (ParseException e) {
+            log.error("将字符串转换成日期出错", e);
+        }
+        return new Date();
+    }
+
+    public static long getTimestamp(String datetime) throws ParseException {
+        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        return df.parse(datetime).getTime();
+    }
+
+    public static String getOffsetDate(int offset) {
+        DateFormat da = new SimpleDateFormat("yyyy-MM-dd");
+        Calendar now = Calendar.getInstance();
+        now.set(Calendar.DATE, now.get(Calendar.DATE) + offset);
+        return da.format(now.getTime());
+    }
+
+    public static Date getDatetimeAfterCentury(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        calendar.set(2000, Calendar.DECEMBER, 31, calendar.get(Calendar.HOUR_OF_DAY),
+                calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND));
+        return calendar.getTime();
+    }
+
+    public static Integer calculateAge(Date birthDate) {
+        if (null == birthDate) {
+            return null;
+        }
+        int age;
+        Calendar cal = Calendar.getInstance();
+        if (cal.before(birthDate)) {
+            throw new IllegalArgumentException("出生日期晚于当前时间,无法计算!");
+        }
+        int yearNow = cal.get(Calendar.YEAR);
+        int monthNow = cal.get(Calendar.MONTH);
+        int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH);
+        cal.setTime(birthDate);
+        int yearBirth = cal.get(Calendar.YEAR);
+        int monthBirth = cal.get(Calendar.MONTH);
+        int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH);
+        age = yearNow - yearBirth;
+        if (monthNow <= monthBirth) {
+            if (monthNow == monthBirth) {
+                if (dayOfMonthNow < dayOfMonthBirth) {
+                    // 当前日期在生日之前,年龄减一
+                    age--;
+                }
+            } else {
+                // 当前月份在生日之前,年龄减一
+                age--;
+            }
+        }
+        return age;
+    }
+
+    public static final String DEFAULT_PATTERN = "yyyy-MM-dd HH:mm:ss";
+
+    public static String now() {
+        LocalDateTime time = LocalDateTime.now();
+        return time.format(DateTimeFormatter.ofPattern(DEFAULT_PATTERN));
+    }
+
+    public static String plusSeconds(int seconds) {
+        LocalDateTime time = LocalDateTime.now().plusSeconds(seconds);
+        return time.format(DateTimeFormatter.ofPattern(DEFAULT_PATTERN));
+    }
+}

+ 70 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/utils/DecimalUtil.java

@@ -0,0 +1,70 @@
+package thyyxxk.simzfeeoprnsystm.utils;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+public class DecimalUtil {
+    public static boolean betweenAutoUpload() {
+        SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
+        try {
+            String now = format.format(new Date());
+            Date nowTime = format.parse(now);
+            Date startTime = format.parse("01:55:00");
+            Date endTime = format.parse("08:00:00");
+            if (nowTime.getTime() == startTime.getTime()
+                    || nowTime.getTime() == endTime.getTime()) {
+                return true;
+            }
+            Calendar date = Calendar.getInstance();
+            date.setTime(nowTime);
+            Calendar begin = Calendar.getInstance();
+            begin.setTime(startTime);
+            Calendar end = Calendar.getInstance();
+            end.setTime(endTime);
+            return date.after(begin) && date.before(end);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    public static String mathMinus(String a, String b) {
+        BigDecimal d1 = new BigDecimal(a);
+        BigDecimal d2 = new BigDecimal(b);
+        return d1.subtract(d2).toString();
+    }
+
+    public static String mathDivide(String a, String b) {
+        BigDecimal b1 = new BigDecimal(a);
+        BigDecimal b2 = new BigDecimal(b);
+        // 保留4位小数,四舍五入
+        return b1.divide(b2, 2, RoundingMode.HALF_UP).toString();
+    }
+
+    public static int mathCompare(String a, String b) {
+        BigDecimal b1 = new BigDecimal(a);
+        BigDecimal b2 = new BigDecimal(b);
+        return b1.compareTo(b2);
+    }
+
+    public static String mathAdd(String a, String b) {
+        BigDecimal d1 = new BigDecimal(a);
+        BigDecimal d2 = new BigDecimal(b);
+        return d1.add(d2).toString();
+    }
+
+    public static int compare(String a, String b) {
+        if (StringUtil.isBlank(a)) {
+            a = "0";
+        }
+        if (StringUtil.isBlank(b)) {
+            b = "0";
+        }
+        BigDecimal d1 = new BigDecimal(a);
+        BigDecimal d2 = new BigDecimal(b);
+        return d1.compareTo(d2);
+    }
+}

+ 34 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/utils/ExceptionEnum.java

@@ -0,0 +1,34 @@
+package thyyxxk.simzfeeoprnsystm.utils;
+
+public enum ExceptionEnum {
+    SUCCESS(200, "成功。"),
+    // 以下是需要消息提示的错误
+    INTERNAL_SERVER_ERROR(1001, "服务器内部错误,请联系管理员。"),
+    NULL_POINTER(1002, "空指针异常!"),
+    NETWORK_ERROR(1003, "网络异常!"),
+    // 以下是需要弹窗提示的错误
+    LOGICAL_ERROR(2001, ""),
+    NEED_PROOFREAD(2002, ""),
+    // 上传进程占用
+    UPLOAD_OCCUPIED(10, "上传进程占用中!");
+
+    private final int code;
+    private String message;
+
+    ExceptionEnum(int code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}

+ 11 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/utils/FilterUtil.java

@@ -0,0 +1,11 @@
+package thyyxxk.simzfeeoprnsystm.utils;
+
+/**
+ * @author dj
+ */
+public class FilterUtil {
+    @SuppressWarnings("unchecked")
+    public static <T> T cast(Object x) {
+        return (T) x;
+    }
+}

+ 38 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/utils/ResultVoUtil.java

@@ -0,0 +1,38 @@
+package thyyxxk.simzfeeoprnsystm.utils;
+
+
+import thyyxxk.simzfeeoprnsystm.pojo.ResultVo;
+
+/**
+ * @author dj
+ */
+public class ResultVoUtil {
+
+    public static <T> ResultVo<T> success() {
+        return new ResultVo<>();
+    }
+
+    public static <T> ResultVo<T> success(T data) {
+        return new ResultVo<>(data);
+    }
+
+    public static <T> ResultVo<T> success(ExceptionEnum exceptionEnum, String message) {
+        return new ResultVo<>(exceptionEnum, message);
+    }
+
+    public static <T> ResultVo<T> fail(ExceptionEnum exceptionEnum) {
+        return new ResultVo<>(exceptionEnum);
+    }
+
+    public static <T> ResultVo<T> fail(ExceptionEnum exceptionEnum, String message) {
+        return new ResultVo<>(exceptionEnum, message);
+    }
+
+    public static <T> ResultVo<T> fail(ExceptionEnum exceptionEnum, T data) {
+        return new ResultVo<>(exceptionEnum, data);
+    }
+
+    public static <T> ResultVo<T> fail(ExceptionEnum exceptionEnum, String message, T data) {
+        return new ResultVo<>(exceptionEnum, message, data);
+    }
+}

+ 137 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/utils/SiUtil.java

@@ -0,0 +1,137 @@
+package thyyxxk.simzfeeoprnsystm.utils;
+
+import com.alibaba.fastjson.JSONObject;
+import thyyxxk.simzfeeoprnsystm.dicts.SiFunction;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.binary.Base64;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.http.HttpHeaders;
+import org.springframework.stereotype.Component;
+import thyyxxk.simzfeeoprnsystm.pojo.ResultVo;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.Queue;
+
+/**
+ * @description: 新医保交易工具类
+ * @author: DingJie
+ * @create: 2021-05-14 16:41:21
+ **/
+@Component
+@Slf4j
+public class SiUtil {
+    private static int serial = 1000;
+    private static final int MIN_VAL = 1000;
+    private static final int MAX_VAL = 9999;
+    private static final String REQ_HEADER_PREFIX = "";
+    public static final String INSTITUTION_AREA = "430105";
+    public static final String INSTITUTION_ID = "H43010500370";
+    public static final String INSTITUTION_NAME = "长沙泰和医院";
+    private static String apiAccessKey;
+    private static String apiSecretKey;
+
+    public static final String API_VERSION = "1.0.0";
+
+    @Autowired
+    public SiUtil(Environment environment) {
+        apiAccessKey = environment.getProperty("si-access-key");
+        apiSecretKey = environment.getProperty("si-secret-key");
+    }
+
+    public static String getInstitutionArea(String insureArea) {
+        if ("".equals(insureArea)) {
+            return INSTITUTION_AREA;
+        }
+        return insureArea.startsWith("4301") ? INSTITUTION_AREA : "439900";
+    }
+
+    private static String timestamp() {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
+        return sdf.format(new Date());
+    }
+
+    public static synchronized String makeMsgId() {
+        serial += 1;
+        if (serial > MAX_VAL) {
+            serial = MIN_VAL;
+        }
+        return INSTITUTION_ID + timestamp() + serial;
+    }
+
+    public static HttpHeaders getHttpHeaders(SiFunction function) {
+        String timestamp = String.valueOf(System.currentTimeMillis());
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("_api_access_key", apiAccessKey);
+        headers.add("_api_secreKey", apiSecretKey);
+        headers.add("_api_name", REQ_HEADER_PREFIX + function.getCode());
+        headers.add("_api_version", API_VERSION);
+        headers.add("_api_timestamp", timestamp);
+        headers.add("_api_signature", getSignature(timestamp, function.getCode()));
+        return headers;
+    }
+
+    public static String getSignature(String timestamp, String function) {
+        String source =
+                "_api_access_key=" + apiAccessKey +
+                        "&_api_name=" + REQ_HEADER_PREFIX + function +
+                        "&_api_timestamp=" + timestamp +
+                        "&_api_version=" + API_VERSION;
+        return hmacSha1(source);
+    }
+
+    private static String hmacSha1(String src) {
+        byte[] result = null;
+        try {
+            SecretKeySpec signInKey = new SecretKeySpec(apiSecretKey.getBytes(), "HmacSHA1");
+            Mac mac = Mac.getInstance("HmacSHA1");
+            mac.init(signInKey);
+            byte[] rawHmac = mac.doFinal(src.getBytes());
+            result = Base64.encodeBase64(rawHmac);
+        } catch (Exception e) {
+            log.error("HmacSHA1加密出错", e);
+        }
+        return null == result ? null : new String(result);
+    }
+
+    private static final String RESULT_CODE = "infcode";
+    private static final String ERROR_MESSAGE = "err_msg";
+
+    public static ResultVo<String> makeReturnWithoutOutput(JSONObject result, String message) {
+        if (null == result) {
+            return ResultVoUtil.fail(ExceptionEnum.NETWORK_ERROR);
+        }
+        if (result.getIntValue(RESULT_CODE) == 0) {
+            return ResultVoUtil.success(message);
+        }
+        return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, result.getString(ERROR_MESSAGE));
+    }
+
+
+    public static Queue<String> readTxtFile(String path) {
+        Queue<String> result = new LinkedList<>();
+        try {
+            File file = new File(path);
+            InputStreamReader isr = new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8);
+            BufferedReader br = new BufferedReader(isr);
+            String temp;
+            while ((temp = br.readLine()) != null) {
+                result.add(temp);
+            }
+        } catch (Exception e) {
+            log.error("读取txt文件出错", e);
+            return null;
+        }
+        return result;
+    }
+
+}

+ 97 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/utils/SnowFlakeId.java

@@ -0,0 +1,97 @@
+package thyyxxk.simzfeeoprnsystm.utils;
+
+public class SnowFlakeId {
+    //下面两个每个5位,加起来就是10位的工作机器id
+    private final long workerId;    //工作id
+    private final long datacenterId;   //数据id
+    //12位的序列号
+    private long sequence;
+
+    private static SnowFlakeId INSTANCE = null;
+
+    public static SnowFlakeId getInstance() {
+        synchronized (SnowFlakeId.class) {
+            if (null == INSTANCE) {
+                synchronized (SnowFlakeId.class) {
+                    INSTANCE = new SnowFlakeId(1, 1, 140217L);
+                }
+            }
+        }
+        return INSTANCE;
+    }
+
+    private SnowFlakeId(long workerId, long datacenterId, long sequence){
+        //最大值
+        long maxWorkerId = ~(-1L << workerIdBits);
+        if (workerId > maxWorkerId || workerId < 0) {
+            throw new IllegalArgumentException(
+                    String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
+        }
+        long maxDatacenterId = ~(-1L << datacenterIdBits);
+        if (datacenterId > maxDatacenterId || datacenterId < 0) {
+            throw new IllegalArgumentException(
+                    String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
+        }
+        this.workerId = workerId;
+        this.datacenterId = datacenterId;
+        this.sequence = sequence;
+    }
+
+    //长度为5位
+    private final long workerIdBits = 4L;
+    private final long datacenterIdBits = 5L;
+
+    //上次时间戳,初始值为负数
+    private long lastTimestamp = -1L;
+
+    //下一个ID生成算法
+    public synchronized String nextId() {
+        long timestamp = System.currentTimeMillis();
+
+        //获取当前时间戳如果小于上次时间戳,则表示时间戳获取出现异常
+        if (timestamp < lastTimestamp) {
+            System.err.printf("clock is moving backwards.  Rejecting requests until %d.", lastTimestamp);
+            throw new RuntimeException(String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds",
+                    lastTimestamp - timestamp));
+        }
+
+        //获取当前时间戳如果等于上次时间戳(同一毫秒内),则在序列号加1;否则序列号赋值为0,从0开始。
+        //序列号id长度
+        long sequenceBits = 12L;
+        if (lastTimestamp == timestamp) {
+            //序列号最大值
+            long sequenceMask = ~(-1L << sequenceBits);
+            sequence = (sequence + 1) & sequenceMask;
+            if (sequence == 0) {
+                timestamp = tilNextMillis(lastTimestamp);
+            }
+        } else {
+            sequence = 0;
+        }
+
+        //将上次时间戳值刷新
+        lastTimestamp = timestamp;
+
+        //初始时间戳
+        long twepoch = 1288834974657L;
+        //工作id需要左移的位数,12位
+        //数据id需要左移位数 12+5=17位
+        long datacenterIdShift = sequenceBits + workerIdBits;
+        //时间戳需要左移位数 12+5+5=22位
+        long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
+        long id = ((timestamp - twepoch) << timestampLeftShift) |
+                (datacenterId << datacenterIdShift) |
+                (workerId << sequenceBits) |
+                sequence;
+        return String.valueOf(id);
+    }
+
+    //获取时间戳,并与上次时间戳比较
+    private long tilNextMillis(long lastTimestamp) {
+        long timestamp = System.currentTimeMillis();
+        while (timestamp <= lastTimestamp) {
+            timestamp = System.currentTimeMillis();
+        }
+        return timestamp;
+    }
+}

+ 16 - 0
src/main/java/thyyxxk/simzfeeoprnsystm/utils/StringUtil.java

@@ -0,0 +1,16 @@
+package thyyxxk.simzfeeoprnsystm.utils;
+
+/**
+ * @author dj
+ */
+public class StringUtil {
+
+    public static boolean isBlank(String str) {
+        return null == str || "".equals(str.trim());
+    }
+
+    public static boolean notBlank(String str) {
+        return null != str && !"".equals(str.trim());
+    }
+}
+

+ 35 - 0
src/main/resources/application.yml

@@ -0,0 +1,35 @@
+server:
+  port: 1100
+  servlet:
+    encoding:
+      charset: UTF-8
+      force: true
+      enabled: true
+  tomcat:
+    uri-encoding: UTF-8
+
+spring:
+  thymeleaf:
+    cache: false
+  datasource:
+    url: jdbc:jtds:sqlserver://172.16.32.168:1433/thxyhisdb
+    hikari:
+      username: sa
+      password:
+      minimum-idle: 1
+      idle-timeout: 180000
+      maximum-pool-size: 5
+      auto-commit: true
+      pool-name: MyHikariCP
+      connection-timeout: 30000
+      connection-test-query: select 1
+  jackson:
+    time-zone: GMT+8
+    date-format: yyyy-MM-dd HH:mm:ss
+mybatis:
+  configuration:
+    map-underscore-to-camel-case: true
+
+si-api-url: http://10.136.68.158:22005/isp-api/powercsb/1101
+si-access-key: 04eMGRg7beAO6vqwrZiLacV8Uy3jNn7QGDUcBO
+si-secret-key: SK3Oip3a2R3NLz2xm58Mpmi69oFu96KrdKNRKglN

+ 133 - 0
src/main/resources/logback-spring.xml

@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+
+    <!-- 日志根目录-->
+    <springProperty scope="context" name="LOG_HOME" source="logging.path"
+                    defaultValue="D:\logs\SiFeeOprnSystm\mz"/>
+
+    <!-- 日志级别 -->
+    <springProperty scope="context" name="LOG_ROOT_LEVEL" source="logging.level.root" defaultValue="INFO"/>
+
+    <!--  标识这个"STDOUT" 将会添加到这个logger -->
+    <springProperty scope="context" name="STDOUT" source="log.stdout" defaultValue="STDOUT"/>
+
+    <!-- 日志文件名称-->
+    <property name="LOG_PREFIX" value="spring-boot-logback" />
+
+    <!-- 日志文件编码-->
+    <property name="LOG_CHARSET" value="UTF-8" />
+
+    <!-- 日志文件路径+日期-->
+    <property name="LOG_DIR" value="${LOG_HOME}/%d{yyyy-MM-dd}" />
+
+    <!--对日志进行格式化-->
+    <property name="LOG_MSG" value="- [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%level] [%logger{16}] --> %msg%n "/>
+
+    <!--文件大小,默认10MB-->
+    <property name="MAX_FILE_SIZE" value="30MB" />
+
+    <!-- 配置日志的滚动时间 ,value表示保留日志的天数,0表示永久保存 -->
+    <property name="MAX_HISTORY" value="0"/>
+
+
+    <!-- 彩色日志 -->
+    <!-- 彩色日志依赖的渲染类 -->
+    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
+    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
+    <conversionRule conversionWord="wEx"
+                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
+    <!-- 彩色日志格式 -->
+    <property name="CONSOLE_LOG_PATTERN"
+              value="-[%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){blue}] [%clr(%level)] [%clr(%logger{16}){cyan}] %clr(-->){red} %clr(%msg%n){yellow}"/>
+
+    <!--输出到控制台-->
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <!-- 输出的日志内容格式化-->
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
+        </layout>
+    </appender>
+
+    <!--输出到文件-->
+    <appender name="0" class="ch.qos.logback.core.rolling.RollingFileAppender">
+    </appender>
+
+    <!-- 定义 ALL 日志的输出方式:-->
+    <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!--日志文件路径,日志文件名称-->
+        <File>${LOG_HOME}/all_${LOG_PREFIX}.log</File>
+
+        <!-- 设置滚动策略,当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+
+            <!--日志文件路径,新的 ALL 日志文件名称,“ i ” 是个变量 -->
+            <FileNamePattern>${LOG_DIR}/all_${LOG_PREFIX}%i.log</FileNamePattern>
+
+            <!-- 配置日志的滚动时间 ,表示只保留最近 10 天的日志-->
+            <MaxHistory>${MAX_HISTORY}</MaxHistory>
+
+            <!--当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB-->
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+
+        </rollingPolicy>
+
+        <!-- 输出的日志内容格式化-->
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>${LOG_MSG}</pattern>
+        </layout>
+    </appender>
+
+    <!-- 定义 ERROR 日志的输出方式:-->
+    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 下面为配置只输出error级别的日志 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>ERROR</level>
+            <OnMismatch>DENY</OnMismatch>
+            <OnMatch>ACCEPT</OnMatch>
+        </filter>
+        <!--日志文件路径,日志文件名称-->
+        <File>${LOG_HOME}/err_${LOG_PREFIX}.log</File>
+
+        <!-- 设置滚动策略,当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+
+            <!--日志文件路径,新的 ERR 日志文件名称,“ i ” 是个变量 -->
+            <FileNamePattern>${LOG_DIR}/err_${LOG_PREFIX}%i.log</FileNamePattern>
+
+            <!-- 配置日志的滚动时间 ,表示只保留最近 10 天的日志-->
+            <MaxHistory>${MAX_HISTORY}</MaxHistory>
+
+            <!--当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB-->
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+
+        <!-- 输出的日志内容格式化-->
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <Pattern>${LOG_MSG}</Pattern>
+        </layout>
+    </appender>
+
+    <!-- additivity 设为false,则logger内容不附加至root ,配置以配置包下的所有类的日志的打印,级别是 ERROR-->
+
+    <logger name="org.springframework"     level="ERROR" />
+    <logger name="org.apache.commons"      level="ERROR" />
+<!--    <logger name="th.itcenter.apps.controller.LoggingController" level="WARN"/>-->
+
+    <!-- ${LOG_ROOT_LEVEL} 日志级别 -->
+    <root level="${LOG_ROOT_LEVEL}">
+
+        <!-- 标识这个"${STDOUT}"将会添加到这个logger -->
+        <appender-ref ref="${STDOUT}"/>
+
+        <!-- FILE_ALL 日志输出添加到 logger -->
+        <appender-ref ref="FILE_ALL"/>
+
+        <!-- FILE_ERROR 日志输出添加到 logger -->
+        <appender-ref ref="FILE_ERROR"/>
+    </root>
+
+</configuration>

+ 13 - 0
src/test/java/thyyxxk/simzfeeoprnsystm/SiMzFeeOprnSystmApplicationTests.java

@@ -0,0 +1,13 @@
+package thyyxxk.simzfeeoprnsystm;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class SiMzFeeOprnSystmApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+}