互联网处方缴费过滤调整

master_pay
王绍全 1 week ago
parent e76dc3245a
commit 113196cada
  1. 14
      src/main/java/com/ynxbd/common/TestA.java
  2. 52
      src/main/java/com/ynxbd/common/action/RecipeAction.java
  3. 13
      src/main/java/com/ynxbd/common/action/pay/JYPayAction.java
  4. 6
      src/main/java/com/ynxbd/common/action/pay/PayAction.java
  5. 8
      src/main/java/com/ynxbd/common/bean/enums/MerchantEnum.java
  6. 2
      src/main/java/com/ynxbd/common/bean/pay/Order.java
  7. 5
      src/main/java/com/ynxbd/common/bean/pay/Recipe.java
  8. 31
      src/main/java/com/ynxbd/common/dao/his/HisRecipeDao.java
  9. 4
      src/main/java/com/ynxbd/common/dao/lis/RMLisDao.java
  10. 25
      src/main/java/com/ynxbd/common/helper/common/DateHelper.java
  11. 2
      src/main/java/com/ynxbd/common/his/HisEnum.java
  12. 14
      src/main/java/com/ynxbd/common/service/MicroService.java
  13. 16
      src/main/java/com/ynxbd/common/service/PayService.java
  14. 39
      src/main/java/com/ynxbd/common/service/RxService.java
  15. 50
      src/main/java/com/ynxbd/jy/helper/JYPayHelper.java
  16. 5
      src/main/java/com/ynxbd/wx/config/HospConfigEnum.java
  17. 6
      src/main/java/com/ynxbd/wx/wxfactory/WxMedHelper.java
  18. 2
      src/main/java/com/ynxbd/wx/wxfactory/medical/models/MedRespHelper.java

@ -5,11 +5,14 @@ import com.alibaba.fastjson.JSONObject;
import com.ynxbd.common.bean.xk.HisWMRxItem;
import com.ynxbd.common.bean.xk.XKChargeOrRefund;
import com.ynxbd.common.helper.common.AesMicroHelper;
import com.ynxbd.common.helper.common.DateHelper;
import com.ynxbd.common.helper.common.JsonHelper;
import com.ynxbd.common.helper.http.OkHttpHelper;
import com.ynxbd.wx.wxfactory.AesWxHelper;
import lombok.extern.slf4j.Slf4j;
import java.math.BigDecimal;
@Slf4j
public class TestA {
@ -134,11 +137,12 @@ public class TestA {
public static void main(String[] args) {
XKChargeOrRefund info = new XKChargeOrRefund();
info.setVisitNo("111");
OkHttpHelper.postAsync("http://127.0.0.1:9090/micro/xk/rxChargeOrRefund", map -> {
map.put("data", AesMicroHelper.encode(JsonHelper.toJsonString(info)));
});
System.out.println(DateHelper.dateFormatDate("20260831100304", DateHelper.DateEnum.yyyyMMddHHmmss, DateHelper.DateEnum.yyyy_MM_dd_HH_mm_ss));
// XKChargeOrRefund info = new XKChargeOrRefund();
// info.setVisitNo("111");
// OkHttpHelper.postAsync("http://127.0.0.1:9090/micro/xk/rxChargeOrRefund", map -> {
// map.put("data", AesMicroHelper.encode(JsonHelper.toJsonString(info)));
// });
// System.out.println(AesWxHelper.decode("DC88B70DDA4C2EA965CBF5FCD43297CD6478071E12258B40EE29EFFB3A1043CA"));
}

@ -1,5 +1,6 @@
package com.ynxbd.common.action;
import cn.hutool.core.util.StrUtil;
import com.ynxbd.common.action.base.BaseAction;
import com.ynxbd.common.bean.HisRecipe;
import com.ynxbd.common.bean.NatRecord;
@ -42,7 +43,30 @@ import java.util.Map;
public class RecipeAction extends BaseAction {
/**
* 获取已缴费项目
* 获取未缴费项目(旧)
*/
@Action("getUnPayList")
public Result getUnPayList(@AesDecode String patientId, String personNo, String begDate, String endDate) {
log.info("[处方]未缴费项目查询 patientId={}, personNo={}, begDate={}, endDate={}", patientId, personNo, begDate, endDate);
if (patientId == null || begDate == null || endDate == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
int days = DateHelper.intervalDays(begDate, endDate, true);
List<HisRecipe> hisRecipes = new HisRecipeDao().getRxUnPay(null, patientId, personNo, days);
List<HisRecipe> resultList = new ArrayList<>();
for (HisRecipe hisRecipe : hisRecipes) {
if (hisRecipe.getDate() != null && DateHelper.inDateRange(begDate, endDate, hisRecipe.getDate(), DateHelper.DateEnum.yyyy_MM_dd)
&& !"1".equals(hisRecipe.getSTDFlag())
&& (!"1".equals(hisRecipe.getInternetHospFlag()) || "1".equals(hisRecipe.getYJSAuditFlag()))) {
resultList.add(hisRecipe);
}
}
return Result.success(resultList);
}
/**
* 获取已缴费项目(废弃)
*/
@Action("getPayedList")
public Result getPayedList(@AesDecode String patientId, String personNo, String begDate, String endDate) {
@ -111,29 +135,6 @@ public class RecipeAction extends BaseAction {
return Result.success(dataList);
}
/**
* 获取未缴费项目(旧)
*/
@Action("getUnPayList")
public Result getUnPayList(@AesDecode String patientId, String personNo, String begDate, String endDate) {
log.info("[处方]未缴费项目查询 patientId={}, personNo={}, begDate={}, endDate={}", patientId, personNo, begDate, endDate);
if (patientId == null || begDate == null || endDate == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
int days = DateHelper.intervalDays(begDate, endDate, true);
List<HisRecipe> hisRecipes = new HisRecipeDao().getRxUnPay(null, patientId, personNo, days);
List<HisRecipe> resultList = new ArrayList<>();
for (HisRecipe hisRecipe : hisRecipes) {
if (hisRecipe.getDate() != null && DateHelper.inDateRange(begDate, endDate, hisRecipe.getDate(), DateHelper.DateEnum.yyyy_MM_dd)
&& !"1".equals(hisRecipe.getSTDFlag())
&& (!"1".equals(hisRecipe.getInternetHospFlag()) || "1".equals(hisRecipe.getYJSAuditFlag()))) {
resultList.add(hisRecipe);
}
}
return Result.success(resultList);
}
/**
* [问诊处方]未缴费项目查询-【包括互联网医院未审核,医保双通道订单】
@ -209,9 +210,10 @@ public class RecipeAction extends BaseAction {
@Action("peisHisPay")
public Result peisHisPay(String treatNum, String payMoney, String payDate, String payTime, String bankTransNo, String outTranNo) {
log.info("[体检预约请求his计费]treatNum-{},payMoney-{},payDate-{},payTime-{},bankTransNo-{},outTranNo-{}", treatNum, payMoney, payDate, payTime, bankTransNo, outTranNo);
if ("".equals(treatNum) || "".equals(outTranNo)) {
if (StrUtil.hasBlank(treatNum, outTranNo)) {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
PEISReserve peisReserve = new PEISDao().selectByOutTradeNo(outTranNo);
if (peisReserve == null) {
return Result.error(ResultEnum.DATA_NOT_FOUND);

@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
import com.ynxbd.common.action.base.BaseAction;
import com.ynxbd.common.bean.enums.MerchantEnum;
import com.ynxbd.common.bean.pay.ApiPayNotify;
import com.ynxbd.common.bean.pay.Order;
import com.ynxbd.common.bean.pay.ReqOrder;
import com.ynxbd.common.helper.common.HttpHelper;
import com.ynxbd.common.helper.common.JsonHelper;
@ -89,15 +90,15 @@ public class JYPayAction extends BaseAction {
* [京颐支付]订单查询
*/
@Action("query_order")
public Result query_order(String outTradeNo, String merOrderNum, String tradeNo) {
log.info("[京颐支付]订单查询 outTradeNo={}, merOrderNum={}, tradeNo={}",
outTradeNo, merOrderNum, tradeNo);
public Result query_order(String outTradeNo, String bizTradeNo, String tradeNo) {
log.info("[京颐支付]订单查询 outTradeNo={}, bizTradeNo={}, tradeNo={}",
outTradeNo, bizTradeNo, tradeNo);
JSONObject prepay = JYPayHelper.queryPayOrderInfo(outTradeNo, merOrderNum, tradeNo);
if (prepay == null) {
Order order = JYPayHelper.queryPayOrderInfo(outTradeNo, bizTradeNo, tradeNo);
if (order == null) {
return Result.error(ResultEnum.DATA_NOT_FOUND);
}
return Result.success(prepay);
return Result.success(order);
}

@ -118,10 +118,8 @@ public class PayAction extends BaseAction {
if (!HisConfig.IS_RX_PREPAY || !WeChatConfig.IS_RECIPE_PREPAY) { // 配置(两个开关)
return Result.error(ResultEnum.PAY_RECIPE_PREPAY_IS_NOT);
}
log.info("{} [处方]预结算开始... patientId={}", merchantEnum.NAME, patientId);
// 调用预结算!!!!注意如果HIS不支持开启改功能后,会存在直接入库的风险
List<Recipe> rxList = rxService.hisRxPrepay(recipeJson, patientId, treatNum);
List<Recipe> rxList = rxService.hisRxPrepay(merchantEnum, recipeJson, patientId, treatNum);
return Result.success(rxList);
}
@ -137,7 +135,7 @@ public class PayAction extends BaseAction {
// 订单信息预存
if (!rxService.saveRxData(merchantEnum, payOpenId, openid, recipeJson, payWay, rxType, patientId, treatNum, totalFee, new ApiPrepayResp(respJson))) {
log.info("{} [处方支付]预存支付信息失败 patientId={}", merchantEnum.NAME, patientId);
log.error("{} [处方支付]预存支付信息失败 patientId={}, treatNum={}", merchantEnum.NAME, patientId, treatNum);
return Result.error(ResultEnum.SPECIFIED_QUESTIONED_USER_NOT_EXIST);
}
return Result.success(respJson);

@ -66,7 +66,7 @@ public enum MerchantEnum {
ALI_MEDICAL("ali_medical", "【支付宝医保】", AliConfig.APP_ID, ALI.OUT_TRADE_NO_PREFIX,
AliMedConfig.IS_DEV,
"3",
ALI.HIS_PAY_WAY,
"25,26,27,28,29,30",
"ali_pay/medical_notify",
"",
@ -74,7 +74,7 @@ public enum MerchantEnum {
BCM("bcm", "【交行】", "", "BCM",
false,
"4",
WX.HIS_PAY_WAY,
"",
"bcm_pay/notify",
"",
@ -82,7 +82,7 @@ public enum MerchantEnum {
JY("jy", "【京颐】", "", "JY",
false,
"4",
WX.HIS_PAY_WAY,
"",
"jy_pay/notify",
"",
@ -99,7 +99,7 @@ public enum MerchantEnum {
public final String OUT_TRADE_NO_PREFIX;
public final boolean IS_DEV;
// 支付方式[3:支付宝;4:微信]
public final String HIS_PAY_WAY;
// 条码规则
public final String BAR_CODE_RULES;

@ -107,6 +107,8 @@ public class Order implements Serializable {
private String invoiceTransNo;
// 退款金额
private BigDecimal refundMoney;
// 退费时间
private String refundTime;
// 退款类型
private String refundType;
// 退款结果描述

@ -48,4 +48,9 @@ public class Recipe extends Order implements Serializable {
private String feeInfo;
// 处方类型[1:普通处方; 10:互联网医院处方; 11:互联网医院流转处方; 15:生育门诊; 20:慢特病处方;]
private Integer rxType;
// 是否为互联网处方
public boolean hasOLRx() {
return rxType != null && (rxType == 10 || rxType == 11);
}
}

@ -120,7 +120,7 @@ public class HisRecipeDao {
/**
* HIS申请单预缴费
* [处方]HIS预结算
*
* @param patientId 患者ID
* @param treatNum 门诊号
@ -129,15 +129,19 @@ public class HisRecipeDao {
* @param payDate 支付日期
* @param payTime 支付时间
* @param payDeviceId payDeviceID
* @return payInvoiceResponseBean
* @return json
*/
public static JsonResult prepay(String patientId, String treatNum, List<String> recipeIds, String payMoney,
String payDate, String payTime, String payDeviceId, MerchantEnum merchantEnum) {
public static JsonResult rxPrepay(MerchantEnum merchantEnum, String patientId, String treatNum, List<String> recipeIds, String payMoney,
String payDate, String payTime, String payDeviceId) {
StringBuilder recipeIdsXml = new StringBuilder();
for (String id : recipeIds) {
recipeIdsXml.append("<Id>").append(id).append("</Id>");
}
if (merchantEnum == null) {
merchantEnum = MerchantEnum.WX;
}
MerchantEnum finalMerchantEnum = merchantEnum;
return HisFactory.His().getJsonResultByMer(HisEnum.AP_PrePay_Invoice_New, merchantEnum, params -> {
params.put("Recipe", recipeIdsXml.toString());
params.put("PatientID", patientId);
@ -145,12 +149,12 @@ public class HisRecipeDao {
params.put("PayMoney", payMoney);
params.put("PayDate", payDate);
params.put("PayTime", payTime);
params.put("PayDeviceID", payDeviceId);
params.put("PayDeviceID", ObjectUtils.isEmpty(payDeviceId) ? "app" : payDeviceId);
params.put("TransNo", UUID.randomUUID().toString().replace("-", ""));
params.put("BankTransNo", UUID.randomUUID().toString().replace("-", ""));
params.put("PayWay", merchantEnum.HIS_PAY_WAY);
params.put("PayWay", finalMerchantEnum.HIS_PAY_WAY);
});
}
@ -175,9 +179,8 @@ public class HisRecipeDao {
String fpOrderId = (tradeNo != null && tradeNo.indexOf("ORD") == 0 ? tradeNo : transId);
if (ObjectUtils.isNotEmpty(feeId)
&& ObjectUtils.isNotEmpty(feeInfo)) { // 新版本预缴费
log.info("[HIS预结算]回调 feeId={}", feeId);
if (ObjectUtils.isNotEmpty(feeId) && ObjectUtils.isNotEmpty(feeInfo)) { // 新版本-HIS预结算缴费
log.info("[处方]HIS预结算缴费 feeId={}", feeId);
return HisFactory.His().getJsonResultByMer(HisEnum.AP_Pay_Invoice_New, merchantEnum, params -> {
params.put("PatientID", patientId);
params.put("PayDate", payDate);
@ -212,14 +215,16 @@ public class HisRecipeDao {
params.put("BankTransNo", fpOrderId); // 商户订单号
params.put("OpenId", openid);
params.put("Token", WeChatConfig.TOKEN);
if (treatNum.contains("P-")) {
log.info("[{}支付回调-体检,体检号-{}]", merchantEnum.NAME, treatNum);
if (treatNum != null && treatNum.contains("P-")) {
log.info("{} 体检缴费-体检号:{}", merchantEnum.NAME, treatNum);
params.put("TJBH", treatNum.split("-")[1]); // P-0001
params.put("MZNum", "0");
params.put("PatientID", "0");
params.put("TJBH", treatNum.split("-")[1]);
params.put("GroupFlag", "1");
// 体检支付需传入总金额
params.put("PayMoney", totalFee);
// 注意:体检缴费需移除[Recipe]节点
params.remove("Recipe");
params.put("PayMoney", totalFee); //如果是体检支付就传入总金额
}
return HisFactory.His().getJsonResultByMer(HisEnum.AP_Pay_Invoice, merchantEnum, params);
}

@ -88,12 +88,12 @@ public class RMLisDao {
XBDLisReport xbdLisReport = new XBDLisReport();
if(report.getOrderItems()!=null){
xbdLisReport.setReqItemName(report.getOrderItems().get(0).getProjectName());
xbdLisReport.setReqDate(DateHelper.DateTimeToString(report.getOrderItems().get(0).getRequestTime()));
xbdLisReport.setReqDate(DateHelper.dateTimeToString(report.getOrderItems().get(0).getRequestTime()));
}
xbdLisReport.setEnReportId(AesWxHelper.encode(report.getReportID()));
xbdLisReport.setReportType(report.getReportType());
xbdLisReport.setPatientType(report.getPatientKind());
xbdLisReport.setReportDate(DateHelper.DateTimeToString(report.getRechkDate()));
xbdLisReport.setReportDate(DateHelper.dateTimeToString(report.getRechkDate()));
xbdLisReport.setReporter(report.getRechkUserName());
xbdLisReport.setTreatId(report.getPatientNo());
xbdLisReport.setSampleCode(report.getBarcode());

@ -40,8 +40,29 @@ public class DateHelper {
}
}
/**
* 把日期转化为另外一种格式
*
* @param dateStr 日期字符串
* @param dateEnum 日期格式
* @param formatDateEnum 被转化后的格式
* @return 日期
*/
public static String dateFormatDate(String dateStr, DateEnum dateEnum, DateEnum formatDateEnum) {
try {
if (ObjectUtils.isEmpty(dateStr)) {
return null;
}
SimpleDateFormat format = new SimpleDateFormat(dateEnum.TYPE);
format.setLenient(false);
return new SimpleDateFormat(formatDateEnum.TYPE).format(format.parse(dateStr));
} catch (Exception e) {
return null;
}
}
public static String DateTimeToString(Date date) {
public static String dateTimeToString(Date date) {
if (date == null || "".equals(date.toString())) {
return "";
}
@ -283,7 +304,7 @@ public class DateHelper {
SimpleDateFormat format = new SimpleDateFormat(DateEnum.yyyy_MM_dd.TYPE);
long dateTime = format.parse(date).getTime();
// 以今天为起点,获取半年前的日期
// 以今天为起点,获取移动的日期
String moveDate = getMoveDate(getCurDate(), moveDays);
long moveTime = format.parse(moveDate).getTime();

@ -59,7 +59,7 @@ public enum HisEnum {
AP_Query_UnPay_Invoice("[处方]查询待缴费项目", "4001", "AP_Query_UnPay_Invoice", true),
AP_Query_OutpatientFee("[处方]查询已缴费项目", "5005", "AP_Query_OutpatientFee", true),
AP_Pay_Invoice("[处方]更新recipeId参数为List,支持多个处方单同时缴费", "4002", "AP_Pay_Invoice", true),
AP_Pay_Invoice("[处方]项目缴费-支持多个处方单同时缴费", "4002", "AP_Pay_Invoice", true),
AP_PrePay_Invoice_New("[处方]预结算", "4004", "AP_PrePay_Invoice_New", true),
AP_Pay_Invoice_New("[处方]预结算缴费", "4005", "AP_Pay_Invoice_New", true),

@ -14,6 +14,7 @@ import org.apache.commons.lang3.ObjectUtils;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* @date 2023/4/10 15:22
@ -39,17 +40,21 @@ public class MicroService {
}
public void uploadRxFee(List<Recipe> rxList, boolean isNotFailRx, BigDecimal totalFee, boolean isMedIns) {
public void uploadRxFee(List<Recipe> rxList, String outTradeNo, boolean isNotFailRx, BigDecimal totalFee, boolean isMedIns) {
try {
System.out.println("[监管平台]处方缴费上报...");
if (rxList.isEmpty()) {
log.warn("[监管平台]缴费处方数量为0");
log.warn("[监管平台]缴费处方数量为0 outTradeNo={}", outTradeNo);
return;
}
List<Recipe> olRxList = rxList.stream().filter(Recipe::hasOLRx).collect(Collectors.toList());
if (olRxList.size() != rxList.size()) {
log.warn("[监管平台]缴费处方互联网处方数量和订单的处方数量不一致 outTradeNo={}", outTradeNo);
}
Recipe rx = rxList.get(0);
if (rx == null) {
log.warn("[监管平台]处方信息缺失");
log.warn("[监管平台]处方信息缺失 outTradeNo={}", outTradeNo);
return;
}
String openId = rx.getOpenid();
@ -110,6 +115,7 @@ public class MicroService {
xk.setDeptName(deptName);
xk.setItems(items);
System.out.println("[监管平台]处方缴费上报...");
OkHttpHelper.postAsync("http://127.0.0.1/micro/xk/rxChargeOrRefund", map -> {
map.put("data", AesMicroHelper.encode(JsonHelper.toJsonString(xk)));
});

@ -265,11 +265,11 @@ public class PayService {
* @param merchantEnum 支付方式
* @param outTradeNo 订单号
* @param refundMoney 退费金额
* @param totalFee 【微信】 退费总金额
* @param refundDesc 【微信】 退费描述
* @param msgOpenId 【微信】 推送者openid
* @param patientId 【微信】 推送者患者id
* @param pushInfo 【微信】 推送内容(为空不推送)
* @param totalFee 退费总金额
* @param refundDesc 退费描述
* @param msgOpenId 推送者openid
* @param patientId 推送者患者id
* @param pushInfo 推送内容(为空不推送)
* @return 退费信息
*/
public static Order refund(MerchantEnum merchantEnum, String outTradeNo, String outRefundNo, BigDecimal refundMoney, BigDecimal totalFee, String refundDesc, Date tradeDate, String msgOpenId, String patientId, String pushInfo) {
@ -278,6 +278,7 @@ public class PayService {
return order;
}
log.info("{}退款 outTradeNo={}, outRefundNo={}, tradeDate={}", merchantEnum.NAME, outTradeNo, outRefundNo, tradeDate);
switch (merchantEnum) {
case WX:
return WxPayHelper.refund(merchantEnum, outTradeNo, outRefundNo, refundMoney, totalFee, refundDesc);
@ -289,7 +290,6 @@ public class PayService {
return AliHelper.refund(outTradeNo, outRefundNo, refundMoney, refundDesc);
case BCM:
log.info("【交行退款】outTradeNo={}, tradeDate={}", outTradeNo, tradeDate);
String tradeDateStr = DateHelper.dateToStr(tradeDate, DateHelper.DateEnum.yyyyMMdd);
if (tradeDateStr == null) {
order.setErrorMsg("退款日期错误");
@ -298,7 +298,6 @@ public class PayService {
return BCMHelper.refund(outTradeNo, outRefundNo, tradeDateStr, refundMoney, refundDesc);
case JY:
log.info("【京颐退款】outTradeNo={}, outRefundNo={}, tradeDate={}", outTradeNo, outRefundNo, tradeDate);
return JYPayHelper.refundPayOrder(JYBusinessTypeEnum.B102, new ReqOrder(), outRefundNo, refundMoney, outTradeNo, null, null);
default:
break;
@ -334,6 +333,9 @@ public class PayService {
} else if (MerchantEnum.BCM.equals(merchantEnum)) {
return BCMHelper.queryOrder(outTradeNo);
} else if (MerchantEnum.JY.equals(merchantEnum)) {
return JYPayHelper.queryPayOrderInfo(outTradeNo, null, null);
}
order.setErrorMsg("支付方式不存在");

@ -154,19 +154,19 @@ public class RxService {
/**
* 处方订单信息预存
* [处方]HIS预结算
*
* @param recipeJson 处方单json数据
* @param patientId 患者id
* @param treatNum 门诊号
* @return 是否完成操作
*/
public List<Recipe> hisRxPrepay(String recipeJson, String patientId, String treatNum) {
log.info("[处方]预结算 patientId={}, treatNum={}, recipeJson={}", patientId, treatNum, recipeJson);
public List<Recipe> hisRxPrepay(MerchantEnum merchantEnum, String recipeJson, String patientId, String treatNum) {
log.info("[处方]HIS预结算开始... patientId={}, treatNum={}, recipeJson={}", patientId, treatNum, recipeJson);
List<Recipe> respList = new ArrayList<>();
List<Recipe> recipeList = JsonHelper.parseArray(recipeJson, Recipe.class);
if (recipeList == null || recipeList.isEmpty()) {
log.info("[处方]预结算勾选处方数量为0 或 数据转换失败");
List<Recipe> rxList = JsonHelper.parseArray(recipeJson, Recipe.class);
if (rxList == null || rxList.isEmpty()) {
log.info("[处方]HIS预结算-勾选处方数量为0 或 数据转换失败");
return respList;
}
@ -176,29 +176,28 @@ public class RxService {
String recipeId, feeId, feeInfo;
JsonResult response;
Recipe addInfo;
for (Recipe recipe : recipeList) {
recipeId = recipe.getRecipeId();
if (ObjectUtils.isEmpty(recipeId) || ObjectUtils.isEmpty(recipe.getRecipeFee())) {
for (Recipe rxItem : rxList) {
recipeId = rxItem.getRecipeId();
if (ObjectUtils.isEmpty(recipeId) || ObjectUtils.isEmpty(rxItem.getRecipeFee())) {
continue;
}
recipeIds = new ArrayList<>();
recipeIds.add(recipe.getRecipeId());
recipeIds.add(rxItem.getRecipeId());
response = HisRecipeDao.prepay(
response = HisRecipeDao.rxPrepay(
merchantEnum,
patientId,
treatNum,
recipeIds,
recipe.getRecipeFee().toString(),
rxItem.getRecipeFee().toString(),
curDate,
curTime,
"app",
MerchantEnum.WX);
null);
log.info("[处方]HIS预结算 resp={}", response);
if (response.success()) {
feeId = response.getDataMapString("FeeID");
feeInfo = response.getDataMapString("FeeInfo");
log.info("[处方]预结算成功 treatNum={}, recipeId={}, feeId={}, feeInfo={}", treatNum, recipeId, feeId, feeInfo);
log.info("[处方]HIS预结算成功 treatNum={}, recipeId={}, feeId={}, feeInfo={}", treatNum, recipeId, feeId, feeInfo);
if (feeId != null && feeInfo != null) {
addInfo = new Recipe();
@ -208,6 +207,8 @@ public class RxService {
addInfo.setFeeInfo(feeInfo);
respList.add(addInfo);
}
} else {
log.error("[处方]HIS预结算失败: {}", JsonHelper.toJsonString(response));
}
}
return respList;
@ -288,7 +289,6 @@ public class RxService {
public boolean hisRxListPay(MerchantEnum merchantEnum, String totalFee, String openid, String outTradeNo, String bankTransNo, String bankMerchantNo, String payDate, String payTime, String payInfo) {
RxDao rxDao = new RxDao();
// 此处判断是否已经发起缴费,只要已存在数据库记录,说明已经发起了缴费请求,不能根据已经缴费成功,才取消本次缴费请求,因为请求可能已经延时,本次请求可能是重复提交的请求
if (PayService.hasUserOrderNo(outTradeNo, openid)) {
log.info("{} [处方]已发起缴费 outTradeNo={}", merchantEnum.NAME, outTradeNo);
@ -363,7 +363,7 @@ public class RxService {
}
if (MerchantEnum.JY.equals(merchantEnum)) {
new MicroService().uploadRxFee(rxList, failedList.isEmpty(), new BigDecimal(totalFee), false);
new MicroService().uploadRxFee(rxList, outTradeNo, failedList.isEmpty(), new BigDecimal(totalFee), false);
return true;
}
@ -394,11 +394,10 @@ public class RxService {
String tip = String.format("共计缴费处方单数:%s,失败数:%s,超时数:%s", rxList.size(), (failedList.size() - outTimeList.size()), outTimeList.size());
log.info("{} [处方]{}", merchantEnum.NAME, tip);
if (WeChatConfig.APP_ID.equals(HospConfigEnum.红河州第一人民医院.WX_APP_ID)) {
if (HospConfigEnum.红河州第一人民医院.isWxHospEnum()) {
TZReserveConfig.reserveRun(patientId); // 天助医技预约
}
new HealthUploadService().rxReportHISData(merchantEnum, openid, patientId);
return true;
}

@ -156,25 +156,30 @@ public class JYPayHelper {
/**
* 支付状态查询
*
* @return 成功返回 json, 否则返回null
* @param outTradeNo 商户订单号
* @param bizTradeNo 业务订单号-用于向第三方下单
* @param tradeNo 交易流水号
* @return 订单信息
*/
public static JSONObject queryPayOrderInfo(String outTradeNo, String merOrderNum, String tradeNo) {
public static Order queryPayOrderInfo(String outTradeNo, String bizTradeNo, String tradeNo) {
Order order = new Order();
try {
log.info("【京硕】支付状态查询 {},{},{}", outTradeNo, merOrderNum, tradeNo);
if (ObjectUtils.isEmpty(outTradeNo) && ObjectUtils.isEmpty(merOrderNum) && ObjectUtils.isEmpty(tradeNo)) {
return null;
log.info("【京硕】支付状态查询 {},{},{}", outTradeNo, bizTradeNo, tradeNo);
if (ObjectUtils.isEmpty(outTradeNo) && ObjectUtils.isEmpty(bizTradeNo) && ObjectUtils.isEmpty(tradeNo)) {
order.setErrorMsg("请求参数缺失");
return order;
}
Map<String, String> params = new HashMap<>();
params.put("applicationId", JYPayConfig.APPLICATION_ID);
params.put("merchantId", JYPayConfig.MERCHANT_ID);
params.put("orderId", outTradeNo); // 支付平台订单号
params.put("merOrderNum", merOrderNum); // 应用方订单号
params.put("merOrderNum", bizTradeNo); // 应用方订单号
params.put("outTransNo", tradeNo); // 应用流水号:应用流水号outTransNo”和“支付平台订单号orderId”这两个参数必须同时传。该参数指“应用方流水号”,不许有重复
String signValue = createSign(params);
if (signValue == null) {
return null;
return order;
}
params.put("signValue", signValue); // 应用流水号:应用流水号outTransNo”和“支付平台订单号orderId”这两个参数必须同时传。该参数指“应用方流水号”,不许有重复
@ -183,16 +188,41 @@ public class JYPayHelper {
log.info("【京硕】支付状态查询-响应-{}", JsonHelper.toJsonString(result));
if (!result.isSuccess()) {
log.error("【京硕】支付状态查询-失败:{}", result.getMessage());
return null;
order.setErrorMsg(result.getMessage());
return order;
}
JSONObject data = result.getData();
if (data == null) {
order.setErrorMsg("接口响应数据为空");
return order;
}
order.setSuccess(true);
order.setOpenid(data.getString("openId"));
order.setBizTradeNo(data.getString("merOrderNum"));
order.setOutTradeNo(data.getString("orderId"));
order.setBankTransNo(data.getString("finalTransNo"));
BigDecimal orderAmt = data.getBigDecimal("orderAmt");
String refundTime = data.getString("refundTime");
BigDecimal refundAmt = data.getBigDecimal("refundAmt");
if (refundTime != null && refundAmt != null) {
order.setRefund(true);
order.setRefundTime(dateFormat(refundTime));
order.setRefundMoney(refundAmt.movePointLeft(2));
}
if (orderAmt != null) {
order.setTotalFee(orderAmt.movePointLeft(2));
}
return result.getData();
} catch (Exception e) {
log.error("【京硕】支付状态查询-异常:", e);
}
return null;
return order;
}
public static String dateFormat(String dateStr) {
return DateHelper.dateFormatDate(dateStr, DateHelper.DateEnum.yyyyMMddHHmmss, DateHelper.DateEnum.yyyy_MM_dd_HH_mm_ss);
}
/**
* 退款申请
*

@ -30,6 +30,11 @@ public enum HospConfigEnum {
this.ALI_APP_ID = ALI_APP_ID;
}
public boolean isWxHospEnum() {
return WeChatConfig.APP_ID.equals(this.WX_APP_ID);
}
public static HospConfigEnum findEnumByWxAppId() {
return findEnumByWxAppId(WeChatConfig.APP_ID);
}

@ -175,9 +175,9 @@ public class WxMedHelper {
body,
attach);
log.info("[医保]创建订单 {}", order);
log.info("[医保]创建订单 {}", JsonHelper.toJsonString(order));
if (order == null) {
throw new ServiceException("[医保]请求失败");
throw new ServiceException("[医保]创建订单请求失败");
}
if (!order.isOk()) {
@ -188,7 +188,7 @@ public class WxMedHelper {
if (payUrl == null) {
throw new ServiceException("[医保]下单链接为空");
}
log.info("[医保]下单url payUrl={}", payUrl);
log.info("[医保]下单返回链接 pay_url: {}", payUrl);
map.put("payUrl", payUrl);
map.put("bankTransNo", order.getMedTransId());
return map;

@ -37,7 +37,7 @@ public class MedRespHelper {
map.put("sign", WxSignHelper.generateSign(map, WxSignHelper.SIGN_TYPE_MD5, mdPayKey));
return XmlHelper.mapToXml(map);
} catch (Exception e) {
e.printStackTrace();
log.error("", e);
}
return null;
}

Loading…
Cancel
Save