微信后端代码
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.

243 lines
10 KiB

package com.ynxbd.common.service;
import com.alibaba.fastjson.JSONObject;
import com.ynxbd.common.action.pay.PEnum;
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 com.ynxbd.common.result.ServiceException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import java.math.BigDecimal;
import java.util.List;
@Slf4j
public class CasebookService {
// 下单
public Result placeOrder(MerchantEnum merchantEnum, String ip, String payOpenId, String openId, String patientId, String patientName, String treatNum, BigDecimal totalFee, String applyId, Integer getWay, String useToNo, String useToName, String address, String phone) throws ServiceException {
if (openId == null || patientId == null || patientName == null || treatNum == null || totalFee == null || applyId == null || getWay == null || useToName == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
if (totalFee.compareTo(BigDecimal.ZERO) == 0) {
return Result.error(ResultEnum.PAY_MONEY_IS_ZERO);
}
PayCasebook order = selectOrderByApplyId(applyId, treatNum);
String outTradeNo = merchantEnum.createOutTradeNo();
if (order == null) {
PayCasebook addInfo = new PayCasebook();
addInfo.setTreatNum(treatNum);
addInfo.setPatientName(patientName);
addInfo.setUseToNo(useToNo);
addInfo.setUseToName(useToName);
addInfo.setGetWay(getWay);
addInfo.setAddress(address);
addInfo.setPhone(phone);
// =========================
addInfo.setApplyId(applyId);
addInfo.setOutTradeNo(outTradeNo);
addInfo.setTotalFee(totalFee);
addInfo.setPayMoney(totalFee);
addInfo.setPayStatus(-1); // 待支付
if (!addResApply(addInfo, openId, patientId)) {
log.info("[病历复印]预约申请信息存储失败 patientId={}, openId={}, patientId={}", patientId, openId, patientId);
return Result.error(ResultEnum.SPECIFIED_QUESTIONED_USER_NOT_EXIST);
}
} else {
log.info("{} [病历复印]下单-查询到订单 order=[{}]", merchantEnum.NAME, JsonHelper.toJsonString(order));
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, 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, payOpenId, openId, patientId, totalFee.toString(), outTradeNo, PQREnum.CASEBOOK.CODE, ip, body);
if (respJson == null) {
return Result.error(ResultEnum.PAY_ERROR); // 支付异常
}
return Result.success(respJson);
}
// /**
// * [病历复印]判断【今天】是否存在预约记录
// *
// * @param openId openId
// * @param patientId 患者id
// * @param treatNum 住院号
// * @param getWay 方式
// * @param useToNo 模板号
// * @param useToName 模板名称
// * @return bool
// */
// public boolean hasResInfo(String openId, String patientId, String treatNum, String getWay, String useToNo, String useToName) throws ServiceException {
// if (ObjectUtils.isEmpty(openId) || ObjectUtils.isEmpty(patientId) || ObjectUtils.isEmpty(treatNum) || ObjectUtils.isEmpty(useToNo) || ObjectUtils.isEmpty(useToName)) {
// throw new ServiceException(ResultEnum.PARAM_IS_DEFECT);
// }
// return new CasebookDao().selectIsExit(openId, patientId, treatNum, getWay, useToNo, useToName);
// }
/**
* [病历复印]查询今日预约申请的数据
*
* @param patientId 患者id
* @param treatNum 住院号
* @return bool
*/
public List<PayCasebook> queryListByTreat(String patientId, String treatNum) throws ServiceException {
if (ObjectUtils.isEmpty(patientId) || ObjectUtils.isEmpty(treatNum)) {
throw new ServiceException(ResultEnum.PARAM_IS_DEFECT);
}
return new CasebookDao().selectListByTreat(patientId, treatNum);
}
/**
* 更新预支付订单信息
*
* @param applyId 申请id
* @param treatNum 住院号
* @param totalFee 金额
* @param outTradeNo 订单号
* @return bool
*/
public boolean updatePrepayInfo(String applyId, String treatNum, BigDecimal totalFee, String outTradeNo) throws ServiceException {
log.info("[病历复印]更新下单信息 applyId={}, treatNum={}, totalFee={}, outTradeNo={}", applyId, treatNum, totalFee, outTradeNo);
if (ObjectUtils.isEmpty(applyId) || totalFee.compareTo(BigDecimal.ZERO) == 0 || ObjectUtils.isEmpty(outTradeNo)) {
throw new ServiceException(ResultEnum.PARAM_IS_DEFECT);
}
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 boolean addResApply(PayCasebook casebook, String openId, String patientId) {
if (casebook == null || ObjectUtils.isEmpty(casebook.getApplyId()) || ObjectUtils.isEmpty(casebook.getPayStatus())) {
return false;
}
return new CasebookDao().insert(casebook, openId, patientId);
}
public PayCasebook queryOrderByOutTradeNo(String outTradeNo) {
if (ObjectUtils.isEmpty(outTradeNo)) {
return null;
}
return new CasebookDao().selectByOutTradeNo(outTradeNo);
}
// 支付通知
public void paidNotify(MerchantEnum merchantEnum, String openid, BigDecimal totalFee, String outTradeNo, String bankTransNo, String payInfo) {
PayCasebook order = queryOrderByOutTradeNo(outTradeNo);
if (order == null) {
log.error("[病历复印][回调]未找到订单 outTradeNo={}, bankTransNo={}, totalFee={}", outTradeNo, bankTransNo, totalFee);
return;
}
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;
}
CasebookDao casebookDao = new CasebookDao();
String tradeNo = PEnum.CASEBOOK.toTradeNo(bankTransNo);
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());
params.put("tradeNo", tradeNo);
});
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);
// }
//
// /**
// * 预约成功后,记录申请id
// *
// * @param id id
// * @param applyId 申请id
// * @return bool
// */
// public boolean updateApplyIdById(long id, String applyId) {
// return new CasebookDao().updateApplyIdById(id, applyId);
// }
}