1、住院结算新增线下现金部分退费

2、消息推送接口名称调整为驼峰。
3、HIS数据解析类解析数组时,如果超时,会出现一个空异常处理。
debug
王绍全 2 weeks ago
parent 7b5b6da1d6
commit fe2bd5a904
  1. 85
      src/main/java/com/ynxbd/common/TestA.java
  2. 29
      src/main/java/com/ynxbd/common/action/pay/MedicalAction.java
  3. 5
      src/main/java/com/ynxbd/common/action/pay/PayAction.java
  4. 6
      src/main/java/com/ynxbd/common/action/test/TestAction.java
  5. 4
      src/main/java/com/ynxbd/common/bean/pay/Order.java
  6. 45
      src/main/java/com/ynxbd/common/dao/InHospPayDao.java
  7. 2
      src/main/java/com/ynxbd/common/dao/RegisterDao.java
  8. 4
      src/main/java/com/ynxbd/common/dao/his/HisMedDao.java
  9. 1
      src/main/java/com/ynxbd/common/helper/common/CodeHelper.java
  10. 14
      src/main/java/com/ynxbd/common/result/JsonResult.java
  11. 2
      src/main/java/com/ynxbd/common/service/CasebookService.java
  12. 80
      src/main/java/com/ynxbd/common/service/InHospService.java
  13. 56
      src/main/java/com/ynxbd/common/service/MedicalService.java
  14. 39
      src/main/java/com/ynxbd/common/service/RegService.java
  15. 4
      src/main/java/com/ynxbd/wx/config/MessagePushConfig.java
  16. 12
      src/main/java/com/ynxbd/wx/wxfactory/medical/Client.java
  17. 20
      src/main/resources/wx-msg-push.xml

File diff suppressed because one or more lines are too long

@ -42,6 +42,24 @@ import java.util.Map;
@Namespace("/medical")
public class MedicalAction extends BaseAction {
/**
* 用户信息获取 | 医保上传 | 医保支付下单
*/
@Action("logFeeDetails")
public Result logFeeDetails(String callNo, String payCode, String qrCode, @AesDecode String openid, @AesDecode String patientId, @AesDecode String hisPatientId, @AesDecode String cardNo, String realName, String treatNum, BigDecimal totalFee) {
log.warn("[医保]上传明细数据调试 callNo={}, payCode={}, openid={}, qrCode={}, treatNum={}, patientId={}, hisPatientId={}, cardNo={}, realName={}, totalFee={}",
callNo, payCode, openid, qrCode, treatNum, patientId, hisPatientId, ParamHelper.hideIdCardNo(cardNo), realName, totalFee);
if (callNo == null || payCode == null || openid == null || qrCode == null || patientId == null || cardNo == null || totalFee == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
MerchantEnum merchantEnum = MerchantEnum.findEnumByCode(payCode);
if (merchantEnum == null) { // 支付方式异常
return Result.error(ResultEnum.PAY_TYPE_ERROR);
}
return Result.success();
}
/**
* 用户信息获取 | 医保上传 | 医保支付下单
*/
@ -100,7 +118,7 @@ public class MedicalAction extends BaseAction {
}
return Result.success(medicalInfo);
} catch (ServiceException e) {
} catch (Exception e) {
return Result.error(e);
}
}
@ -271,7 +289,7 @@ public class MedicalAction extends BaseAction {
/**
* HIS医保退费线上
* 医保退费线上
*/
@Action("refundMed")
public Result refundMed(String payCode, String callNo, String openid, String qrCode, String outTradeNo, @AesDecode String tradeNo) {
@ -467,4 +485,11 @@ public class MedicalAction extends BaseAction {
}
}
// @Action("outHospTest")
// public Result outHospTest() {
// System.out.println("住院测试...");
// new MedicalService().outHospPaidNoticeHis(MerchantEnum.WX_MEDICAL, "WX0c8f4caa38bc4a558ab4ea4a69b5", "M26081237393763727", "2026-08-12", "12:00:52", "om5HqvlWTys3Bqls6YV-o4iA3Zqg", null);
// return Result.success();
// }
}

@ -278,7 +278,7 @@ public class PayAction extends BaseAction {
/**
* [医保]微信现金退费
* [医保]微信现金退费线下
*
* @param callNo 调用码 { recipe处方register挂号in_hosp住院预交金 }
* @param payOrdId 医保订单号
@ -308,6 +308,9 @@ public class PayAction extends BaseAction {
case IN_HOSP: // 住院预交金
break;
case OUT_HOSP: // 住院结算
return new InHospService().mdCashRefund(payOrdId, refundDesc);
default:
return Result.error("callNo不符合规则");
}

@ -140,6 +140,12 @@ public class TestAction extends BaseAction {
return Result.success();
}
@Action("his_config_test")
public Result his_config_test() {
System.out.println("开关:" + HisConfig.IS_RX_PREPAY);
return Result.success();
}
// @Action("lock")
// public String lock() {

@ -34,6 +34,10 @@ public class Order implements Serializable {
private String enId;
// 修改时间
private Date updateTime;
// 支付日期
private String payDate;
// 支付时间
private String payTime;
// openid
private String openid;
// 用于支付的openId

@ -2,6 +2,7 @@ package com.ynxbd.common.dao;
import com.ynxbd.common.bean.pay.Order;
import com.ynxbd.common.bean.pay.PayInHosp;
import com.ynxbd.common.bean.pay.Register;
import com.ynxbd.common.config.db.DataBase;
import lombok.extern.slf4j.Slf4j;
@ -253,4 +254,48 @@ public class InHospPayDao {
}
return dataList.get(0);
}
/**
* 根据发订单号和处方号修改退费信息
*
* @param tradeNo His流水号
* @param refundResult 退款结果
* @param refundReason 退款原因
* @return 是否成功
*/
public boolean updateRefundByTradeNo(String tradeNo, String refundResult, String refundReason) {
String sql = "update pay_in_hosp set refundResult=?, refundReason=?, refundTime=now() where tradeNo=? and (refundResult is null or refundResult != 'OK')";
return DataBase.update(sql, ps -> {
ps.setString(1, refundResult);
ps.setString(2, refundReason);
ps.setString(3, tradeNo);
}) > 0;
}
/**
* 根据发订单号和处方号修改退费信息
*
* @param tradeNo His流水号
* @param refundResult 退款结果
* @return 是否成功
*/
public boolean updateRefundByTradeNo(String tradeNo, String refundResult) {
return updateRefundByTradeNo(tradeNo, refundResult, null);
}
public PayInHosp selectPaidByTradeNo(String tradeNo) {
String sql = "select * from pay_in_hosp where tradeNo=? and payStatus=0";
List<PayInHosp> dataList = DataBase.select(sql, PayInHosp.class, ps -> {
ps.setString(1, tradeNo);
});
if (dataList.size() == 1) {
return dataList.get(0);
}
if (dataList.size() > 1) {
log.warn("[住院缴费]数据库存在多条相同的支付记录");
return null;
}
return null;
}
}

@ -689,7 +689,7 @@ public class RegisterDao {
return resultList.get(0);
}
if (resultList.size() > 1) {
log.info("[挂号]数据库存在多条相同的支付记录");
log.warn("[挂号]数据库存在多条相同的支付记录");
return null;
}
return null;

@ -155,8 +155,8 @@ public class HisMedDao {
* @param transNo HIS交易流水号
* @param bankTransNo HIS流水号
*/
public static JsonResult inHospMedPay(MerchantEnum merchantEnum, String mdUserId, String payDate, String payTime, String transNo, String bankTransNo, BigDecimal cashFee, String openId) {
return HisFactory.HisMed(merchantEnum).getJsonResult(HisEnum.YDZF_SaveToHIS_ZY, params -> {
public static JsonResult outHospMedPay(MerchantEnum merchantEnum, String mdUserId, String payDate, String payTime, String transNo, String bankTransNo, BigDecimal cashFee, String openId) {
return HisFactory.HisMed(merchantEnum, true).getJsonResult(HisEnum.YDZF_SaveToHIS_ZY, params -> {
params.put("PayDeviceID", "mobile");
params.put("UserID_YBZF", mdUserId);
params.put("PayMoney", cashFee);

@ -140,6 +140,7 @@ public class CodeHelper {
return idd[0] + idd[1] + idd[2] + idd[3] + idd[4];
}
/**
* 生成时间戳
*/

@ -329,8 +329,16 @@ public class JsonResult {
* @return json数组
*/
public JSONArray getJsonArray(String rooNode, String... nodes) {
if (this.dataMap == null) {
return new JSONArray();
}
Object rootObj = this.dataMap.get(rooNode);
String result = rootObj == null ? JsonHelper.toJsonString(new JSONArray()) : rootObj.toString();
if (rootObj == null) {
return new JSONArray();
}
String result = rootObj.toString();
try {
JSONArray jsonArray;
JSONObject jsonObject;
@ -347,7 +355,7 @@ public class JsonResult {
}
}
} catch (Exception e) {
log.error("JSON数据转换失败");
log.error("[JsonResult]数据转JSON数组失败");
ErrorHelper.println(e);
}
return JSONArray.parseArray(result);
@ -522,7 +530,7 @@ public class JsonResult {
result = jsonObject.getJSONObject(node).toJSONString();
}
} catch (Exception e) {
log.error("JSON数据转换失败");
log.error("[JsonResult]JSON数据转换失败");
ErrorHelper.println(e);
}
return JsonHelper.parseObject(result);

@ -168,7 +168,7 @@ public class CasebookService {
}
// 支付回调通知
// 支付通知
public void paidNotify(MerchantEnum merchantEnum, String openid, BigDecimal totalFee, String outTradeNo, String bankTransNo, String payInfo) {
PayCasebook order = queryOrderByOutTradeNo(outTradeNo);
if (order == null) {

@ -8,16 +8,21 @@ import com.ynxbd.common.bean.pay.PayInHosp;
import com.ynxbd.common.dao.InHospPayDao;
import com.ynxbd.common.dao.RefundDao;
import com.ynxbd.common.dao.his.HisInHospDao;
import com.ynxbd.common.helper.common.DateHelper;
import com.ynxbd.common.helper.common.JsonHelper;
import com.ynxbd.common.his.HisFactory;
import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.Result;
import com.ynxbd.common.result.ResultEnum;
import com.ynxbd.common.result.ServiceException;
import com.ynxbd.wx.wxfactory.WxMedHelper;
import com.ynxbd.wx.wxfactory.WxPayHelper;
import com.ynxbd.wx.wxfactory.medical.models.WxMedOrder;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
/**
* 住院
@ -207,4 +212,75 @@ public class InHospService {
public PayInHosp queryByOutTradeNo(String outTradeNo) {
return new InHospPayDao().selectByOutTradeNo(outTradeNo);
}
/**
* [住院结算]His系统线下退费
*
* @param reason 退费原因
* @return 是否成功
*/
public Result mdCashRefund(String payOrdId, String reason) {
InHospPayDao inHospPayDao = new InHospPayDao();
PayInHosp dbOrder = inHospPayDao.selectPaidByTradeNo(payOrdId);
if (dbOrder == null) {
return Result.error(ResultEnum.DATA_NOT_FOUND);
}
Date updateTime = dbOrder.getUpdateTime();
if (updateTime == null) {
return null;
}
if (!dbOrder.hasPayStatusPaid()) {
log.info("[医保][住院结算]订单未支付 payOrdId={}, payStatus={}", payOrdId, dbOrder.getPayStatus());
return Result.error(ResultEnum.PAY_ORDER_PARAMS_IS_DEFECT);
}
if (dbOrder.hasRefundByRefundResult()) {
return Result.error(ResultEnum.REFUND_IS_REPEAT); // 退费重复申请
}
Boolean hasDateRange = DateHelper.inDateRangeByDay(-30, DateHelper.dateToStr(dbOrder.getUpdateTime(), DateHelper.DateEnum.yyyy_MM_dd_HH_mm_ss));
if (hasDateRange == null || !hasDateRange) {
return Result.error("订单支付日期已经超过30天,请从商户平台退费");
}
String outTradeNo = dbOrder.getOutTradeNo();
BigDecimal cashFee = dbOrder.getPayMoney();
if (cashFee == null) {
return Result.error(ResultEnum.REFUND_CASH_IS_NULL);
}
if (cashFee.compareTo(BigDecimal.ZERO) == 0) {
if (!inHospPayDao.updateRefundByTradeNo(payOrdId, WxPayHelper.OK)) {
log.error("[医保][住院结算]现金0修改数据库状态失败 payOrderId={}", payOrdId);
return Result.error(ResultEnum.DATA_UPDATE_ERROR);
}
Map<String, Object> map = new HashMap<>();
map.put("transNo", dbOrder.getTradeNo());
map.put("payWay", dbOrder.getPayWay());
map.put("bankTransNo", dbOrder.getBankTransNo());
map.put("payMoney", cashFee);
return Result.success(map);
}
WxMedOrder order = WxMedHelper.refundCash(outTradeNo, ("R" + payOrdId), payOrdId, cashFee, reason);
log.info("[医保][住院结算]现金退费 order={}", JsonHelper.toJsonString(order));
String refundReason = "线下HIS医保现金部分退费";
if (!ObjectUtils.isEmpty(reason)) {
refundReason = ":" + reason;
}
String refundResult = order.isOk() ? WxPayHelper.OK : order.getMessage();
if (!inHospPayDao.updateRefundByTradeNo(payOrdId, refundResult, refundReason)) {
log.error("[医保][住院结算]现金退费修改数据库状态失败 payOrderId={}, refundResult={}", payOrdId, refundResult);
}
if (order.isOk()) {
Map<String, Object> map = new HashMap<>();
map.put("transNo", dbOrder.getTradeNo());
map.put("payWay", dbOrder.getPayWay());
map.put("bankTransNo", dbOrder.getBankTransNo());
map.put("payMoney", cashFee);
return Result.success(map);
}
return Result.error(refundResult);
}
}

@ -45,15 +45,15 @@ public class MedicalService {
public void commonNotify(MerchantEnum merchantEnum, String notifyType, String outTradeNo, BigDecimal totalFee, String bankTransNo, String payDate, String payTime, String openid, String payInfo) {
switch (PEnum.toEnum(notifyType)) {
case RECIPE:
rxPaidNotify(merchantEnum, outTradeNo, bankTransNo, payDate, payTime, openid, payInfo);
rxPaidNoticeHis(merchantEnum, outTradeNo, bankTransNo, payDate, payTime, openid, payInfo);
break;
case REG: // 挂号
regPaidNotify(merchantEnum, outTradeNo, bankTransNo, payDate, payTime, openid, payInfo);
regPaidNoticeHis(merchantEnum, outTradeNo, bankTransNo, payDate, payTime, openid, payInfo);
break;
case OUT_HOSP: // 住院结算
outHospPaidNotify(merchantEnum, outTradeNo, bankTransNo, payDate, payTime, openid, payInfo);
outHospPaidNoticeHis(merchantEnum, outTradeNo, bankTransNo, payDate, payTime, openid, payInfo);
break;
default:
@ -196,9 +196,9 @@ public class MedicalService {
throw new ServiceException("[上传明细失败]响应参数ExtData缺失");
}
JSONObject extDataJson = JsonHelper.parseObject(extData);
JSONObject preSetl = extDataJson.getJSONObject("preSetl");
JSONObject setLInfo = extDataJson.getJSONObject("SETLINFO");
medicalInfo.setMedFeeSumAmt(new BigDecimal(preSetl.getString("medfee_sumamt"))); // 医保金额
medicalInfo.setMedFeeSumAmt(new BigDecimal(setLInfo.getString("medfee_sumamt"))); // 医保金额
medicalInfo.setTotalFee(totalFee); // 医保订单总金额
medicalInfo.setCashFee(cashFee); // 现金部分
@ -578,7 +578,7 @@ public class MedicalService {
* @param openid openid
* @param payInfo 支付信息
*/
public boolean regPaidNotify(MerchantEnum merchantEnum, String outTradeNo, String bankTransNo, String payDate, String payTime, String openid, String payInfo) {
public boolean regPaidNoticeHis(MerchantEnum merchantEnum, String outTradeNo, String bankTransNo, String payDate, String payTime, String openid, String payInfo) {
if (outTradeNo == null || bankTransNo == null || payDate == null || payTime == null) {
log.info("[医保][挂号]HIS结算参数缺失 outTradeNo={}, bankTransNo={}, payDate={}, payTime={}", outTradeNo, bankTransNo, payDate, payTime);
return false;
@ -595,7 +595,7 @@ public class MedicalService {
}
if (!regDao.updateMerPaidByOutTradeNo(outTradeNo, payDate, payTime, bankTransNo)) {
log.info("[医保][挂号]修改订单支付状态 outTradeNo={}, bankTransNo={}", outTradeNo, bankTransNo);
log.info("[医保][挂号]修改订单支付状态-失败 outTradeNo={}, bankTransNo={}", outTradeNo, bankTransNo);
return false;
}
@ -647,7 +647,7 @@ public class MedicalService {
}
// 医保自动退费
ApiResult apiResult = new MedicalService().autoRefund(merchantEnum, outTradeNo, tradeNo, cashFee, "系统繁忙缴费失败,自动退费");
ApiResult apiResult = new MedicalService().autoRefund(merchantEnum, outTradeNo, tradeNo, cashFee, respMessage);
boolean isOk = apiResult.isOk();
String refundResult = apiResult.getMessage();
@ -680,7 +680,7 @@ public class MedicalService {
* @param openid openid
* @param payInfo 支付信息
*/
public boolean outHospPaidNotify(MerchantEnum merchantEnum, String outTradeNo, String bankTransNo, String payDate, String payTime, String openid, String payInfo) {
public boolean outHospPaidNoticeHis(MerchantEnum merchantEnum, String outTradeNo, String bankTransNo, String payDate, String payTime, String openid, String payInfo) {
if (outTradeNo == null || bankTransNo == null || payDate == null || payTime == null) {
log.info("[医保][住院结算]HIS结算参数缺失 outTradeNo={}, bankTransNo={}, payDate={}, payTime={}", outTradeNo, bankTransNo, payDate, payTime);
return false;
@ -697,12 +697,12 @@ public class MedicalService {
InHospPayDao inHospPayDao = new InHospPayDao();
if (!new InHospPayDao().updateMerPaidByOutTradeNo(outTradeNo, payDate, payTime, bankTransNo)) {
log.info("[医保][住院结算]修改订单支付状态 outTradeNo={}, bankTransNo={}", outTradeNo, bankTransNo);
log.info("[医保][住院结算]修改订单支付状态-失败 outTradeNo={}, bankTransNo={}", outTradeNo, bankTransNo);
return false;
}
// order.setPayDate(payDate);
// order.setPayTime(payTime);
order.setPayDate(payDate);
order.setPayTime(payTime);
order.setBankTransNo(bankTransNo);
String mdUserId = order.getMdUserId();
@ -715,7 +715,7 @@ public class MedicalService {
return false;
}
//
JsonResult jsonResult = HisMedDao.inHospMedPay(merchantEnum, mdUserId, payDate, payTime, tradeNo, bankTransNo, cashFee, openid);
JsonResult jsonResult = HisMedDao.outHospMedPay(merchantEnum, mdUserId, payDate, payTime, tradeNo, bankTransNo, cashFee, openid);
if (!jsonResult.success()) {
String respCode = jsonResult.getCode();
String respMessage = jsonResult.getMessage();
@ -736,17 +736,27 @@ public class MedicalService {
}
if (cashFee.compareTo(BigDecimal.ZERO) == 0) { // 现金部分为0
// log.info("[医保][住院结算]现金为0不执行退费-修改退费状态 outTradeNo={}, bankTransNo={}, tradeNo={}", outTradeNo, bankTransNo, tradeNo);
// if (!inHospPayDao.updateRefundByTradeNo(tradeNo, "OK")) {
// log.info("[医保][住院结算] 修改数据库退费状态失败 tradeNo={}", tradeNo);
// }
log.info("[医保][住院结算]现金为0不执行退费-修改退费状态 outTradeNo={}, bankTransNo={}, tradeNo={}", outTradeNo, bankTransNo, tradeNo);
if (!inHospPayDao.updateRefundByTradeNo(tradeNo, "OK")) {
log.info("[医保][住院结算]修改数据库退费状态-失败 tradeNo={}", tradeNo);
}
return false;
}
// if (!WxMedConfig.IS_AUTO_REFUND) {
// log.info("[医保][住院结算]现金自动退费功能未开启 outTradeNo={}, bankTransNo={}, tradeNo={}", outTradeNo, bankTransNo, tradeNo);
// return false;
// }
if (!WxMedConfig.IS_AUTO_REFUND) {
log.info("[医保][住院结算]现金自动退费功能未开启 outTradeNo={}, bankTransNo={}, tradeNo={}", outTradeNo, bankTransNo, tradeNo);
return false;
}
// 医保自动退费
ApiResult apiResult = new MedicalService().autoRefund(merchantEnum, outTradeNo, tradeNo, cashFee, respMessage);
boolean isOk = apiResult.isOk();
String refundResult = apiResult.getMessage();
log.info("{}[住院结算]现金自动退费 outTradeNo={}, bankTransNo={}, tradeNo={} [{}]:{}", merchantEnum.NAME, outTradeNo, bankTransNo, tradeNo, (isOk ? "成功" : "失败"), refundResult);
if (!inHospPayDao.updateRefundByTradeNo(tradeNo, refundResult)) {
log.info("{}[住院结算]现金自动退费-修改数据库状态失败 tradeNo={}, refundResult={}", merchantEnum.NAME, tradeNo, refundResult);
}
return false;
}
@ -784,7 +794,7 @@ public class MedicalService {
* @param openid openid
* @param payInfo 支付信息
*/
public boolean rxPaidNotify(MerchantEnum merchantEnum, String outTradeNo, String bankTransNo, String payDate, String payTime, String openid, String payInfo) {
public boolean rxPaidNoticeHis(MerchantEnum merchantEnum, String outTradeNo, String bankTransNo, String payDate, String payTime, String openid, String payInfo) {
if (outTradeNo == null || bankTransNo == null || payDate == null || payTime == null) {
log.info("[医保][处方]HIS结算参数缺失 outTradeNo={}, bankTransNo={}, payDate={}, payTime={}", outTradeNo, bankTransNo, payDate, payTime);
return false;
@ -861,7 +871,7 @@ public class MedicalService {
return false;
}
ApiResult apiResult = new MedicalService().autoRefund(merchantEnum, outTradeNo, tradeNo, cashFee, "系统繁忙缴费失败,自动退费");
ApiResult apiResult = new MedicalService().autoRefund(merchantEnum, outTradeNo, tradeNo, cashFee, respMessage);
boolean isOk = apiResult.isOk();
String refundResult = apiResult.getMessage();

@ -16,6 +16,7 @@ import com.ynxbd.common.dao.RegisterDao;
import com.ynxbd.common.dao.his.HisAccountDao;
import com.ynxbd.common.dao.his.HisRegisterDao;
import com.ynxbd.common.helper.common.DateHelper;
import com.ynxbd.common.helper.common.JsonHelper;
import com.ynxbd.common.his.HisFactory;
import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.Result;
@ -244,70 +245,70 @@ public class RegService {
/**
* His系统处方手动退费
* [挂号]His系统线下退费
*
* @param reason 退费原因
* @return 是否成功
*/
public Result mdCashRefund(String payOrdId, String reason) {
RegisterDao regDao = new RegisterDao();
Register regInfo = regDao.selectStatusErrOrder(payOrdId);
if (regInfo == null) {
Register dbOrder = regDao.selectStatusErrOrder(payOrdId);
if (dbOrder == null) {
return Result.error(ResultEnum.DATA_NOT_FOUND);
}
Date updateTime = regInfo.getUpdateTime();
Date updateTime = dbOrder.getUpdateTime();
if (updateTime == null) {
return null;
}
if (!regInfo.hasPayStatusPaid()) {
log.info("[医保]订单未支付 payOrdId={}, payStatus={}", payOrdId, regInfo.getPayStatus());
if (!dbOrder.hasPayStatusPaid()) {
log.info("[医保][挂号]订单未支付 payOrdId={}, payStatus={}", payOrdId, dbOrder.getPayStatus());
return Result.error(ResultEnum.PAY_ORDER_PARAMS_IS_DEFECT);
}
if (regInfo.hasRefundByRefundResult()) {
if (dbOrder.hasRefundByRefundResult()) {
return Result.error(ResultEnum.REFUND_IS_REPEAT); // 退费重复申请
}
Boolean hasDateRange = DateHelper.inDateRangeByDay(-30, DateHelper.dateToStr(regInfo.getUpdateTime(), DateHelper.DateEnum.yyyy_MM_dd_HH_mm_ss));
Boolean hasDateRange = DateHelper.inDateRangeByDay(-30, DateHelper.dateToStr(dbOrder.getUpdateTime(), DateHelper.DateEnum.yyyy_MM_dd_HH_mm_ss));
if (hasDateRange == null || !hasDateRange) {
return Result.error("订单支付日期已经超过30天,请从商户平台退费");
}
String outTradeNo = regInfo.getOutTradeNo();
BigDecimal cashFee = regInfo.getPayMoney();
String outTradeNo = dbOrder.getOutTradeNo();
BigDecimal cashFee = dbOrder.getPayMoney();
if (cashFee == null) {
return Result.error(ResultEnum.REFUND_CASH_IS_NULL);
}
if (cashFee.compareTo(BigDecimal.ZERO) == 0) {
if (!regDao.updateRefundByTradeNo(payOrdId, WxPayHelper.OK)) {
log.error("[医保]挂号现金0修改数据库状态失败 payOrderId={}", payOrdId);
log.error("[医保][挂号]现金0修改数据库状态失败 payOrderId={}", payOrdId);
return Result.error(ResultEnum.DATA_UPDATE_ERROR);
}
Map<String, Object> map = new HashMap<>();
map.put("transNo", regInfo.getTradeNo());
map.put("payWay", regInfo.getPayWay());
map.put("bankTransNo", regInfo.getBankTransNo());
map.put("transNo", dbOrder.getTradeNo());
map.put("payWay", dbOrder.getPayWay());
map.put("bankTransNo", dbOrder.getBankTransNo());
map.put("payMoney", cashFee);
return Result.success(map);
}
WxMedOrder order = WxMedHelper.refundCash(outTradeNo, ("R" + payOrdId), payOrdId, cashFee, reason);
log.info("[医保]挂号现金退费order={}", order);
log.info("[医保][挂号]现金退费 order={}", JsonHelper.toJsonString(order));
String refundReason = "线下HIS医保现金部分退费";
if (!ObjectUtils.isEmpty(reason)) {
refundReason = ":" + reason;
}
String refundResult = order.isOk() ? WxPayHelper.OK : order.getMessage();
if (!regDao.updateRefundByTradeNo(payOrdId, refundResult, refundReason)) {
log.error("[医保]挂号现金退费修改数据库状态失败 payOrderId={}, refundResult={}", payOrdId, refundResult);
log.error("[医保][挂号]现金退费修改数据库状态失败 payOrderId={}, refundResult={}", payOrdId, refundResult);
}
if (order.isOk()) {
Map<String, Object> map = new HashMap<>();
map.put("transNo", regInfo.getTradeNo());
map.put("payWay", regInfo.getPayWay());
map.put("bankTransNo", regInfo.getBankTransNo());
map.put("transNo", dbOrder.getTradeNo());
map.put("payWay", dbOrder.getPayWay());
map.put("bankTransNo", dbOrder.getBankTransNo());
map.put("payMoney", cashFee);
return Result.success(map);
}

@ -5,6 +5,7 @@ import com.ynxbd.common.bean.enums.MerchantEnum;
import com.ynxbd.common.bean.pay.Recipe;
import com.ynxbd.common.bean.pay.Register;
import com.ynxbd.common.dao.PatientDao;
import com.ynxbd.common.helper.common.JsonHelper;
import com.ynxbd.common.helper.common.XmlConfigHelper;
import com.ynxbd.common.helper.http.OkHttpHelper;
import com.ynxbd.wx.pwe.PWEHelper;
@ -173,7 +174,6 @@ public class MessagePushConfig {
String time = (ObjectUtils.isEmpty(begTime) || ObjectUtils.isEmpty(endTime)) ? "" : (" " + begTime + "-" + endTime);
OkHttpHelper.getAsync(REG_PAID_API, params -> {
params.put("openId", DesEncryptHelper.enCode(openid));
params.put("patientName", patient.getName() + " ID:" + patientId);
@ -368,7 +368,7 @@ public class MessagePushConfig {
/**
* 缴费成功推送
*/
public static void recipePush(List<Recipe> recipeList, String treatNum, String patientId, String openid, String tip) {
public static void rxPush(List<Recipe> recipeList, String treatNum, String patientId, String openid, String tip) {
try {
if (!RX_PAID_IS_ENABLE || ObjectUtils.isEmpty(RX_PAID_API)) {
return;

@ -130,7 +130,7 @@ public class Client {
// 使用医保支付时必填
params.put("is_dept", "4"); // 医保标识
params.put("org_no", orgNo); // 医疗机构编码(医保局分配给机构)
params.put("nonce_str", UUID.randomUUID().toString().replaceAll("-", ""));
params.put("nonce_str", UUID.randomUUID().toString().replace("-", ""));
params.put("gmt_out_create", DateHelper.dateToStr(new Date(), DateHelper.DateEnum.yyyyMMddHHmmss)); // 医院下单时间
Map<String, String> requestContent = new HashMap<>();
@ -165,7 +165,7 @@ public class Client {
// 二选一
params.put("hosp_out_trade_no", outTradeNo); // 第三方服务商订单号 outTradeNo
// params.put("med_trans_id", medTransId); // 微信生成的医疗订单号
params.put("nonce_str", UUID.randomUUID().toString().replaceAll("-", ""));
params.put("nonce_str", UUID.randomUUID().toString().replace("-", ""));
params.put("sign", WxSignHelper.generateSign(params, WxSignHelper.SIGN_TYPE_MD5, mdPayKey));
log.info("[医保][查询订单] req={}", JsonHelper.toJsonString(params));
@ -218,7 +218,7 @@ public class Client {
// params.put("med_trans_id", medTransId); // 微信生成的医疗订单号
params.put("hosp_out_refund_no", outRefundNo); // 退费订单号
params.put("nonce_str", UUID.randomUUID().toString().replaceAll("-", ""));
params.put("nonce_str", UUID.randomUUID().toString().replace("-", ""));
JSONObject requestContent = new JSONObject();
requestContent.put("ref_reason", finalReason);
@ -275,7 +275,7 @@ public class Client {
if (!ObjectUtils.isEmpty(medTransId)) {
params.put("med_trans_id", medTransId); // 微信生成的医疗订单号
}
params.put("nonce_str", UUID.randomUUID().toString().replaceAll("-", ""));
params.put("nonce_str", UUID.randomUUID().toString().replace("-", ""));
params.put("sign", WxSignHelper.generateSign(params, WxSignHelper.SIGN_TYPE_MD5, mdPayKey));
@ -307,7 +307,7 @@ public class Client {
params.put("bill_date", billDate);
params.put("bill_type", billType);
params.put("nonce_str", UUID.randomUUID().toString().replaceAll("-", ""));
params.put("nonce_str", UUID.randomUUID().toString().replace("-", ""));
params.put("sign", WxSignHelper.generateSign(params, WxSignHelper.SIGN_TYPE_MD5, mdPayKey));
log.info("[医保][账单下载] req={}", JsonHelper.toJsonString(params));
});
@ -349,7 +349,7 @@ public class Client {
//
headers.set("god-portal-timestamp", timestamp);
headers.set("god-portal-signature", signature);
headers.set("god-portal-request-id", UUID.randomUUID().toString().replaceAll("-", ""));
headers.set("god-portal-request-id", UUID.randomUUID().toString().replace("-", ""));
});
if (respJson == null) {
info.setMessage("请求用户信息失败");

@ -4,29 +4,29 @@
<reg_navigate name="[挂号]导航推送">
<is_enable>false</is_enable>
<api>daoyixun</api>
<api>DaoYiXun</api>
</reg_navigate>
<reg_paid name="[挂号]缴费通知">
<is_enable>false</is_enable>
<api>appointmentsuccess</api>
<is_enable>true</is_enable>
<api>AppointmentSuccess</api>
</reg_paid>
<reg_cancel name="[挂号]取消预约">
<is_enable>false</is_enable>
<api>appointmentcancel</api>
<is_enable>true</is_enable>
<api>AppointmentCancel</api>
</reg_cancel>
<rx_paid name="[处方]缴费通知">
<is_enable>false</is_enable>
<api>PaymentSuccess</api>
</rx_paid>
<reg_ai name="[挂号]AI">
<is_enable>false</is_enable>
<api>business/universal</api>
</reg_ai>
<rx_paid name="[处方]缴费通知">
<is_enable>false</is_enable>
<api>paymentsuccess</api>
</rx_paid>
<obs_document name="产科建档">
<is_enable>false</is_enable>
<api>business/universal</api>

Loading…
Cancel
Save