package com.ynxbd.common.service; import com.ynxbd.common.action.pay.PEnum; import com.ynxbd.common.bean.enums.MerchantEnum; import com.ynxbd.common.bean.pay.Order; 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.his.HisHelper; import com.ynxbd.common.result.JsonResult; import com.ynxbd.common.result.ResultEnum; import com.ynxbd.common.result.ServiceException; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import java.math.BigDecimal; /** * 住院 * * @Author wsq * @Date 2021/3/17 9:52 * @Copyright @ 2020 云南新八达科技有限公司 All rights reserved. */ @Slf4j public class InHospService { public boolean saveInHospPayInfo(PayInHosp payInHosp) { if (payInHosp == null) { return false; } return new InHospPayDao().insertInHospOrder(payInHosp); } /** * [住院]预交金订单信息支付 * * @return 是否完成操作 */ public boolean inHospNotify(MerchantEnum merchantEnum, String openid, BigDecimal totalFee, String outTradeNo, String bankTransNo, String payDate, String payTime, String payInfo) { InHospPayDao inHospPayDao = new InHospPayDao(); // 此处判断是否已经发起缴费,只要已存在数据库记录,说明已经发起了缴费请求,不能根据已经缴费成功,才取消本次缴费请求,因为请求可能已经延时,本次请求可能是重复提交的请求 if (PayService.hasUserOrderNo(outTradeNo, openid)) { log.info("{} [住院]已经发起缴费", merchantEnum.NAME); return false; } if (inHospPayDao.hasPayed(outTradeNo)) { log.info("{} [住院]已经交过费,退出本次缴费成功通知处理流程:outTradeNo= {}, bankTransNo= {}", merchantEnum.NAME, outTradeNo, bankTransNo); return false; } PayService.saveOrderNo(PEnum.IN_HOSP, outTradeNo, openid, payInfo, null); String tradeNo = HisHelper.getHisTradeNo(bankTransNo, PEnum.IN_HOSP); log.info("{} [住院预交金]收到微信通知,支付成功:outTradeNo={}, bankTransNo={}", merchantEnum.NAME, outTradeNo, bankTransNo); if (!inHospPayDao.updateWxPaid(outTradeNo, bankTransNo, tradeNo)) { log.error("{} [住院预交金]更改订单状态失败 outTradeNo={}, bankTransNo={}", merchantEnum.NAME, outTradeNo, bankTransNo); } PayInHosp inHosp = inHospPayDao.selectByTradeNo(outTradeNo); if (inHosp == null) { log.info("{} [住院]没有查询到订单:outTradeNo={}, bankTransNo={}", merchantEnum.NAME, outTradeNo, bankTransNo); return false; } String patientId = inHosp.getPatientId(); String patientName = inHosp.getPatientName(); JsonResult resp = new HisInHospDao().inHospPrepay(merchantEnum, patientId, patientName, totalFee, payDate, payTime, bankTransNo, tradeNo, inHosp.getTreatNum()); if (!resp.success()) { inHospPayDao.updatePayFail(openid, outTradeNo, resp.getMessage()); return false; } String treatNum = resp.getDataMapString("ZYNum"); // 住院号 String prepayNum = resp.getDataMapString("PrepayNum"); // 预交金号 log.info("{} [住院]HIS缴费成功,更新支付信息:prepayNum={}, treatNum={}", merchantEnum.NAME, prepayNum, treatNum); // 更新支付信息 if (!inHospPayDao.updateHisPaid(openid, outTradeNo, prepayNum)) { log.error("{} [住院]更新HIS支付状态失败:outTradeNo={}, bankTransNo={}, prepayNum={}", merchantEnum.NAME, outTradeNo, bankTransNo, patientName); } return true; } /** * His系统住院手动退费 * * @param invoiceTransNo 发票流水号 * @param refundUser 退款人 * @param refundDesc 退款描述 * @return 是否成功 */ public synchronized boolean hisRefund(String invoiceTransNo, String patientId, String refundUser, String refundDesc, BigDecimal refundMoney, PEnum pEnum) throws ServiceException { InHospPayDao inHospPayDao = new InHospPayDao(); PayInHosp payInHosp = inHospPayDao.selectRefundByInvoiceTransNo(invoiceTransNo, patientId); if (payInHosp == null) { log.info("[HIS住院退费] , 不退费 invoiceTransNo={}", invoiceTransNo); throw new ServiceException(ResultEnum.DATA_NOT_FOUND); } String authCode = payInHosp.getAuthCode(); if (ObjectUtils.isEmpty(authCode)) { log.info("[HIS住院退费]失败,条码为空 authCode={}", authCode); throw new ServiceException("条码为空"); } MerchantEnum merchantEnum = MerchantEnum.getMerchantEnumByAuthCode(authCode); if (merchantEnum == null) { log.info("[HIS住院退费]失败,支付方式异常 authCode={}", authCode); throw new ServiceException(ResultEnum.PAY_TYPE_ERROR); } if (ObjectUtils.isEmpty(refundDesc)) { refundDesc = "HIS手动退费"; } String outTradeNo = payInHosp.getOutTradeNo(); String bankTransNo = payInHosp.getBankTransNo(); BigDecimal dbPayMoney = payInHosp.getPayMoney(); if (refundMoney.compareTo(dbPayMoney) != 0) { log.info("[HIS挂号退费]金额符合禁止退费 invoiceTransNo={}, payMoney={}", invoiceTransNo, dbPayMoney); throw new ServiceException(ResultEnum.REFUND_MONEY_ERROR); } String outRefundNo = HisHelper.getHisTradeNo(bankTransNo, pEnum); Order orderRefund = PayService.refund(merchantEnum, outTradeNo, outRefundNo, refundMoney, payInHosp.getTotalFee(), refundDesc, payInHosp.getUpdateTime(), payInHosp.getOpenid(), payInHosp.getPatientId(), null); boolean isResult = orderRefund.isSuccess(); log.info("{} [HIS住院退费]申请{} outTradeNo={}, outRefundNo={}, invoiceTransNo={}, refundMoney={}, payMoney={}", merchantEnum.NAME, (isResult ? "成功" : "失败"), outTradeNo, outRefundNo, invoiceTransNo, refundMoney, dbPayMoney ); if (!isResult) { throw new ServiceException(ResultEnum.PAY_ERROR_REFUND); } String refundResult = orderRefund.getRefundResult(); if (!inHospPayDao.updateRefundByInvoiceTransNo(outTradeNo, outRefundNo, invoiceTransNo, refundResult)) { log.info("{} [HIS住院退费]更新退款结果失败 outTradeNo={}, outRefundNo={}, invoiceTransNo={}, refundResult={}", merchantEnum.NAME, outTradeNo, outRefundNo, invoiceTransNo, refundResult); } payInHosp.setRefundUser(refundUser); payInHosp.setRefundMoney(refundMoney); payInHosp.setRefundResult(refundResult); payInHosp.setRefundTable(pEnum.CODE); payInHosp.setTradeNo(outRefundNo); if (!new RefundDao().insert(payInHosp, refundDesc, "HIS")) { log.info("{} [HIS住院退费]退费信息新增失败 outTradeNo={}, outRefundNo={}, invoiceTransNo={}, refundResult={}", merchantEnum.NAME, outTradeNo, outRefundNo, invoiceTransNo, refundResult); } return true; } public boolean updateMicroOrderState(String outTradeNo, String bankTransNo, String openid) { return new InHospPayDao().updateMicroOrderState(outTradeNo, bankTransNo, openid); } }