123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- package thyyxxk.wxservice_server.service;
- import com.alibaba.fastjson.JSON;
- import com.alibaba.fastjson.JSONObject;
- import com.wechat.pay.java.service.payments.model.Transaction;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.stereotype.Service;
- import org.springframework.web.client.RestTemplate;
- import thyyxxk.wxservice_server.config.exception.ExceptionEnum;
- import thyyxxk.wxservice_server.constant.CardCostTypes;
- import thyyxxk.wxservice_server.dao.InpatientDao;
- import thyyxxk.wxservice_server.dao.WxApiDao;
- import thyyxxk.wxservice_server.entity.PureCodeName;
- import thyyxxk.wxservice_server.entity.ResultVo;
- import thyyxxk.wxservice_server.entity.electronichealthcard.HisRegister;
- import thyyxxk.wxservice_server.entity.inpatient.GetZyFeeParam;
- import thyyxxk.wxservice_server.entity.paymzfee.MedinsPresettle;
- import thyyxxk.wxservice_server.entity.wxapi.PushMessageParam;
- import thyyxxk.wxservice_server.entity.wxapi.WxPayOrder;
- import thyyxxk.wxservice_server.factory.thmz.ThmzService;
- import thyyxxk.wxservice_server.factory.thmz.model.SaveAppointmentRequest;
- import thyyxxk.wxservice_server.factory.thmz.model.SaveClinicRegisterRequest;
- import thyyxxk.wxservice_server.factory.thmz.model.SaveMzPayRequest;
- import thyyxxk.wxservice_server.utils.*;
- import java.math.BigDecimal;
- import java.util.Date;
- import java.util.concurrent.TimeUnit;
- /**
- * @description: 保存付费结果
- * @author: DingJie
- * @create: 2021/7/518:02
- */
- @Slf4j
- @Service
- public class SavePayResultService {
- private final WxApiDao dao;
- private final InpatientDao yjjDao;
- private final ThmzService thmzService;
- private final WxRefundService refundService;
- private final PushWxMessageService pushWxMessageService;
- private final ElectronicHealthCardService healthCardService;
- @Value("${siMzApiUrl}")
- private String siMzApiUrl;
- @Autowired
- public SavePayResultService(WxApiDao dao, InpatientDao yjjDao, ThmzService thmzService, WxRefundService refundService,
- PushWxMessageService pushWxMessageService, ElectronicHealthCardService healthCardService) {
- this.dao = dao;
- this.yjjDao = yjjDao;
- this.thmzService = thmzService;
- this.refundService = refundService;
- this.pushWxMessageService = pushWxMessageService;
- this.healthCardService = healthCardService;
- }
- public String saveClinicRegister(WxPayOrder order, String payTime) {
- if (dao.alreadyPaidRegisterFee(order.getTradeNo()) == 1) {
- dao.updateSuccessHisStatus(order.getTradeNo());
- log.info("订单号:{} 的挂号信息已保存,无需再次保存。", order.getTradeNo());
- return payTime;
- }
- SaveClinicRegisterRequest request = new SaveClinicRegisterRequest.Builder()
- .patientId(order.getPatientId()).times(order.getMzyRequestId())
- .psordnum(order.getTradeNo()).agtordnum(order.getSerialNo())
- .amount(order.getTotalFee()).fundpayAmt(order.getFundpayAmt())
- .acctpayAmt(order.getAcctpayAmt()).couponAmt(order.getCouponAmt())
- .cashpayAmt(order.getCashpayAmt()).build();
- String saveClinicRegisterResponse = thmzService.saveClinicRegister(request);
- return afterSaveAllAppointment(saveClinicRegisterResponse, order, payTime);
- }
- public String saveAppointment(WxPayOrder order, String payTime) {
- if (dao.alreadyPaidRegisterFee(order.getTradeNo()) == 1) {
- dao.updateSuccessHisStatus(order.getTradeNo());
- log.info("订单号:{} 的挂号信息已保存,无需再次保存。", order.getTradeNo());
- return payTime;
- }
- SaveAppointmentRequest request = new SaveAppointmentRequest.Builder()
- .mzyRequestId(order.getMzyRequestId()).patientId(order.getPatientId())
- .totalFee(order.getTotalFee()).fundpayAmt(order.getFundpayAmt())
- .acctpayAmt(order.getAcctpayAmt()).couponAmt(order.getCouponAmt())
- .cashpayAmt(order.getCashpayAmt()).psordnum(order.getTradeNo())
- .agtordnum(order.getSerialNo()).apTime(order.getApTime()).build();
- String saveAppointmentResponse = thmzService.saveAppointment(request);
- return afterSaveAllAppointment(saveAppointmentResponse, order, payTime);
- }
- private String afterSaveAllAppointment(String response, WxPayOrder order, String payTime) {
- if (!response.startsWith("ERROR:")) {
- dao.updateSuccessHisStatus(order.getTradeNo());
- dao.couponUsed(order.getCouponId());
- HisRegister hisRegister = dao.selectRegisterDateDiff(order.getTradeNo());
- if (null != hisRegister) {
- String scene = hisRegister.getDateDiff() > 0 ? "0101011" : "0101012";
- healthCardService.reportHisData(order.getPatientId(), scene, hisRegister.getUnitCode(), CardCostTypes.SELF_PAY);
- }
- return payTime;
- }
- if (dao.alreadyPaidRegisterFee(order.getTradeNo()) == 1) {
- dao.updateSuccessHisStatus(order.getTradeNo());
- dao.couponUsed(order.getCouponId());
- return payTime;
- }
- String refund = refundService.autoRefund(order.getTradeNo(), response);
- if (!refund.startsWith("ERROR:")) {
- dao.refundOrder(order.getTradeNo(), response);
- return response;
- }
- return "ERROR:保存挂号信息失败,自动退款失败,请联系服务中心进行退款。";
- }
- public String saveMzChargeInfo(WxPayOrder order, String payTime) throws Exception {
- String hisOrdNum = order.getHisOrdNum();
- String tradeNo = order.getTradeNo();
- while (TradeVectorUtil.tradeNoBeingRefund(tradeNo)) {
- TimeUnit.SECONDS.sleep(3);
- }
- if (dao.alreadyPayed(tradeNo) > 0) {
- log.info("订单号:{} 的门诊缴费信息已保存,无需再次保存。", tradeNo);
- updateAppletHisChargeplStatus(hisOrdNum, tradeNo, order.getCouponId(), order.getCashpayAmt());
- return payTime;
- }
- PureCodeName status = dao.selectPayStatus(tradeNo);
- log.info("【订单号:{}】查询订单是否已退款结果:{}", tradeNo, status);
- if (null != status && (StringUtil.notBlank(status.getName()) ||
- status.getTradeState() == Transaction.TradeStateEnum.REFUND)) {
- if (status.getTradeState() != Transaction.TradeStateEnum.REFUND) {
- dao.updateRefundStatus(tradeNo);
- }
- TradeVectorUtil.removeRefunded(tradeNo);
- return "ERROR:因系统原因,订单已退款。请稍后重新缴费或前往一楼收费窗口缴费。";
- }
- if (TradeVectorUtil.tradeNoRefunded(tradeNo)) {
- dao.updateRefundStatus(tradeNo);
- return "ERROR:因系统原因,订单已退款。请稍后重新缴费或前往一楼收费窗口缴费。";
- }
- SaveMzPayRequest request = new SaveMzPayRequest.Builder().payTime(payTime)
- .patCardNo(order.getPatientId()).agtOrdNum(order.getSerialNo())
- .payAmt(order.getTotalFee()).fundpayAmt(order.getFundpayAmt())
- .acctpayAmt(order.getAcctpayAmt()).couponAmt(order.getCouponAmt())
- .cashpayAmt(order.getCashpayAmt()).hisOrdNum(hisOrdNum)
- .psOrdNum(tradeNo).build();
- ResultVo<String> saveMzPayResponse = thmzService.saveMzPay(request);
- if (saveMzPayResponse.getCode() == ExceptionEnum.SUCCESS.getCode()) {
- updateAppletHisChargeplStatus(hisOrdNum, tradeNo, order.getCouponId(), order.getCashpayAmt());
- int fundpayCount = dao.selectFundPayCount(tradeNo);
- String cardCostTypes = fundpayCount > 0 ? CardCostTypes.MED_INS : CardCostTypes.SELF_PAY;
- healthCardService.reportHisData(order.getPatientId(), "0101051", null, cardCostTypes);
- return payTime;
- }
- if (dao.alreadyPayed(tradeNo) > 0) {
- updateAppletHisChargeplStatus(hisOrdNum, tradeNo, order.getCouponId(), order.getCashpayAmt());
- return payTime;
- }
- String refund = refundService.autoRefund(tradeNo, saveMzPayResponse.getMessage());
- if (!refund.startsWith("ERROR:")) {
- dao.refundOrder(tradeNo, saveMzPayResponse.getMessage());
- return "ERROR:【" + saveMzPayResponse.getMessage() + "】已为您自动退款,请留意到账信息。";
- }
- return "ERROR:【" + saveMzPayResponse.getMessage() + "】自动退款失败,请联系服务中心进行退款。";
- }
- private void updateAppletHisChargeplStatus(String hisOrdNum, String tradeNo, String couponId, BigDecimal cashpayAmt) {
- String[] patinfo = hisOrdNum.split("_");
- medinsSettle(hisOrdNum, cashpayAmt);
- dao.updateMzSavedFlag(patinfo[0], patinfo[1]);
- dao.updateSuccessHisStatus(tradeNo);
- dao.couponUsed(couponId);
- }
- private void medinsSettle(String hisOrdNum, BigDecimal cashpayAmt) {
- String[] arr = hisOrdNum.split("_");
- MedinsPresettle presettle = dao.selectPreSetlinfo(arr[0], arr[1]);
- if (null != presettle) {
- BigDecimal medinsPayAmt = presettle.getFundPaySumamt().add(presettle.getAcctPay());
- JSONObject params = new JSONObject();
- params.put("patNo", arr[0]);
- params.put("times", arr[1]);
- params.put("staffId", "99999");
- if (presettle.getAcctPay().compareTo(BigDecimal.ZERO) > 0) {
- params.put("acctUsedFlag", "1");
- }
- if (medinsPayAmt.compareTo(BigDecimal.ZERO) > 0) {
- if (presettle.getMedfeeSumamt().compareTo(cashpayAmt) <= 0) {
- String url = siMzApiUrl + "/revokeOutpatientSettlement";
- String response = new RestTemplate().postForObject(url, params, String.class);
- log.info("患者全自费缴费,自动撤销医保业务:\n参数:{}\n:结果:{}", params, JSON.toJSON(response));
- return;
- }
- }
- String url = siMzApiUrl + "/outpatientSettlement";
- String response = new RestTemplate().postForObject(url, params, String.class);
- log.info("患者自助医保结算:\n参数:{}\n结果:{}", params, JSON.toJSON(response));
- }
- }
- public String saveZyYjjInfo(WxPayOrder order, String payTime) {
- int savedCount = yjjDao.selectSavedCount(order.getTradeNo(), order.getSerialNo());
- if (savedCount > 0) {
- log.info("订单号:{} 的住院预交金信息已保存,无需再次保存。", order.getTradeNo());
- dao.couponUsed(order.getCouponId());
- return payTime;
- }
- String datetime = DateUtil.formatDatetime(new Date(), "yyyy-MM-dd HH:mm:ss");
- yjjDao.payZyYjjSuccessful(order.getInpatientNo(), order.getAdmissTimes(), order.getTotalFee(),
- datetime, order.getTradeNo(), order.getSerialNo(), "");
- GetZyFeeParam getZyFeeParam = new GetZyFeeParam();
- String date = DateUtil.formatDatetime(new Date(), "yyyy-MM-dd");
- getZyFeeParam.setInpatientNo(order.getInpatientNo());
- getZyFeeParam.setAdmissTimes(order.getAdmissTimes());
- getZyFeeParam.setStart(date);
- getZyFeeParam.setEnd(date);
- yjjDao.selectZyFees(getZyFeeParam);
- dao.updateSuccessHisStatus(order.getTradeNo());
- dao.couponUsed(order.getCouponId());
- if (StringUtil.isBlank(order.getPatientId())) {
- return payTime;
- }
- healthCardService.reportHisData(order.getPatientId(), "0101056", null, CardCostTypes.SELF_PAY);
- log.info("缴纳住院预交金成功:{}", JSON.toJSONStringWithDateFormat(order, "yyyy-MM-dd HH:mm:ss"));
- String msgContent = "{\"touser\":\"\",\"data\":" +
- "{\"keyword3\":{\"color\":\"#173177\",\"value\":\"" + order.getTotalFee() + "\"}," +
- "\"keyword1\":{\"color\":\"#173177\",\"value\":\"" + order.getPatientName() + "\"}," +
- "\"keyword2\":{\"color\":\"#173177\",\"value\":\"" + order.getInpatientNo() + "\"}," +
- "\"remark\":{\"color\":\"#FF0000\",\"value\":\"感谢您的使用,祝您健康!\"}," +
- "\"first\":{\"color\":\"#FF0000\",\"value\":\"您好,您已成功支付住院预交金,详情如下:\"}}," +
- "\"template_id\":\"6qWVpQopIe4a_fYYnZg_yaInPoMFduDDJ4hotv3Mtxo\"," +
- "\"url\":\"\"}";
- PushMessageParam pojo = new PushMessageParam();
- pojo.setCardNo(yjjDao.selectCardNoByPatientId(order.getPatientId()));
- pojo.setMsgContext(JSONObject.parseObject(msgContent));
- pushWxMessageService.pushMessage2(pojo);
- return payTime;
- }
- }
|