电子医保凭证支付

This commit is contained in:
萧道子 2025-06-12 11:30:33 +08:00
parent 9c09e8f004
commit 9ea1026daa
10 changed files with 188 additions and 59 deletions

View File

@ -1,22 +1,22 @@
@echo off @echo off
:: 医保程序地址 :: 医保程序地址
set CHSPATH=D:/Project/CHS set CHSPATH=D:/Project/CHS
:: jar名称 :: jar名称
set NAME=yinyitong-dll-stand set NAME=yinyitong-dll-stand
:: 端口号 :: 端口号
set PROT=5946 set PROT=5946
echo 关闭端口进程:%PROT% echo 关闭端口进程:%PROT%
for /f "tokens=1-5" %%i in ('netstat -ano^|findstr ":%PROT%"') do taskkill /pid %%m -t -f for /f "tokens=1-5" %%i in ('netstat -ano^|findstr ":%PROT%"') do taskkill /pid %%m -t -f
echo 启动:%NAME% echo 启动:%NAME%
cd %CHSPATH% cd %CHSPATH%
start javaw.exe -Dfile.encoding=UTF-8 -Djava.library.path=%CHSPATH% -Dlog.path=%~dp0 -jar %~dp0\%NAME%.jar --server.port=%PROT% start javaw.exe -Dfile.encoding=UTF-8 -Djava.library.path=%CHSPATH% -Dlog.path=%~dp0 -jar %~dp0\%NAME%.jar --server.port=%PROT%
echo 启动完成 echo 启动完成
exit exit
::pause ::pause

12
pom.xml
View File

@ -36,6 +36,12 @@
<optional>true</optional> <optional>true</optional>
</dependency> </dependency>
<!-- 数据校验-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId> <artifactId>spring-boot-starter-test</artifactId>
@ -136,12 +142,6 @@
<version>3.1.28</version> <!-- 可以根据实际情况调整版本 --> <version>3.1.28</version> <!-- 可以根据实际情况调整版本 -->
</dependency> </dependency>
<!-- 数据校验-->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<!--微信支付--> <!--微信支付-->
<dependency> <dependency>

View File

@ -5,8 +5,6 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.MissingServletRequestParameterException; import org.springframework.web.bind.MissingServletRequestParameterException;
@ -15,9 +13,6 @@ import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -44,7 +39,7 @@ public class ControllerAdvice {
.getFieldErrors() .getFieldErrors()
.parallelStream() .parallelStream()
.map(m -> /*m.getField() + ":" +*/ m.getDefaultMessage()) .map(m -> /*m.getField() + ":" +*/ m.getDefaultMessage())
.collect(Collectors.joining("")); .collect(Collectors.joining(""));
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
return Result.error(errMsg); return Result.error(errMsg);
} }

View File

@ -0,0 +1,45 @@
package com.dpkj.common.vo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* 接口返回数据格式
*/
@Data
@Accessors(chain = true)
public class ResultData implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 请求时间
*/
private String requestTime;
/**
* 请求内容
*/
private String requestContent;
/**
* 响应时间
*/
private String responseTime;
/**
* 响应内容
*/
private String responseContent;
/**
* 患者ID
*/
private String patientId;
/**
* 处理后的响应内容
*/
private Object result;
}

View File

@ -3,8 +3,10 @@ package com.dpkj.modules.chs.controller;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.dpkj.common.vo.Result; import com.dpkj.common.vo.Result;
import com.dpkj.common.vo.ResultData;
import com.dpkj.modules.chs.service.IHispayService; import com.dpkj.modules.chs.service.IHispayService;
import com.dpkj.modules.chs.vo.OutpatientBudgetModel; import com.dpkj.modules.chs.vo.OutpatientBeginModel;
import com.dpkj.modules.chs.vo.OutpatientFinalModel;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@ -78,15 +80,15 @@ public class HispayController {
* @return com.dpkj.common.vo.Result<?> * @return com.dpkj.common.vo.Result<?>
* @author 萧道子 2025/5/27 * @author 萧道子 2025/5/27
*/ */
@PostMapping("outpatientBudgetByCode") @PostMapping("chsCodeAsOutpatientBegin")
public Result<?> outpatientBudgetByCode(@RequestBody @Validated OutpatientBudgetModel data) { public Result<?> chsCodeAsOutpatientBegin(@RequestBody @Validated OutpatientBeginModel data) {
try { try {
log.info("[HispayController][outpatientBudgetByCode][门诊缴费-预算-电子医保凭证] 参数:{}", data); log.info("[HispayController][chsCodeAsOutpatientBegin][门诊缴费-预算-电子医保凭证] 参数:{}", data);
JSONObject res = iHispayService.outpatientBudgetByCode(data); ResultData res = iHispayService.chsCodeAsOutpatientBegin(data);
return Result.ok("成功", res); return Result.ok("成功", res);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
log.info("[HispayController][outpatientBudgetByCode][门诊缴费-预算-电子医保凭证] 失败:{}", e.getMessage()); log.info("[HispayController][chsCodeAsOutpatientBegin][门诊缴费-预算-电子医保凭证] 失败:{}", e.getMessage());
return Result.error(e.getMessage()); return Result.error(e.getMessage());
} }
} }
@ -99,19 +101,15 @@ public class HispayController {
* @return com.dpkj.common.vo.Result<?> * @return com.dpkj.common.vo.Result<?>
* @author 萧道子 2025/5/27 * @author 萧道子 2025/5/27
*/ */
@PostMapping("doOutpatientPayment") @PostMapping("chsCodeAsOutpatientFinal")
public Result<?> doRegistrationPayment(@RequestBody JSONObject data) { public Result<?> chsCodeAsOutpatientFinal(@RequestBody @Validated OutpatientFinalModel data) {
try { try {
String type = data.getString("type"); log.info("[HispayController][chsCodeAsOutpatientFinal][门诊缴费-结算-电子医保凭证] 参数:{}", data);
if (StrUtil.isEmpty(type)) { ResultData res = iHispayService.chsCodeAsOutpatientFinal(data);
throw new RuntimeException("参数缺失"); return Result.ok("成功", res);
}
log.info("[HispayController][doRegistrationPayment][挂号-结算] 参数:{}", data);
return Result.ok("成功", null);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
log.info("[HispayController][doRegistrationPayment][挂号-结算] 失败:{}", e.getMessage()); log.info("[HispayController][chsCodeAsOutpatientFinal][门诊缴费-结算-电子医保凭证] 失败:{}", e.getMessage());
return Result.error(e.getMessage()); return Result.error(e.getMessage());
} }
} }

View File

@ -1,7 +1,9 @@
package com.dpkj.modules.chs.service; package com.dpkj.modules.chs.service;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.dpkj.modules.chs.vo.OutpatientBudgetModel; import com.dpkj.common.vo.ResultData;
import com.dpkj.modules.chs.vo.OutpatientBeginModel;
import com.dpkj.modules.chs.vo.OutpatientFinalModel;
public interface IHispayService { public interface IHispayService {
@ -30,16 +32,16 @@ public interface IHispayService {
* @return com.dpkj.common.vo.Result<?> * @return com.dpkj.common.vo.Result<?>
* @author 萧道子 2025/5/27 * @author 萧道子 2025/5/27
*/ */
JSONObject outpatientBudgetByCode(OutpatientBudgetModel data); ResultData chsCodeAsOutpatientBegin(OutpatientBeginModel data);
/** /**
* 门诊缴费-预算 医保卡支付 * 门诊缴费-结算 电子凭证支付
* *
* @param data : * @param data :
* @return com.dpkj.common.vo.Result<?> * @return com.dpkj.common.vo.Result<?>
* @author 萧道子 2025/5/27 * @author 萧道子 2025/5/27
*/ */
JSONObject outpatientBudgetByCard(OutpatientBudgetModel data); ResultData chsCodeAsOutpatientFinal(OutpatientFinalModel data);
} }

View File

@ -1,31 +1,26 @@
package com.dpkj.modules.chs.service.impl; package com.dpkj.modules.chs.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.file.FileReader;
import cn.hutool.core.lang.Console;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.XmlUtil; import cn.hutool.core.util.XmlUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.dpkj.common.config.ChsConfig; import com.dpkj.common.config.ChsConfig;
import com.dpkj.common.config.HisConfig; import com.dpkj.common.config.HisConfig;
import com.dpkj.common.utils.IDGenerator; import com.dpkj.common.utils.IDGenerator;
import com.dpkj.modules.chs.dll.HispayDll; import com.dpkj.common.vo.ResultData;
import com.dpkj.modules.chs.service.IHispayService; import com.dpkj.modules.chs.service.IHispayService;
import com.dpkj.modules.chs.vo.OutpatientBudgetModel; import com.dpkj.modules.chs.vo.OutpatientBeginModel;
import com.dpkj.modules.chs.vo.OutpatientFinalModel;
import com.jacob.activeX.ActiveXComponent; import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread; import com.jacob.com.ComThread;
import com.jacob.com.Dispatch; import com.jacob.com.Dispatch;
import com.jacob.com.Variant; import com.jacob.com.Variant;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.w3c.dom.Document; import org.w3c.dom.Document;
import javax.annotation.PostConstruct;
import java.io.File;
import java.util.Map; import java.util.Map;
@ -250,7 +245,7 @@ public class HispayServiceImpl implements IHispayService {
// } // }
private JSONObject outpatientBudget(OutpatientBudgetModel data) { private ResultData outpatientBudget(OutpatientBeginModel data) {
// 加载资源 // 加载资源
ActiveXComponent dispatch = instanceActive(); ActiveXComponent dispatch = instanceActive();
@ -264,10 +259,13 @@ public class HispayServiceImpl implements IHispayService {
String params = processParameters(val, data.getPassword()); String params = processParameters(val, data.getPassword());
log.info("[HispayServiceImpl][outpatientBudget][门诊缴费-预算] 接口入参:{}", params); log.info("[HispayServiceImpl][outpatientBudget][门诊缴费-预算] 接口入参:{}", params);
String requestTime = DateUtil.now();
/** 2、调用COM函数 */ /** 2、调用COM函数 */
Variant resVariant = new Variant("", true); Variant resVariant = new Variant("", true);
Variant call = Dispatch.call(dispatch, "fRun", "BMZJF001", params, resVariant); Variant call = Dispatch.call(dispatch, "fRun", "BMZJF001", params, resVariant);
String responseTime = DateUtil.now();
String resStr = resVariant.getStringRef(); String resStr = resVariant.getStringRef();
log.info("[HispayServiceImpl][outpatientBudget][门诊缴费-预算] call返回值{} 结果:{}", call, resStr); log.info("[HispayServiceImpl][outpatientBudget][门诊缴费-预算] call返回值{} 结果:{}", call, resStr);
@ -275,24 +273,65 @@ public class HispayServiceImpl implements IHispayService {
releaseActive(); releaseActive();
/** 3、处理结果 */ /** 3、处理结果 */
return verifyResult(resStr); JSONObject result = verifyResult(resStr);
return new ResultData()
.setRequestTime(requestTime)
.setRequestContent(params)
.setResponseTime(responseTime)
.setPatientId(data.getPatientId())
.setResponseContent(resStr)
.setResult(result);
} }
@Override
public JSONObject outpatientBudgetByCode(OutpatientBudgetModel data) {
JSONObject userInfo = readCode();
@Override
public ResultData chsCodeAsOutpatientBegin(OutpatientBeginModel data) {
// 用户读卡-生成token
JSONObject userInfo = readCode();
String patientId = userInfo.getString("patid"); String patientId = userInfo.getString("patid");
data.setPatientId(patientId); data.setPatientId(patientId);
JSONObject result = outpatientBudget(data); return outpatientBudget(data);
return result;
} }
@Override @Override
public JSONObject outpatientBudgetByCard(OutpatientBudgetModel data) { public ResultData chsCodeAsOutpatientFinal(OutpatientFinalModel data) {
return null; // 加载资源
ActiveXComponent dispatch = instanceActive();
/** 1、组装参数 */
JSONObject val = (JSONObject) JSON.toJSON(data);
String params = processParameters(val, null);
log.info("[HispayServiceImpl][chsCodeAsOutpatientFinal][门诊缴费-结算] 接口入参:{}", params);
String requestTime = DateUtil.now();
/** 2、调用COM函数 */
Variant resVariant = new Variant("", true);
Variant call = Dispatch.call(dispatch, "fRun", "BMZJF002", params, resVariant);
String responseTime = DateUtil.now();
String resStr = resVariant.getStringRef();
log.info("[HispayServiceImpl][chsCodeAsOutpatientFinal][门诊缴费-结算] call返回值{} 结果:{}", call, resStr);
// 释放资源
releaseActive();
// TODO BEGIN 萧道子 2025/6/10 : 模拟参数
// String resStr = "<response><resultCode>0</resultCode><resultMessage/><result><sjh>123456789</sjh><sfrq>2025-06-10 10:23:14</sfrq><bz/><pyckjh/><fyckjh/><yflshjh/><ybcc/></result></response>";
// TODO END 萧道子 2025/6/10 : 模拟参数
/** 3、处理结果 */
JSONObject result = verifyResult(resStr);
return new ResultData()
.setRequestTime(requestTime)
.setRequestContent(params)
.setResponseTime(responseTime)
.setPatientId(data.getPatid())
.setResponseContent(resStr)
.setResult(result);
} }

View File

@ -5,7 +5,6 @@ import lombok.experimental.Accessors;
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
import java.io.Serializable; import java.io.Serializable;
import java.util.List;
/** /**
* @Auther: 萧道子 * @Auther: 萧道子
@ -14,7 +13,7 @@ import java.util.List;
*/ */
@Data @Data
@Accessors(chain = true) @Accessors(chain = true)
public class OutpatientBudgetModel implements Serializable { public class OutpatientBeginModel implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** /**

View File

@ -0,0 +1,47 @@
package com.dpkj.modules.chs.vo;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotEmpty;
import java.io.Serializable;
/**
* @Auther: 萧道子
* @Date: 2025/5/27 16:52
* @Description: 结算
*/
@Data
@Accessors(chain = true)
public class OutpatientFinalModel implements Serializable {
private static final long serialVersionUID = 1L;
@NotEmpty(message = "患者ID不可为空!")
private String patid;
@NotEmpty(message = "收据号不可为空!")
private String sjh;
@NotEmpty(message = "总金额不可为空!")
private String zje;
@NotEmpty(message = "应付金额不可为空!")
private String ysje;
@NotEmpty(message = "支付方式不可为空!")
private String paytype;
@NotEmpty(message = "支付金额不可为空!")
private String paymoney;
@NotEmpty(message = "支付流水号不可为空!")
private String paylsh;
@NotEmpty(message = "医保报销金额不可为空!")
private String ybzf;
/**
* 支付时间
*/
private String paytime;
}

View File

@ -12,6 +12,10 @@ server:
min-response-size: 1024 min-response-size: 1024
mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/* mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*
logging:
level:
com.dpkj: debug
spring: spring:
servlet: servlet:
multipart: multipart: