| | |
| | | import com.ruoyi.other.api.domain.TCoupon; |
| | | import com.ruoyi.other.api.domain.TIntegralRule; |
| | | import com.ruoyi.other.api.domain.TVip; |
| | | import com.ruoyi.other.api.dto.ExchangeCodeConsumeDTO; |
| | | import com.ruoyi.other.api.feignClient.IntegralRuleClient; |
| | | import com.ruoyi.other.api.feignClient.OtherClient; |
| | | import com.ruoyi.other.api.feignClient.VipClient; |
| | | import com.ruoyi.other.api.vo.ExchangeCodeConsumeResultVO; |
| | | import com.ruoyi.payment.api.feignClient.AliPaymentClient; |
| | | import com.ruoyi.payment.api.feignClient.H5AliPaymentClient; |
| | | import com.ruoyi.payment.api.feignClient.WxPaymentClient; |
| | |
| | | private AppUserIntegralChangeClient appUserIntegralChangeClient; |
| | | |
| | | @Resource |
| | | private OtherClient otherClient; |
| | | |
| | | @Resource |
| | | private WxPaymentClient wxPaymentClient; |
| | | |
| | | @Resource |
| | |
| | | @Resource |
| | | private RedissonClient redissonClient; |
| | | |
| | | |
| | | |
| | | private boolean isBalancePayMode(Integer payMethod) { |
| | | return payMethod != null && (payMethod == 1 || payMethod == 2); |
| | | } |
| | | |
| | | private BigDecimal money(BigDecimal amount) { |
| | | return amount == null ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : amount.setScale(2, RoundingMode.HALF_UP); |
| | | } |
| | | |
| | | private void recordBalanceRefund(TChargingOrder order, BigDecimal refundAmount, String refundNo) { |
| | | if (order == null || order.getAppUserId() == null || order.getId() == null |
| | | || refundAmount == null || refundAmount.compareTo(BigDecimal.ZERO) <= 0) { |
| | | return; |
| | | } |
| | | ExchangeCodeConsumeDTO refundDTO = new ExchangeCodeConsumeDTO(); |
| | | refundDTO.setUserId(order.getAppUserId()); |
| | | refundDTO.setOrderId(order.getId()); |
| | | refundDTO.setAmount(refundAmount); |
| | | refundDTO.setRefundNo(refundNo); |
| | | R<ExchangeCodeConsumeResultVO> result = otherClient.refundExchangeCodeBalance(refundDTO); |
| | | if (result == null || result.getCode() != 200) { |
| | | throw new RuntimeException("??????????"); |
| | | } |
| | | } |
| | | |
| | | @Scheduled(fixedRate = 1000 * 60) |
| | | public void taskOneMinutes() { |
| | |
| | | //用户推荐奖励 |
| | | chargingOrderService.referralReward(order); |
| | | |
| | | //开始构建退款费用 |
| | | //???????? |
| | | refundAmount = refundAmount.setScale(2, RoundingMode.HALF_EVEN); |
| | | if (refundAmount.compareTo(BigDecimal.ZERO) > 0) { |
| | | Integer rechargePaymentType = order.getRechargePaymentType(); |
| | | //构建退款明细 |
| | | BigDecimal thirdRefundAmount = refundAmount.min(money(order.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP); |
| | | BigDecimal balanceRefundAmount = refundAmount.subtract(thirdRefundAmount).min(money(order.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP); |
| | | refundAmount = thirdRefundAmount.add(balanceRefundAmount).setScale(2, RoundingMode.HALF_UP); |
| | | order.setThirdRefundAmount(thirdRefundAmount); |
| | | order.setBalanceRefundAmount(balanceRefundAmount); |
| | | order.setRefundAmount(refundAmount); |
| | | order.setRefundStatus(refundAmount.compareTo(BigDecimal.ZERO) > 0 ? 1 : 2); |
| | | chargingOrderService.updateById(order); |
| | | //?????? |
| | | TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund(); |
| | | chargingOrderRefund.setChargingOrderId(order.getId()); |
| | | SimpleDateFormat sdfaa = new SimpleDateFormat("yyyyMMddHHmmssSSS"); |
| | |
| | | chargingOrderRefund.setRefundAmount(refundAmount); |
| | | chargingOrderRefund.setRefundStatus(1); |
| | | chargingOrderRefund.setPayType(rechargePaymentType); |
| | | chargingOrderRefund.setRefundStatus(1); |
| | | chargingOrderRefund.setCode(order.getCode()); |
| | | chargingOrderRefund.setRefundTitle("充电完成退款"); |
| | | chargingOrderRefund.setRefundContent("充电完成退款"); |
| | | chargingOrderRefund.setRefundReason("充电完成退款"); |
| | | chargingOrderRefund.setRefundRemark("实际充电消费金额:" + order.getPaymentAmount()); |
| | | chargingOrderRefund.setRefundTitle("??????"); |
| | | chargingOrderRefund.setRefundContent("??????"); |
| | | chargingOrderRefund.setRefundReason("??????"); |
| | | chargingOrderRefund.setRefundRemark("?????????" + order.getPaymentAmount()); |
| | | chargingOrderRefund.setRefundTotalAmount(refundAmount); |
| | | chargingOrderRefund.setPayAmount(rechargeAmount); |
| | | if (1 == rechargePaymentType) { |
| | | if (thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 && 1 == rechargePaymentType) { |
| | | WxPaymentRefundModel model = new WxPaymentRefundModel(); |
| | | model.setOut_trade_no(order.getCode()); |
| | | model.setOut_refund_no(chargingOrderRefund.getRefundCode()); |
| | | model.setReason("充电完成退款"); |
| | | model.setReason("??????"); |
| | | model.setNotify_url("/payment/wx/refund/notify"); |
| | | WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount(); |
| | | amount.setRefund(refundAmount.multiply(new BigDecimal(100)).intValue()); |
| | | amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue()); |
| | | amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue()); |
| | | amount.setTotal((isBalancePayMode(order.getPayMethod()) ? money(order.getThirdPayAmount()) : rechargeAmount).multiply(new BigDecimal(100)).intValue()); |
| | | amount.setCurrency("CNY"); |
| | | model.setAmount(amount); |
| | | R<Map<String, Object>> result = wxPaymentClient.refundOrderR(model); |
| | | if (200 == result.getCode()) { |
| | | chargingOrderRefundService.save(chargingOrderRefund); |
| | | //手续费 |
| | | //??? |
| | | Map<String, Object> amount1 = (Map<String, Object>) result.getData().get("amount"); |
| | | Object refund_fee1 = amount1.get("refund_fee"); |
| | | BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100)); |
| | |
| | | chargingOrderRefundService.updateById(chargingOrderRefund); |
| | | } |
| | | } |
| | | if (2 == rechargePaymentType) { |
| | | if (thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 && 2 == rechargePaymentType) { |
| | | RefundReq dto = new RefundReq(); |
| | | dto.setOutTradeNo(order.getCode()); |
| | | dto.setOutRequestNo(chargingOrderRefund.getRefundCode()); |
| | | dto.setRefundAmount(refundAmount.toString()); |
| | | dto.setRefundReason("充电完成退款"); |
| | | dto.setRefundAmount(thirdRefundAmount.toString()); |
| | | dto.setRefundReason("??????"); |
| | | RefundResp resp = aliPaymentClient.refund(dto).getData(); |
| | | if (null != resp) { |
| | | chargingOrderRefundService.save(chargingOrderRefund); |
| | | chargingOrderService.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null); |
| | | } |
| | | } |
| | | if (3 == rechargePaymentType) { |
| | | if (thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 && 3 == rechargePaymentType) { |
| | | RefundReq dto = new RefundReq(); |
| | | dto.setOutTradeNo(order.getRechargeSerialNumber()); |
| | | dto.setOutRequestNo(chargingOrderRefund.getRefundCode()); |
| | | dto.setRefundAmount(refundAmount.toString()); |
| | | dto.setRefundReason("充电完成退款"); |
| | | dto.setRefundAmount(thirdRefundAmount.toString()); |
| | | dto.setRefundReason("??????"); |
| | | RefundResp resp = h5AliPaymentClient.refund(dto).getData(); |
| | | if (null != resp && "10000".equals(resp.getCode())) { |
| | | chargingOrderRefundService.save(chargingOrderRefund); |
| | | chargingOrderService.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null); |
| | | } |
| | | } |
| | | if (thirdRefundAmount.compareTo(BigDecimal.ZERO) == 0 && balanceRefundAmount.compareTo(BigDecimal.ZERO) > 0) { |
| | | chargingOrderRefund.setRefundStatus(2); |
| | | chargingOrderRefund.setRefundSerialNumber("BALANCE"); |
| | | chargingOrderRefund.setRefundTime(LocalDateTime.now()); |
| | | chargingOrderRefundService.save(chargingOrderRefund); |
| | | recordBalanceRefund(order, balanceRefundAmount, chargingOrderRefund.getRefundCode()); |
| | | order.setRefundStatus(2); |
| | | order.setRefundTime(LocalDateTime.now()); |
| | | chargingOrderService.updateById(order); |
| | | } |
| | | } |
| | | } |
| | | |