|
|
|
@ -16,10 +16,13 @@ import com.ynxbd.common.result.ResultEnum; |
|
|
|
|
import com.ynxbd.common.result.ServiceException; |
|
|
|
|
import com.ynxbd.wx.config.WeChatConfig; |
|
|
|
|
import com.ynxbd.wx.wxfactory.WxMedicalHelper; |
|
|
|
|
import com.ynxbd.wx.wxfactory.WxPayHelper; |
|
|
|
|
import com.ynxbd.wx.wxfactory.bean.MedicalInfo; |
|
|
|
|
import com.ynxbd.wx.wxfactory.bean.MedicalOrder; |
|
|
|
|
import com.ynxbd.wx.wxfactory.bean.MedicalUserInfo; |
|
|
|
|
import com.ynxbd.wx.wxfactory.bean.OrderTypeEnum; |
|
|
|
|
import com.ynxbd.wx.wxfactory.medical.MdConfig; |
|
|
|
|
import com.ynxbd.wx.wxfactory.medical.enums.MdRefundTypeEnum; |
|
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
|
|
|
|
|
|
import java.math.BigDecimal; |
|
|
|
@ -61,13 +64,13 @@ public class MedicalService { |
|
|
|
|
* @param recipeJson 处方json |
|
|
|
|
* @param totalFee 订单金额 |
|
|
|
|
*/ |
|
|
|
|
public static MedicalInfo recipeMdUploadFeeDetails(String qrCode, String openid, String patientId, String cardNo, String realName, String treatNum, String recipeJson, BigDecimal totalFee,String ybAttrib,String ybBZCode, String ybBZName) throws ServiceException { |
|
|
|
|
public static MedicalInfo recipeMdUploadFeeDetails(String qrCode, String openid, String patientId, String cardNo, String realName, String treatNum, String recipeJson, BigDecimal totalFee, String ybAttrib, String ybBZCode, String ybBZName) throws ServiceException { |
|
|
|
|
MedicalUserInfo userInfo = WxMedicalHelper.getUserInfo(openid, qrCode, cardNo, realName); |
|
|
|
|
|
|
|
|
|
String payAuthNo = userInfo.getPayAuthNo(); |
|
|
|
|
|
|
|
|
|
log.info("[医保]上传明细:patientId={}, totalFee={}, cardNo={}, recipeJson={}", patientId, totalFee, cardNo, recipeJson); |
|
|
|
|
JsonResult result = HisMedicalDao.recipeMdUploadFeeDetails(payAuthNo, cardNo, openid, patientId, treatNum, recipeJson, totalFee,ybAttrib,ybBZCode,ybBZName); |
|
|
|
|
JsonResult result = HisMedicalDao.recipeMdUploadFeeDetails(payAuthNo, cardNo, openid, patientId, treatNum, recipeJson, totalFee, ybAttrib, ybBZCode, ybBZName); |
|
|
|
|
return mdPlaceOrder(payAuthNo, result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -294,7 +297,7 @@ public class MedicalService { |
|
|
|
|
*/ |
|
|
|
|
public static boolean regPay(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); |
|
|
|
|
log.info("[医保][挂号]HIS结算参数缺失 outTradeNo={}, bankTransNo={}, payDate={}, payTime={}", outTradeNo, bankTransNo, payDate, payTime); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
RegisterDao regDao = new RegisterDao(); |
|
|
|
@ -306,12 +309,12 @@ public class MedicalService { |
|
|
|
|
Integer hisStatus = reg.getHisStatus(); |
|
|
|
|
Integer payStatus = reg.getPayStatus(); |
|
|
|
|
if (payStatus == null || hisStatus == null || payStatus == 0 || hisStatus == 0) { // 状态不明确
|
|
|
|
|
log.info("{} [挂号]订单已支付 outTradeNo={}, bankTransNo={}", merchantEnum.NAME, outTradeNo, bankTransNo); |
|
|
|
|
log.info("{}[医保][挂号]订单已支付 outTradeNo={}, bankTransNo={}", merchantEnum.NAME, outTradeNo, bankTransNo); |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!regDao.updateMerPaidByOutTradeNo(outTradeNo, payDate, payTime, bankTransNo)) { |
|
|
|
|
log.info("【医保】[挂号]修改订单支付状态 outTradeNo={}, bankTransNo={}", outTradeNo, bankTransNo); |
|
|
|
|
log.info("[医保][挂号]修改订单支付状态 outTradeNo={}, bankTransNo={}", outTradeNo, bankTransNo); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -325,7 +328,7 @@ public class MedicalService { |
|
|
|
|
BigDecimal cashFee = reg.getPayMoney(); // 现金
|
|
|
|
|
BigDecimal acctFee = reg.getAcctFee(); // 个账
|
|
|
|
|
if (mdUserId == null || tradeNo == null || chrgBchno == null || cashFee == null || acctFee == null) { |
|
|
|
|
log.info("【医保】[挂号]HIS结算参数缺失 outTradeNo={}, bankTransNo={}, tradeNo={}, mdUserId={}, chrgBchno={}", outTradeNo, bankTransNo, tradeNo, mdUserId, chrgBchno); |
|
|
|
|
log.info("[医保][挂号]HIS结算参数缺失 outTradeNo={}, bankTransNo={}, tradeNo={}, mdUserId={}, chrgBchno={}", outTradeNo, bankTransNo, tradeNo, mdUserId, chrgBchno); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -333,23 +336,40 @@ public class MedicalService { |
|
|
|
|
if (!jsonResult.success()) { |
|
|
|
|
String respCode = jsonResult.getCode(); |
|
|
|
|
String respMessage = jsonResult.getMessage(); |
|
|
|
|
log.info("【医保】HIS结算失败 outTradeNo={}, bankTransNo={}, respCode={}, respMessage={}", outTradeNo, bankTransNo, respCode, respMessage); |
|
|
|
|
log.info("[医保][挂号]HIS结算失败 outTradeNo={}, bankTransNo={}, respCode={}, respMessage={}", outTradeNo, bankTransNo, respCode, respMessage); |
|
|
|
|
|
|
|
|
|
if (!regDao.updateHisPaidFailByOutTradeNo(outTradeNo, respCode, respMessage)) { |
|
|
|
|
log.info("【医保】[处方]更新HIS缴费失败信息异常 outTradeNo={}, code={}, message={}", outTradeNo, respCode, respMessage); |
|
|
|
|
log.info("[医保][挂号]更新HIS缴费失败信息异常 outTradeNo={}, code={}, message={}", outTradeNo, respCode, respMessage); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (jsonResult.isTimeout()) { // 调用超时-不退费
|
|
|
|
|
log.info("【医保】HIS结算调用超时 outTradeNo={}, bankTransNo={}, tradeNo={}, mdUserId={}", outTradeNo, bankTransNo, tradeNo, mdUserId); |
|
|
|
|
log.info("[医保][挂号]HIS结算调用超时 outTradeNo={}, bankTransNo={}, tradeNo={}, mdUserId={}", outTradeNo, bankTransNo, tradeNo, mdUserId); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
if (MdConfig.IS_AUTO_REFUND) { |
|
|
|
|
log.info("[医保][挂号]现金自动退费功能未开启 outTradeNo={}, bankTransNo={}, tradeNo={}", outTradeNo, bankTransNo, tradeNo); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 微信医保自动退费
|
|
|
|
|
MedicalOrder order = WxMedicalHelper.refundCash(outTradeNo, ("R" + tradeNo), tradeNo, cashFee, "系统繁忙缴费失败,自动退费"); |
|
|
|
|
boolean isOk = order.isOk(); |
|
|
|
|
log.info("【微信】[医保][挂号]现金自动退费{} outTradeNo={}, bankTransNo={}, tradeNo={}", (isOk ? "成功" : "失败"), outTradeNo, bankTransNo, tradeNo); |
|
|
|
|
if (isOk) { |
|
|
|
|
String refundResult = order.isOk() ? WxPayHelper.OK : order.getMessage(); |
|
|
|
|
if (!regDao.updateRefundByTradeNo(tradeNo, refundResult)) { |
|
|
|
|
log.info("【微信】[医保][挂号]现金自动退费 修改数据库状态失败 tradeNo={}, refundResult={}", tradeNo, refundResult); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
log.info("【微信】[医保][挂号]现金自动退费 失败:{}", order.getMessage()); |
|
|
|
|
} |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
log.info("【医保】HIS结算成功 outTradeNo={}, bankTransNo={}", outTradeNo, bankTransNo); |
|
|
|
|
log.info("[医保][挂号]HIS结算成功 outTradeNo={}, bankTransNo={}", outTradeNo, bankTransNo); |
|
|
|
|
// 成功处理
|
|
|
|
|
if (!regDao.updateHisPaidByOutTradeNo(outTradeNo)) { |
|
|
|
|
log.error("【医保】挂号修改成功数据失败"); |
|
|
|
|
log.error("[医保][挂号]修改成功数据失败"); |
|
|
|
|
} |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
@ -368,14 +388,14 @@ public class MedicalService { |
|
|
|
|
*/ |
|
|
|
|
public static boolean recipePay(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); |
|
|
|
|
log.info("[医保][处方]HIS结算参数缺失 outTradeNo={}, bankTransNo={}, payDate={}, payTime={}", outTradeNo, bankTransNo, payDate, payTime); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
RecipeDao recipeDao = new RecipeDao(); |
|
|
|
|
|
|
|
|
|
// 此处判断是否已经发起缴费,只要已存在数据库记录,说明已经发起了缴费请求,不能根据已经缴费成功,才取消本次缴费请求,因为请求可能已经延时,本次请求可能是重复提交的请求
|
|
|
|
|
if (PayService.hasUserOrderNo(outTradeNo, openid)) { |
|
|
|
|
log.info("{}[处方]已发起缴费 outTradeNo={}", merchantEnum.NAME, outTradeNo); |
|
|
|
|
log.info("{}[医保][处方]已发起缴费 outTradeNo={}", merchantEnum.NAME, outTradeNo); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -385,7 +405,7 @@ public class MedicalService { |
|
|
|
|
|
|
|
|
|
Recipe recipe = recipeDao.selectOneByOutTradeNo(outTradeNo); |
|
|
|
|
if (recipe == null) { |
|
|
|
|
log.info("【医保】数据库中未查询到订单信息 outTradeNo={}, bankTransNo={}", outTradeNo, bankTransNo); |
|
|
|
|
log.info("[医保][处方]数据库中未查询到订单信息 outTradeNo={}, bankTransNo={}", outTradeNo, bankTransNo); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -395,18 +415,18 @@ public class MedicalService { |
|
|
|
|
BigDecimal cashFee = recipe.getPayMoney(); // 现金
|
|
|
|
|
BigDecimal acctFee = recipe.getAcctFee(); // 个账
|
|
|
|
|
if (mdUserId == null || tradeNo == null || chrgBchno == null || cashFee == null || acctFee == null) { |
|
|
|
|
log.info("【医保】HIS结算参数缺失 outTradeNo={}, bankTransNo={}, tradeNo={}, mdUserId={}, chrgBchno={}", outTradeNo, bankTransNo, tradeNo, mdUserId, chrgBchno); |
|
|
|
|
log.info("[医保][处方]HIS结算参数缺失 outTradeNo={}, bankTransNo={}, tradeNo={}, mdUserId={}, chrgBchno={}", outTradeNo, bankTransNo, tradeNo, mdUserId, chrgBchno); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Integer hisStatus = recipe.getHisStatus(); |
|
|
|
|
if (hisStatus != null && hisStatus == 0) { |
|
|
|
|
log.info("{} [处方]已交过费, 结束本次缴费流程:outTradeNo={}, bankTransNo={}", merchantEnum.NAME, outTradeNo, bankTransNo); |
|
|
|
|
log.info("{} [医保][处方]已交过费, 结束本次缴费流程:outTradeNo={}, bankTransNo={}", merchantEnum.NAME, outTradeNo, bankTransNo); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (recipeDao.updateMerPaidByTradeNo(tradeNo, bankTransNo)) { |
|
|
|
|
log.info("{} [处方]更新商户信息成功 outTradeNo={}, bankTransNo={}", merchantEnum.NAME, outTradeNo, bankTransNo); |
|
|
|
|
log.info("{} [医保][处方]更新商户信息成功 outTradeNo={}, bankTransNo={}", merchantEnum.NAME, outTradeNo, bankTransNo); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
JsonResult jsonResult = HisMedicalDao.mdPay(mdUserId, payDate, payTime, tradeNo, bankTransNo, cashFee); |
|
|
|
@ -414,26 +434,44 @@ public class MedicalService { |
|
|
|
|
if (!jsonResult.success()) { |
|
|
|
|
String respCode = jsonResult.getCode(); |
|
|
|
|
String respMessage = jsonResult.getMessage(); |
|
|
|
|
log.info("【医保】HIS结算失败 outTradeNo={}, bankTransNo={}, respCode={}, respMessage={}", outTradeNo, bankTransNo, respCode, respMessage); |
|
|
|
|
log.info("[医保][处方]HIS结算失败 outTradeNo={}, bankTransNo={}, respCode={}, respMessage={}", outTradeNo, bankTransNo, respCode, respMessage); |
|
|
|
|
|
|
|
|
|
if (!recipeDao.updateHisPaidFailByTradeNo(tradeNo, respCode, respMessage)) { |
|
|
|
|
log.info("【医保】[处方]更新HIS缴费失败信息失败 tradeNo={}, code={}, message={}", tradeNo, respCode, respMessage); |
|
|
|
|
log.info("[医保][处方]更新HIS缴费失败信息失败 tradeNo={}, code={}, message={}", tradeNo, respCode, respMessage); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (jsonResult.isTimeout()) { // 调用超时-不退费
|
|
|
|
|
log.info("【医保】HIS结算调用超时-不退费 outTradeNo={}, bankTransNo={}, tradeNo={}, mdUserId={}", outTradeNo, bankTransNo, tradeNo, mdUserId); |
|
|
|
|
log.info("[医保][处方]HIS结算调用超时-不退费 outTradeNo={}, bankTransNo={}, tradeNo={}, mdUserId={}", outTradeNo, bankTransNo, tradeNo, mdUserId); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (MdConfig.IS_AUTO_REFUND) { |
|
|
|
|
log.info("[医保][处方][现金自动退费]功能未开启 outTradeNo={}, bankTransNo={}, tradeNo={}", outTradeNo, bankTransNo, tradeNo); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 微信医保自动退费
|
|
|
|
|
MedicalOrder order = WxMedicalHelper.refundCash(outTradeNo, ("R" + tradeNo), tradeNo, cashFee, "系统繁忙缴费失败,自动退费"); |
|
|
|
|
boolean isOk = order.isOk(); |
|
|
|
|
log.info("【微信】[医保][处方]现金自动退费 {} outTradeNo={}, bankTransNo={}, tradeNo={}", (isOk ? "成功" : "失败"), outTradeNo, bankTransNo, tradeNo); |
|
|
|
|
if (isOk) { |
|
|
|
|
String refundResult = order.isOk() ? WxPayHelper.OK : order.getMessage(); |
|
|
|
|
if (!recipeDao.updateRefundByTradeNo(tradeNo, refundResult)) { |
|
|
|
|
log.info("[医保][处方]现金自动退费 修改数据库状态失败 tradeNo={}, refundResult={}", tradeNo, refundResult); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
log.info("【微信】[医保][处方]现金自动退费 失败:{}", order.getMessage()); |
|
|
|
|
} |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
String hisTransNo = jsonResult.getDataMapString("HISTransNo"); |
|
|
|
|
String invoiceTransNo = jsonResult.getDataMapString("InvoiceTransNo"); |
|
|
|
|
|
|
|
|
|
log.info("【医保】HIS结算成功 outTradeNo={}, bankTransNo={}, hisTransNo={}, invoiceTransNo={}", outTradeNo, bankTransNo, hisTransNo, invoiceTransNo); |
|
|
|
|
log.info("[医保][处方]HIS结算成功 outTradeNo={}, bankTransNo={}, hisTransNo={}, invoiceTransNo={}", outTradeNo, bankTransNo, hisTransNo, invoiceTransNo); |
|
|
|
|
// 成功处理
|
|
|
|
|
if (!recipeDao.updateHisPaidByTradeNo(tradeNo, hisTransNo, invoiceTransNo)) { |
|
|
|
|
log.error("【医保】修改成功数据失败"); |
|
|
|
|
log.error("[医保][处方]修改成功数据失败"); |
|
|
|
|
} |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|