You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					166 lines
				
				7.6 KiB
			
		
		
			
		
	
	
					166 lines
				
				7.6 KiB
			| 
								 
											2 years ago
										 
									 | 
							
								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);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |