From 113196cada80d163e044ed766431068101de8608 Mon Sep 17 00:00:00 2001 From: wangsq Date: Fri, 9 Oct 2026 20:46:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=92=E8=81=94=E7=BD=91=E5=A4=84=E6=96=B9?= =?UTF-8?q?=E7=BC=B4=E8=B4=B9=E8=BF=87=E6=BB=A4=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ynxbd/common/TestA.java | 14 +++-- .../com/ynxbd/common/action/RecipeAction.java | 52 ++++++++++--------- .../ynxbd/common/action/pay/JYPayAction.java | 13 ++--- .../ynxbd/common/action/pay/PayAction.java | 6 +-- .../ynxbd/common/bean/enums/MerchantEnum.java | 8 +-- .../java/com/ynxbd/common/bean/pay/Order.java | 2 + .../com/ynxbd/common/bean/pay/Recipe.java | 5 ++ .../ynxbd/common/dao/his/HisRecipeDao.java | 31 ++++++----- .../com/ynxbd/common/dao/lis/RMLisDao.java | 4 +- .../common/helper/common/DateHelper.java | 25 ++++++++- .../java/com/ynxbd/common/his/HisEnum.java | 2 +- .../ynxbd/common/service/MicroService.java | 14 +++-- .../com/ynxbd/common/service/PayService.java | 16 +++--- .../com/ynxbd/common/service/RxService.java | 39 +++++++------- .../java/com/ynxbd/jy/helper/JYPayHelper.java | 50 ++++++++++++++---- .../com/ynxbd/wx/config/HospConfigEnum.java | 5 ++ .../com/ynxbd/wx/wxfactory/WxMedHelper.java | 6 +-- .../medical/models/MedRespHelper.java | 2 +- 18 files changed, 187 insertions(+), 107 deletions(-) diff --git a/src/main/java/com/ynxbd/common/TestA.java b/src/main/java/com/ynxbd/common/TestA.java index 3f4536d..4303c03 100644 --- a/src/main/java/com/ynxbd/common/TestA.java +++ b/src/main/java/com/ynxbd/common/TestA.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")); } diff --git a/src/main/java/com/ynxbd/common/action/RecipeAction.java b/src/main/java/com/ynxbd/common/action/RecipeAction.java index 236c7e2..52d06f7 100644 --- a/src/main/java/com/ynxbd/common/action/RecipeAction.java +++ b/src/main/java/com/ynxbd/common/action/RecipeAction.java @@ -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 hisRecipes = new HisRecipeDao().getRxUnPay(null, patientId, personNo, days); + + List 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 hisRecipes = new HisRecipeDao().getRxUnPay(null, patientId, personNo, days); - - List 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); diff --git a/src/main/java/com/ynxbd/common/action/pay/JYPayAction.java b/src/main/java/com/ynxbd/common/action/pay/JYPayAction.java index bcd3c59..e091677 100644 --- a/src/main/java/com/ynxbd/common/action/pay/JYPayAction.java +++ b/src/main/java/com/ynxbd/common/action/pay/JYPayAction.java @@ -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); } diff --git a/src/main/java/com/ynxbd/common/action/pay/PayAction.java b/src/main/java/com/ynxbd/common/action/pay/PayAction.java index fa2a3f5..092facb 100644 --- a/src/main/java/com/ynxbd/common/action/pay/PayAction.java +++ b/src/main/java/com/ynxbd/common/action/pay/PayAction.java @@ -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 rxList = rxService.hisRxPrepay(recipeJson, patientId, treatNum); + List 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); diff --git a/src/main/java/com/ynxbd/common/bean/enums/MerchantEnum.java b/src/main/java/com/ynxbd/common/bean/enums/MerchantEnum.java index c7e7791..7b09eaf 100644 --- a/src/main/java/com/ynxbd/common/bean/enums/MerchantEnum.java +++ b/src/main/java/com/ynxbd/common/bean/enums/MerchantEnum.java @@ -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; diff --git a/src/main/java/com/ynxbd/common/bean/pay/Order.java b/src/main/java/com/ynxbd/common/bean/pay/Order.java index f603757..50ff888 100644 --- a/src/main/java/com/ynxbd/common/bean/pay/Order.java +++ b/src/main/java/com/ynxbd/common/bean/pay/Order.java @@ -107,6 +107,8 @@ public class Order implements Serializable { private String invoiceTransNo; // 退款金额 private BigDecimal refundMoney; + // 退费时间 + private String refundTime; // 退款类型 private String refundType; // 退款结果描述 diff --git a/src/main/java/com/ynxbd/common/bean/pay/Recipe.java b/src/main/java/com/ynxbd/common/bean/pay/Recipe.java index 8ba90d2..0958330 100644 --- a/src/main/java/com/ynxbd/common/bean/pay/Recipe.java +++ b/src/main/java/com/ynxbd/common/bean/pay/Recipe.java @@ -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); + } } diff --git a/src/main/java/com/ynxbd/common/dao/his/HisRecipeDao.java b/src/main/java/com/ynxbd/common/dao/his/HisRecipeDao.java index a138694..44d0901 100644 --- a/src/main/java/com/ynxbd/common/dao/his/HisRecipeDao.java +++ b/src/main/java/com/ynxbd/common/dao/his/HisRecipeDao.java @@ -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 recipeIds, String payMoney, - String payDate, String payTime, String payDeviceId, MerchantEnum merchantEnum) { + public static JsonResult rxPrepay(MerchantEnum merchantEnum, String patientId, String treatNum, List recipeIds, String payMoney, + String payDate, String payTime, String payDeviceId) { StringBuilder recipeIdsXml = new StringBuilder(); for (String id : recipeIds) { recipeIdsXml.append("").append(id).append(""); } + 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); } diff --git a/src/main/java/com/ynxbd/common/dao/lis/RMLisDao.java b/src/main/java/com/ynxbd/common/dao/lis/RMLisDao.java index 05b0d54..20f6633 100644 --- a/src/main/java/com/ynxbd/common/dao/lis/RMLisDao.java +++ b/src/main/java/com/ynxbd/common/dao/lis/RMLisDao.java @@ -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()); diff --git a/src/main/java/com/ynxbd/common/helper/common/DateHelper.java b/src/main/java/com/ynxbd/common/helper/common/DateHelper.java index b3713fd..784f5c3 100644 --- a/src/main/java/com/ynxbd/common/helper/common/DateHelper.java +++ b/src/main/java/com/ynxbd/common/helper/common/DateHelper.java @@ -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(); diff --git a/src/main/java/com/ynxbd/common/his/HisEnum.java b/src/main/java/com/ynxbd/common/his/HisEnum.java index 906ef7e..1ca733e 100644 --- a/src/main/java/com/ynxbd/common/his/HisEnum.java +++ b/src/main/java/com/ynxbd/common/his/HisEnum.java @@ -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), diff --git a/src/main/java/com/ynxbd/common/service/MicroService.java b/src/main/java/com/ynxbd/common/service/MicroService.java index 2d0bcc3..ef57a8c 100644 --- a/src/main/java/com/ynxbd/common/service/MicroService.java +++ b/src/main/java/com/ynxbd/common/service/MicroService.java @@ -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 rxList, boolean isNotFailRx, BigDecimal totalFee, boolean isMedIns) { + public void uploadRxFee(List 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 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))); }); diff --git a/src/main/java/com/ynxbd/common/service/PayService.java b/src/main/java/com/ynxbd/common/service/PayService.java index d734fea..e71c509 100644 --- a/src/main/java/com/ynxbd/common/service/PayService.java +++ b/src/main/java/com/ynxbd/common/service/PayService.java @@ -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("支付方式不存在"); diff --git a/src/main/java/com/ynxbd/common/service/RxService.java b/src/main/java/com/ynxbd/common/service/RxService.java index 0bf2da7..ee30ad5 100644 --- a/src/main/java/com/ynxbd/common/service/RxService.java +++ b/src/main/java/com/ynxbd/common/service/RxService.java @@ -154,19 +154,19 @@ public class RxService { /** - * 处方订单信息预存 + * [处方]HIS预结算 * * @param recipeJson 处方单json数据 * @param patientId 患者id * @param treatNum 门诊号 * @return 是否完成操作 */ - public List hisRxPrepay(String recipeJson, String patientId, String treatNum) { - log.info("[处方]预结算 patientId={}, treatNum={}, recipeJson={}", patientId, treatNum, recipeJson); + public List hisRxPrepay(MerchantEnum merchantEnum, String recipeJson, String patientId, String treatNum) { + log.info("[处方]HIS预结算开始... patientId={}, treatNum={}, recipeJson={}", patientId, treatNum, recipeJson); List respList = new ArrayList<>(); - List recipeList = JsonHelper.parseArray(recipeJson, Recipe.class); - if (recipeList == null || recipeList.isEmpty()) { - log.info("[处方]预结算勾选处方数量为0 或 数据转换失败"); + List 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; } diff --git a/src/main/java/com/ynxbd/jy/helper/JYPayHelper.java b/src/main/java/com/ynxbd/jy/helper/JYPayHelper.java index 1514f6c..f88990a 100644 --- a/src/main/java/com/ynxbd/jy/helper/JYPayHelper.java +++ b/src/main/java/com/ynxbd/jy/helper/JYPayHelper.java @@ -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 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); + } + /** * 退款申请 * diff --git a/src/main/java/com/ynxbd/wx/config/HospConfigEnum.java b/src/main/java/com/ynxbd/wx/config/HospConfigEnum.java index 8eafb07..497e021 100644 --- a/src/main/java/com/ynxbd/wx/config/HospConfigEnum.java +++ b/src/main/java/com/ynxbd/wx/config/HospConfigEnum.java @@ -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); } diff --git a/src/main/java/com/ynxbd/wx/wxfactory/WxMedHelper.java b/src/main/java/com/ynxbd/wx/wxfactory/WxMedHelper.java index 30c4d66..a151e05 100644 --- a/src/main/java/com/ynxbd/wx/wxfactory/WxMedHelper.java +++ b/src/main/java/com/ynxbd/wx/wxfactory/WxMedHelper.java @@ -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; diff --git a/src/main/java/com/ynxbd/wx/wxfactory/medical/models/MedRespHelper.java b/src/main/java/com/ynxbd/wx/wxfactory/medical/models/MedRespHelper.java index 833d3c9..c634136 100644 --- a/src/main/java/com/ynxbd/wx/wxfactory/medical/models/MedRespHelper.java +++ b/src/main/java/com/ynxbd/wx/wxfactory/medical/models/MedRespHelper.java @@ -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; }