package com.ynxbd.common.service; import com.alibaba.fastjson.JSONObject; import com.ynxbd.common.action.pay.PQREnum; import com.ynxbd.common.bean.enums.MerchantEnum; import com.ynxbd.common.bean.pay.PayCasebook; import com.ynxbd.common.dao.CasebookDao; import com.ynxbd.common.helper.common.CodeHelper; import com.ynxbd.common.helper.common.DateHelper; import com.ynxbd.common.helper.common.JsonHelper; import com.ynxbd.common.helper.xbd.XBDEnum; import com.ynxbd.common.helper.xbd.XBDHttpHelper; import com.ynxbd.common.result.Result; import com.ynxbd.common.result.ResultEnum; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import java.math.BigDecimal; @Slf4j public class CasebookService { public Result placeOrder(MerchantEnum merchantEnum, String ip, String openid, String patientId, String treatNum, String totalFee, String applyId, String getWay, String useToName) { if (openid == null || patientId == null || totalFee == null) { return Result.error(ResultEnum.PARAM_IS_DEFECT); } if (new BigDecimal(totalFee).compareTo(BigDecimal.ZERO) == 0) { return Result.error(ResultEnum.PAY_MONEY_IS_ZERO); } PayCasebook order = selectOrderByApplyId(applyId, treatNum); String outTradeNo = CodeHelper.getOutTradeNo(merchantEnum); log.info("{} [病历]查询订单 order=[{}]", merchantEnum.NAME, JsonHelper.toJsonString(order)); if (order != null) { if (order.hasPayStatusPaid()) { log.info("{} [病历]订单已支付 applyId={}, outTradeNo={}", merchantEnum.NAME, applyId, order.getOutTradeNo()); return Result.error(ResultEnum.PAY_REPEAT); } if (ObjectUtils.isEmpty(order.getOutTradeNo())) { outTradeNo = order.getOutTradeNo(); } } if (!updatePrepayInfo(applyId, treatNum, new BigDecimal(totalFee), outTradeNo)) { log.info("{} [病历]下单信息存储失败 applyId-{}, patientId={},treatNum-{}", merchantEnum.NAME, applyId, patientId, treatNum); return Result.error(ResultEnum.SPECIFIED_QUESTIONED_USER_NOT_EXIST); } String body = "病历复印缴费 住院号:" + treatNum; JSONObject respJson = PayService.createOrder(merchantEnum, openid, patientId, totalFee, outTradeNo, PQREnum.CASEBOOK.CODE, ip, body); if (respJson == null) { return Result.error(ResultEnum.PAY_ERROR); // 支付异常 } return Result.success(respJson); } /** * [病历复印]判断是否存在预约记录 * * @param patientId 患者id * @param treatNum 住院号 * @param getWay 方式 * @param useToName 模版名称 * @return bool */ public boolean isExit(String patientId, String treatNum, String getWay, String useToName) { if (patientId == null || treatNum == null) { log.info("[病历]唤起支付 存入 applyId失败,patientId-{},treatNum-{},", patientId, treatNum); return false; } return new CasebookDao().selectIsExit(patientId, treatNum, getWay, useToName); } /** * 更新预支付订单信息 * * @param applyId 申请id * @param treatNum 住院号 * @param totalFee 金额 * @param outTradeNo 订单号 * @return bool */ public boolean updatePrepayInfo(String applyId, String treatNum, BigDecimal totalFee, String outTradeNo) { log.info("[病历复印]更新下单信息 applyId={}, treatNum={}, totalFee={}, outTradeNo={}", applyId, treatNum, totalFee, totalFee); if (ObjectUtils.isEmpty(applyId) || totalFee.compareTo(BigDecimal.ZERO) == 0 || ObjectUtils.isEmpty(outTradeNo)) { log.error("[病历复印]更新下单信息失败 applyId={}, totalFee={}, outTradeNo={}", applyId, totalFee, totalFee); return false; } return new CasebookDao().updatePrepayInfo(applyId, treatNum, totalFee, outTradeNo); } /** * 根据预约申请id查询订单信息 * * @param applyId 申请id * @param treatNum 住院号 * @return bean */ public PayCasebook selectOrderByApplyId(String applyId, String treatNum) { if (ObjectUtils.isEmpty(applyId) || ObjectUtils.isEmpty(treatNum)) { return null; } return new CasebookDao().selectOrder(applyId, treatNum); } /** * [病历复印]新增预约记录 * * @param casebook 订单信息 * @return bool */ public long addApply(PayCasebook casebook, String openId, String patientId) { if (casebook == null) { log.info("casebook is null"); return -1; } return new CasebookDao().insert(casebook, openId, patientId); } /** * 预约成功后,记录申请id * * @param id id * @param applyId 申请id * @return bool */ public boolean updateApplyIdById(long id, String applyId) { return new CasebookDao().updateApplyIdById(id, applyId); } // 支付回调通知 public void paidNotify(MerchantEnum merchantEnum, String openid, BigDecimal totalFee, String outTradeNo, String bankTransNo, String payInfo) { CasebookDao casebookDao = new CasebookDao(); PayCasebook order = casebookDao.selectByOutTradeNo(outTradeNo); String applyId = order.getApplyId(); if (ObjectUtils.isEmpty(applyId)) { log.error("[病历复印]回调:病历申请ID缺失 outTradeNo={}, bankTransNo={}, applyId={}", outTradeNo, bankTransNo, applyId); return; } if (order.hasPayStatusPaid()) { log.error("[病历复印]订单已支付 outTradeNo={}, bankTransNo={}, applyId={}", outTradeNo, bankTransNo, applyId); return; } if (!casebookDao.updatePayStateOk(outTradeNo, bankTransNo)) { log.info("[病历复印]修改支付状态失败 outTradeNo={}, bankTransNo={}, applyId={}", outTradeNo, bankTransNo, applyId); } try { log.info("[病历复印]调用HIS接口开始... borrowNo-{}", applyId); String respJson = XBDHttpHelper.ExecMethodPost(XBDEnum.BLSM_Appointment_SetISPay.NAME, params -> { params.put("borrowNo", applyId); params.put("payDateTime", DateHelper.getCurDateTime()); }); log.info("[病历复印]HIS接口返回 resp={}", respJson); String code = JsonHelper.parseObject(respJson).getString("Code"); if (code == null) { if (!casebookDao.updateNotifyOk(outTradeNo)) { log.info("[病历复印]更新HIS订单信息失败 outTradeNo={}, bankTransNo={}, applyId={}", outTradeNo, bankTransNo, applyId); } return; } String message = JsonHelper.parseObject(respJson).getString("Msg"); log.error("[病历复印]HIS接口调用失败 code={}, message={}, outTradeNo={}, applyId={}", code, message, outTradeNo, applyId); if (!casebookDao.updateNotifyErr(outTradeNo, message)) { log.info("[病历复印]更新HIS订单错误信息失败 outTradeNo={}, code={}, message={}, outTradeNo={}, applyId={}", outTradeNo, code, message, outTradeNo, applyId); } } catch (Exception e) { log.error(e.getMessage()); } } // public boolean isPaid(String patientId, String treatNum, String applyId, String getWay, String useToName) { // if (patientId == null || treatNum == null) { // log.info("[病历复印]查重失败,patientId-{},treatNum-{},applyId-{}", patientId, treatNum, applyId); // return false; // } // return new CasebookDao().selectIsPay(patientId, treatNum, applyId, getWay, useToName); // } }