| | |
| | | } |
| | | accountingStrategyDetailOrderService.saveBatch(list1); |
| | | |
| | | if (balancePayAmount.compareTo(BigDecimal.ZERO) > 0) { |
| | | if (thirdPayAmount.compareTo(BigDecimal.ZERO) == 0 && balancePayAmount.compareTo(BigDecimal.ZERO) > 0) { |
| | | changeUserBalance(userId, balancePayAmount.negate()); |
| | | } |
| | | if (thirdPayAmount.compareTo(BigDecimal.ZERO) == 0) { |
| | |
| | | TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, out_trade_no)); |
| | | if (chargingOrder.getRechargePaymentStatus() == 2) { |
| | | return AjaxResult.success(); |
| | | } |
| | | if (isBalancePayMode(chargingOrder.getPayMethod()) |
| | | && money(chargingOrder.getThirdPayAmount()).compareTo(BigDecimal.ZERO) > 0 |
| | | && money(chargingOrder.getBalancePayAmount()).compareTo(BigDecimal.ZERO) > 0) { |
| | | TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData(); |
| | | if (money(appUser.getBalance()).compareTo(money(chargingOrder.getBalancePayAmount())) < 0) { |
| | | throw new RuntimeException("余额不足,支付回调处理失败"); |
| | | } |
| | | changeUserBalance(chargingOrder.getAppUserId(), money(chargingOrder.getBalancePayAmount()).negate()); |
| | | } |
| | | chargingOrder.setRechargePaymentStatus(2); |
| | | chargingOrder.setRechargeSerialNumber(transaction_id); |
| | |
| | | if(tryLock){ |
| | | log.info(code + ":-------------------充电启动失败,执行退款-------------------"); |
| | | TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code)); |
| | | if (chargingOrder.getOrderSource() == 1 && chargingOrder.getStatus() == 2) { |
| | | if (chargingOrder.getOrderSource() == 1 && chargingOrder.getStatus() == 2 |
| | | && (chargingOrder.getRefundStatus() == null || chargingOrder.getRefundStatus() != 2)) { |
| | | Integer rechargePaymentType = chargingOrder.getRechargePaymentType(); |
| | | BigDecimal rechargeAmount = chargingOrder.getRechargeAmount(); |
| | | BigDecimal rechargeAmount = money(chargingOrder.getRechargeAmount()); |
| | | BigDecimal totalRefundAmount = isBalancePayMode(chargingOrder.getPayMethod()) |
| | | ? money(chargingOrder.getBalancePayAmount()).add(money(chargingOrder.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP) |
| | | : rechargeAmount; |
| | | BigDecimal thirdRefundAmount = totalRefundAmount.min(money(chargingOrder.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP); |
| | | if (!isBalancePayMode(chargingOrder.getPayMethod())) { |
| | | thirdRefundAmount = totalRefundAmount; |
| | | } |
| | | BigDecimal balanceRefundAmount = totalRefundAmount.subtract(thirdRefundAmount).min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP); |
| | | //构建退款明细 |
| | | TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund(); |
| | | chargingOrderRefund.setChargingOrderId(chargingOrder.getId()); |
| | | SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); |
| | | chargingOrderRefund.setRefundCode("CDF" + sdf.format(new Date()) + Double.valueOf(Math.random() * 1000).intValue()); |
| | | chargingOrderRefund.setRefundAmount(rechargeAmount); |
| | | chargingOrderRefund.setRefundAmount(totalRefundAmount); |
| | | chargingOrderRefund.setRefundStatus(1); |
| | | chargingOrderRefund.setPayType(rechargePaymentType); |
| | | chargingOrderRefund.setRefundStatus(1); |
| | |
| | | chargingOrderRefund.setRefundContent("充电失败"); |
| | | chargingOrderRefund.setRefundReason("充电失败"); |
| | | chargingOrderRefund.setRefundRemark("全额退款"); |
| | | chargingOrderRefund.setRefundTotalAmount(rechargeAmount); |
| | | chargingOrderRefund.setRefundTotalAmount(totalRefundAmount); |
| | | chargingOrderRefund.setPayAmount(rechargeAmount); |
| | | chargingOrder.setBalanceRefundAmount(balanceRefundAmount); |
| | | chargingOrder.setThirdRefundAmount(thirdRefundAmount); |
| | | chargingOrder.setRefundAmount(totalRefundAmount); |
| | | chargingOrder.setRefundStatus(thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 ? 1 : 2); |
| | | if (thirdRefundAmount.compareTo(BigDecimal.ZERO) == 0) { |
| | | if (balanceRefundAmount.compareTo(BigDecimal.ZERO) > 0) { |
| | | changeUserBalance(chargingOrder.getAppUserId(), balanceRefundAmount); |
| | | } |
| | | chargingOrderRefund.setRefundStatus(2); |
| | | chargingOrderRefund.setRefundSerialNumber("BALANCE"); |
| | | chargingOrderRefund.setRefundTime(LocalDateTime.now()); |
| | | chargingOrderRefundService.save(chargingOrderRefund); |
| | | this.updateById(chargingOrder); |
| | | return; |
| | | } |
| | | this.updateById(chargingOrder); |
| | | chargingOrderRefund.setRefundAmount(thirdRefundAmount); |
| | | if (1 == rechargePaymentType) { |
| | | WxPaymentRefundModel model = new WxPaymentRefundModel(); |
| | | model.setOut_trade_no(chargingOrder.getCode()); |
| | |
| | | model.setReason("充电失败,取消充电订单"); |
| | | model.setNotify_url("/payment/wx/refund/notify"); |
| | | WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount(); |
| | | amount.setRefund(rechargeAmount.multiply(new BigDecimal(100)).intValue()); |
| | | amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue()); |
| | | amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue()); |
| | | amount.setTotal((isBalancePayMode(chargingOrder.getPayMethod()) ? money(chargingOrder.getThirdPayAmount()) : rechargeAmount).multiply(new BigDecimal(100)).intValue()); |
| | | amount.setCurrency("CNY"); |
| | | model.setAmount(amount); |
| | | R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model); |
| | |
| | | RefundReq dto = new RefundReq(); |
| | | dto.setOutTradeNo(chargingOrder.getCode()); |
| | | dto.setOutRequestNo(chargingOrderRefund.getCode()); |
| | | dto.setRefundAmount(rechargeAmount.toString()); |
| | | dto.setRefundAmount(thirdRefundAmount.toString()); |
| | | dto.setRefundReason("充电失败,取消充电订单"); |
| | | RefundResp resp = aliPaymentClient.refund(dto).getData(); |
| | | if (null != resp) { |
| | |
| | | RefundReq dto = new RefundReq(); |
| | | dto.setOutTradeNo(chargingOrder.getRechargeSerialNumber()); |
| | | dto.setOutRequestNo(chargingOrderRefund.getCode()); |
| | | dto.setRefundAmount(rechargeAmount.toString()); |
| | | dto.setRefundAmount(thirdRefundAmount.toString()); |
| | | dto.setRefundReason("充电失败,取消充电订单"); |
| | | RefundResp resp = h5AliPaymentClient.refund(dto).getData(); |
| | | if (null != resp && "10000".equals(resp.getCode())) { |
| | |
| | | chargingOrderRefundService.updateById(one); |
| | | |
| | | TChargingOrder order = this.getById(one.getChargingOrderId()); |
| | | if (money(order.getBalanceRefundAmount()).compareTo(BigDecimal.ZERO) > 0) { |
| | | changeUserBalance(order.getAppUserId(), money(order.getBalanceRefundAmount())); |
| | | } |
| | | TChargingOrder chargingOrder = new TChargingOrder(); |
| | | chargingOrder.setId(one.getChargingOrderId()); |
| | | chargingOrder.setAppUserId(order.getAppUserId()); |
| | |
| | | } |
| | | chargingOrder.setCouponDiscountAmount(couponDiscount.setScale(2, RoundingMode.HALF_EVEN)); |
| | | chargingOrder.setServiceCharge(serviceCharge_total.setScale(2, RoundingMode.HALF_EVEN)); |
| | | BigDecimal balanceUsedAmount = BigDecimal.ZERO; |
| | | if (isBalancePayMode(chargingOrder.getPayMethod()) && chargingOrder.getAppUserId() != null && payAmount.compareTo(BigDecimal.ZERO) > 0) { |
| | | balanceUsedAmount = money(chargingOrder.getBalancePayAmount()).min(payAmount).setScale(2, RoundingMode.HALF_UP); |
| | | if (balanceUsedAmount.compareTo(BigDecimal.ZERO) > 0) { |
| | | ExchangeCodeConsumeDTO exchangeCodeConsumeDTO = new ExchangeCodeConsumeDTO(); |
| | | exchangeCodeConsumeDTO.setUserId(chargingOrder.getAppUserId()); |
| | | exchangeCodeConsumeDTO.setOrderId(chargingOrder.getId()); |
| | | exchangeCodeConsumeDTO.setAmount(balanceUsedAmount); |
| | | R<ExchangeCodeConsumeResultVO> consumeResult = otherClient.consumeExchangeCodeBalance(exchangeCodeConsumeDTO); |
| | | if (consumeResult != null && consumeResult.getData() != null |
| | | && consumeResult.getData().getDeductedAmount() != null) { |
| | | balanceUsedAmount = consumeResult.getData().getDeductedAmount(); |
| | | } |
| | | } |
| | | } |
| | | BigDecimal balanceRefundAmount = money(chargingOrder.getBalancePayAmount()).subtract(balanceUsedAmount); |
| | | if (balanceRefundAmount.compareTo(BigDecimal.ZERO) > 0) { |
| | | changeUserBalance(chargingOrder.getAppUserId(), balanceRefundAmount); |
| | | } |
| | | BigDecimal actualThirdPayAmount = payAmount.subtract(balanceUsedAmount); |
| | | refundAmount = refundAmount.max(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP); |
| | | BigDecimal thirdRefundAmount = refundAmount.min(money(chargingOrder.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP); |
| | | BigDecimal balanceRefundAmount = refundAmount.subtract(thirdRefundAmount).min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP); |
| | | BigDecimal actualThirdPayAmount = money(chargingOrder.getThirdPayAmount()).subtract(thirdRefundAmount); |
| | | if (actualThirdPayAmount.compareTo(BigDecimal.ZERO) < 0) { |
| | | actualThirdPayAmount = BigDecimal.ZERO; |
| | | } |
| | | BigDecimal thirdRefundAmount = money(chargingOrder.getThirdPayAmount()).subtract(actualThirdPayAmount); |
| | | if (thirdRefundAmount.compareTo(BigDecimal.ZERO) < 0) { |
| | | thirdRefundAmount = BigDecimal.ZERO; |
| | | BigDecimal actualBalancePayAmount = money(chargingOrder.getBalancePayAmount()).subtract(balanceRefundAmount); |
| | | if (actualBalancePayAmount.compareTo(BigDecimal.ZERO) < 0) { |
| | | actualBalancePayAmount = BigDecimal.ZERO; |
| | | } |
| | | if (isBalancePayMode(chargingOrder.getPayMethod()) && chargingOrder.getAppUserId() != null |
| | | && actualBalancePayAmount.compareTo(BigDecimal.ZERO) > 0) { |
| | | ExchangeCodeConsumeDTO exchangeCodeConsumeDTO = new ExchangeCodeConsumeDTO(); |
| | | exchangeCodeConsumeDTO.setUserId(chargingOrder.getAppUserId()); |
| | | exchangeCodeConsumeDTO.setOrderId(chargingOrder.getId()); |
| | | exchangeCodeConsumeDTO.setAmount(actualBalancePayAmount); |
| | | otherClient.consumeExchangeCodeBalance(exchangeCodeConsumeDTO); |
| | | } |
| | | refundAmount = thirdRefundAmount.add(balanceRefundAmount); |
| | | chargingOrder.setBalanceRefundAmount(balanceRefundAmount.setScale(2, RoundingMode.HALF_UP)); |
| | |
| | | model.setReason("充电完成退款"); |
| | | model.setNotify_url("/payment/wx/refund/notify"); |
| | | WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount(); |
| | | amount.setRefund(refundAmount.multiply(new BigDecimal(100)).intValue()); |
| | | amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue()); |
| | | amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue()); |
| | | amount.setCurrency("CNY"); |
| | | model.setAmount(amount); |
| | |
| | | chargingOrderRefundService.save(chargingOrderRefund); |
| | | } |
| | | } |
| | | if (2 == rechargePaymentType) { |
| | | if (thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 && 2 == rechargePaymentType) { |
| | | RefundReq dto = new RefundReq(); |
| | | dto.setOutTradeNo(chargingOrder.getCode()); |
| | | dto.setOutRequestNo(chargingOrderRefund.getRefundCode()); |
| | | dto.setRefundAmount(refundAmount.toString()); |
| | | dto.setRefundAmount(thirdRefundAmount.toString()); |
| | | dto.setRefundReason("充电完成退款"); |
| | | RefundResp resp = aliPaymentClient.refund(dto).getData(); |
| | | if (null != resp) { |
| | |
| | | this.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null); |
| | | } |
| | | } |
| | | if (3 == rechargePaymentType) { |
| | | if (thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 && 3 == rechargePaymentType) { |
| | | RefundReq dto = new RefundReq(); |
| | | dto.setOutTradeNo(chargingOrder.getRechargeSerialNumber()); |
| | | dto.setOutRequestNo(chargingOrderRefund.getRefundCode()); |
| | | dto.setRefundAmount(refundAmount.toString()); |
| | | dto.setRefundAmount(thirdRefundAmount.toString()); |
| | | dto.setRefundReason("充电完成退款"); |
| | | RefundResp resp = h5AliPaymentClient.refund(dto).getData(); |
| | | if (null != resp && "10000".equals(resp.getCode())) { |