|
|
|
@ -5,10 +5,7 @@ import com.ynxbd.ali.config.AliMIConfig; |
|
|
|
|
import com.ynxbd.ali.helper.AliMedicalHelper; |
|
|
|
|
import com.ynxbd.common.action.pay.PEnum; |
|
|
|
|
import com.ynxbd.common.bean.enums.MerchantEnum; |
|
|
|
|
import com.ynxbd.common.bean.pay.ApiResult; |
|
|
|
|
import com.ynxbd.common.bean.pay.Order; |
|
|
|
|
import com.ynxbd.common.bean.pay.Recipe; |
|
|
|
|
import com.ynxbd.common.bean.pay.Register; |
|
|
|
|
import com.ynxbd.common.bean.pay.*; |
|
|
|
|
import com.ynxbd.common.dao.RecipeDao; |
|
|
|
|
import com.ynxbd.common.dao.RegisterDao; |
|
|
|
|
import com.ynxbd.common.dao.his.HisMIDao; |
|
|
|
@ -50,7 +47,7 @@ public class MedicalService { |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case REG: // 挂号
|
|
|
|
|
regPayNotify(merchantEnum, outTradeNo, bankTransNo, payDate, payTime, openid, payInfo); |
|
|
|
|
regPaidNotify(merchantEnum, outTradeNo, bankTransNo, payDate, payTime, openid, payInfo); |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case IN_HOSP: |
|
|
|
@ -185,11 +182,13 @@ public class MedicalService { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 创建医保订单
|
|
|
|
|
private Map<String, Object> createMIOrder(MerchantEnum merchantEnum, OrderMIEnum orderMIEnum, String orderTitle, String openid, String outTradeNo, String cardNo, String realName, String ip, String payOrdId, String payAuthNo, String chrgBchno, |
|
|
|
|
private MICreateOrder createMIOrder(MerchantEnum merchantEnum, OrderMIEnum orderMIEnum, boolean hasDBOrder, String orderTitle, String openid, String outTradeNo, String cardNo, String realName, String ip, String payOrdId, String payAuthNo, String chrgBchno, |
|
|
|
|
BigDecimal totalFee, BigDecimal insuranceFee, BigDecimal cashFee, String notifyType, |
|
|
|
|
String familyType, String familyName, String familyCardNo, String medicalCardInstId, String medicalCardId) throws ServiceException { |
|
|
|
|
MICreateOrder miCreateOrder = new MICreateOrder(); |
|
|
|
|
|
|
|
|
|
if (MerchantEnum.WX_MEDICAL.equals(merchantEnum)) { |
|
|
|
|
return WxMedicalHelper.createOrder(orderMIEnum, |
|
|
|
|
Map<String, Object> map = WxMedicalHelper.createOrder(orderMIEnum, |
|
|
|
|
openid, |
|
|
|
|
outTradeNo, |
|
|
|
|
chrgBchno, |
|
|
|
@ -208,16 +207,20 @@ public class MedicalService { |
|
|
|
|
familyType, |
|
|
|
|
familyName, |
|
|
|
|
familyCardNo); |
|
|
|
|
miCreateOrder.setIsHasMerOrder(null); |
|
|
|
|
miCreateOrder.setMap(map); |
|
|
|
|
|
|
|
|
|
} else if (MerchantEnum.ALI_MEDICAL.equals(merchantEnum)) { |
|
|
|
|
if (ObjectUtils.isEmpty(medicalCardId)) { |
|
|
|
|
throw new ServiceException("【支付宝】医保授权码medicalCardId为空"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Order order = hasDBOrder ? AliMedicalHelper.queryTrade(outTradeNo, null) : new Order(); |
|
|
|
|
String notifyUrl = WeChatConfig.getHttpsBaseUrl() + merchantEnum.getNotifyUrl(outTradeNo, notifyType); |
|
|
|
|
return AliMedicalHelper.createOrder(orderMIEnum, |
|
|
|
|
Map<String, Object> map = AliMedicalHelper.createOrder(orderMIEnum, |
|
|
|
|
openid, |
|
|
|
|
outTradeNo, |
|
|
|
|
chrgBchno, |
|
|
|
|
payOrdId, |
|
|
|
|
payAuthNo, |
|
|
|
|
totalFee, |
|
|
|
@ -230,10 +233,15 @@ public class MedicalService { |
|
|
|
|
familyCardNo, |
|
|
|
|
medicalCardInstId, |
|
|
|
|
medicalCardId); |
|
|
|
|
|
|
|
|
|
miCreateOrder.setIsHasMerOrder(order.hasTradeState()); |
|
|
|
|
miCreateOrder.setMap(map); |
|
|
|
|
return miCreateOrder; |
|
|
|
|
} |
|
|
|
|
return null; |
|
|
|
|
return miCreateOrder; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* [医保]处方下单 |
|
|
|
|
*/ |
|
|
|
@ -262,22 +270,32 @@ public class MedicalService { |
|
|
|
|
return Result.error(ResultEnum.PAY_PREPAY_SAVE_ERROR); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
log.info("[医保][处方]下单 openid={}, outTradeNo={}, payOrdId={}, payAuthNo={}, totalFee={}, acctFee={}, cashFee={}, idCardNo={}, realName={}, familyType={}, familyName={}, medicalCardId={}, medicalCardInstId={}", openid, outTradeNo, payOrdId, payAuthNo, totalFee, acctFee, cashFee, cardNo, realName, familyType, familyName, medicalCardId, medicalCardInstId); |
|
|
|
|
try { |
|
|
|
|
boolean hasDBOrder = false; |
|
|
|
|
RecipeDao recipeDao = new RecipeDao(); |
|
|
|
|
if (MerchantEnum.ALI_MEDICAL.equals(merchantEnum)) { // 支付取消支付可重新支付
|
|
|
|
|
Order findOrder = recipeDao.selectMIOrderByPayOrdId(payOrdId); |
|
|
|
|
if (findOrder != null) { |
|
|
|
|
if (findOrder.hasPayStatusPaid()) { |
|
|
|
|
return Result.error(ResultEnum.PAY_REPEAT); |
|
|
|
|
} |
|
|
|
|
hasDBOrder = true; |
|
|
|
|
outTradeNo = findOrder.getOutTradeNo(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
log.info("[医保][处方]下单 hasDBOrder={}, openid={}, patientId={}, treatNum={}, outTradeNo={}, payOrdId={}, payAuthNo={}, totalFee={}, acctFee={}, hifpFee={}, cashFee={}, idCardNo={}, realName={}, familyType={}, familyName={}, medicalCardId={}, medicalCardInstId={}", hasDBOrder, openid, patientId, treatNum, outTradeNo, payOrdId, payAuthNo, totalFee, acctFee, hifpFee, cashFee, cardNo, realName, familyType, familyName, medicalCardId, medicalCardInstId); |
|
|
|
|
|
|
|
|
|
String orderTitle = "门诊号:" + treatNum; |
|
|
|
|
Map<String, Object> map = createMIOrder(merchantEnum, OrderMIEnum.DIAG_PAY, orderTitle, openid, outTradeNo, cardNo, realName, ip, payOrdId, payAuthNo, chrgBchno, |
|
|
|
|
MICreateOrder miOrder = createMIOrder(merchantEnum, OrderMIEnum.DIAG_PAY, hasDBOrder, orderTitle, openid, outTradeNo, cardNo, realName, ip, payOrdId, payAuthNo, chrgBchno, |
|
|
|
|
totalFee, insuranceFee, cashFee, notifyType, |
|
|
|
|
familyType, familyName, familyCardNo, medicalCardInstId, medicalCardId); |
|
|
|
|
|
|
|
|
|
if (map == null) { |
|
|
|
|
if (!miOrder.hasMapData()) { |
|
|
|
|
return Result.error(ResultEnum.PAY_ERROR_ORDER); |
|
|
|
|
} |
|
|
|
|
Object bankTransNoVal = map.get("bankTransNo"); |
|
|
|
|
String bankTransNo = ObjectUtils.isEmpty(bankTransNoVal) ? null : String.valueOf(bankTransNoVal); |
|
|
|
|
|
|
|
|
|
RecipeDao recipeDao = new RecipeDao(); |
|
|
|
|
// Recipe recipeInfo = recipeDao.selectByTradeNo(payOrdId);
|
|
|
|
|
|
|
|
|
|
String bankTransNo = miOrder.mapGetBankTansNo(); |
|
|
|
|
Recipe addRecipe = new Recipe(); |
|
|
|
|
addRecipe.setOutTradeNo(outTradeNo); |
|
|
|
|
addRecipe.setTradeNo(payOrdId); |
|
|
|
@ -305,6 +323,17 @@ public class MedicalService { |
|
|
|
|
addRecipe.setPayStatus(-1); |
|
|
|
|
addRecipe.setHisStatus(-1); |
|
|
|
|
|
|
|
|
|
Map<String, Object> map = miOrder.getMap(); |
|
|
|
|
if (miOrder.hasCreateMerOrder()) { // 订单已发起支付
|
|
|
|
|
log.info("[医保][处方]订单已发起支付 hasDBOrder={}, outTradeNo={}, payOrdId={}", hasDBOrder, outTradeNo, payOrdId); |
|
|
|
|
return Result.error(ResultEnum.PAY_REPEAT); |
|
|
|
|
} else { |
|
|
|
|
if (hasDBOrder) { |
|
|
|
|
log.info("[医保][处方]已有订单 hasDBOrder={}, outTradeNo={}, rxInfo={}", hasDBOrder, outTradeNo, JsonHelper.toJsonString(addRecipe)); |
|
|
|
|
return Result.success(map); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!recipeDao.insertMedical(addRecipe)) { |
|
|
|
|
return Result.error(ResultEnum.DATA_INSERT_ERROR); |
|
|
|
|
} |
|
|
|
@ -333,22 +362,37 @@ public class MedicalService { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
String outTradeNo = CodeHelper.getOutTradeNo(merchantEnum); |
|
|
|
|
log.info("[医保][挂号]下单 openid={}, outTradeNo={}, payOrdId={}, payAuthNo={}, totalFee={}, acctFee={}, cashFee={}, idCardNo={}, realName={}, medicalCardInstId={}, medicalCardId={}", openid, outTradeNo, payOrdId, payAuthNo, totalFee, acctFee, cashFee, cardNo, realName, medicalCardId, medicalCardInstId); |
|
|
|
|
try { |
|
|
|
|
boolean hasDBOrder = false; |
|
|
|
|
RegisterDao regDao = new RegisterDao(); |
|
|
|
|
if (MerchantEnum.ALI_MEDICAL.equals(merchantEnum)) { // 支付取消支付可重新支付
|
|
|
|
|
Order findOrder = regDao.selectMIOrderByPayOrdId(payOrdId); |
|
|
|
|
if (findOrder != null) { |
|
|
|
|
if (findOrder.hasPayStatusPaid()) { |
|
|
|
|
return Result.error(ResultEnum.PAY_REPEAT); |
|
|
|
|
} |
|
|
|
|
hasDBOrder = true; |
|
|
|
|
outTradeNo = findOrder.getOutTradeNo(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
String treatNum = reg.getTreatNum(); |
|
|
|
|
String patientId = reg.getPatientId(); |
|
|
|
|
log.info("[医保][挂号]下单 hasDBOrder={}, openid={}, patientId={}, treatNum={}, outTradeNo={}, payOrdId={}, payAuthNo={}, totalFee={}, acctFee={}, hifpFee={}, cashFee={}, idCardNo={}, realName={}, familyType={}, familyName={}, medicalCardId={}, medicalCardInstId={}", hasDBOrder, openid, patientId, treatNum, outTradeNo, payOrdId, payAuthNo, totalFee, acctFee, hifpFee, cashFee, cardNo, realName, familyType, familyName, medicalCardId, medicalCardInstId); |
|
|
|
|
|
|
|
|
|
String orderTitle = "挂号"; |
|
|
|
|
Map<String, Object> map = createMIOrder(merchantEnum, OrderMIEnum.REG_PAY, orderTitle, openid, outTradeNo, cardNo, realName, ip, payOrdId, payAuthNo, chrgBchno, |
|
|
|
|
MICreateOrder miOrder = createMIOrder(merchantEnum, OrderMIEnum.REG_PAY, hasDBOrder, orderTitle, openid, outTradeNo, cardNo, realName, ip, payOrdId, payAuthNo, chrgBchno, |
|
|
|
|
totalFee, insuranceFee, cashFee, notifyType, |
|
|
|
|
familyType, familyName, familyCardNo, medicalCardInstId, medicalCardId); |
|
|
|
|
if (map == null) { |
|
|
|
|
|
|
|
|
|
if (!miOrder.hasMapData()) { |
|
|
|
|
return Result.error(ResultEnum.PAY_ERROR_ORDER); |
|
|
|
|
} |
|
|
|
|
String bankTransNo = String.valueOf(map.get("bankTransNo")); |
|
|
|
|
|
|
|
|
|
RegisterDao regDao = new RegisterDao(); |
|
|
|
|
String bankTransNo = miOrder.mapGetBankTansNo(); |
|
|
|
|
reg.setOutTradeNo(outTradeNo); |
|
|
|
|
reg.setTradeNo(payOrdId); |
|
|
|
|
reg.setPayOrdId(payOrdId); |
|
|
|
|
|
|
|
|
|
reg.setPayMoney(cashFee); |
|
|
|
|
reg.setAcctFee(acctFee); |
|
|
|
|
reg.setHifpFee(hifpFee); |
|
|
|
@ -361,6 +405,17 @@ public class MedicalService { |
|
|
|
|
reg.setBankTransNo(bankTransNo); |
|
|
|
|
reg.setPayWay(merchantEnum.PAY_WAY_IN); |
|
|
|
|
|
|
|
|
|
Map<String, Object> map = miOrder.getMap(); |
|
|
|
|
if (miOrder.hasCreateMerOrder()) { // 订单已发起支付
|
|
|
|
|
log.info("[医保][挂号]订单已发起支付 hasDBOrder={}, outTradeNo={}, payOrdId={}", hasDBOrder, outTradeNo, payOrdId); |
|
|
|
|
return Result.error(ResultEnum.PAY_REPEAT); |
|
|
|
|
} else { |
|
|
|
|
if (hasDBOrder) { |
|
|
|
|
log.info("[医保][挂号]已有订单 hasDBOrder={}, outTradeNo={}, rxInfo={}", hasDBOrder, outTradeNo, JsonHelper.toJsonString(reg)); |
|
|
|
|
return Result.success(map); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!regDao.insertMedical(reg)) { |
|
|
|
|
return Result.error(ResultEnum.DATA_INSERT_ERROR); |
|
|
|
|
} |
|
|
|
@ -383,7 +438,7 @@ public class MedicalService { |
|
|
|
|
* @param openid openid |
|
|
|
|
* @param payInfo 支付信息 |
|
|
|
|
*/ |
|
|
|
|
public boolean regPayNotify(MerchantEnum merchantEnum, String outTradeNo, String bankTransNo, String payDate, String payTime, String openid, String payInfo) { |
|
|
|
|
public boolean regPaidNotify(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; |
|
|
|
@ -542,7 +597,6 @@ public class MedicalService { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
JsonResult jsonResult = HisMIDao.rxMIPay(merchantEnum, mdUserId, payDate, payTime, tradeNo, bankTransNo, cashFee); |
|
|
|
|
|
|
|
|
|
if (!jsonResult.success()) { |
|
|
|
|
String respCode = jsonResult.getCode(); |
|
|
|
|
String respMessage = jsonResult.getMessage(); |
|
|
|
@ -668,7 +722,6 @@ public class MedicalService { |
|
|
|
|
return Result.error(order.getMessage()); |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
|
|
// 支付宝
|
|
|
|
|
String respBody = AliMedicalHelper.refundTrade(outTradeNo, outRefundNo, tradeNo, cashFee, "线上退费"); |
|
|
|
|
boolean isOk = respBody != null; |
|
|
|
|