| | |
| | | * @param addChargingOrder |
| | | * @return |
| | | */ |
| | | |
| | | 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 changeUserBalance(Long userId, BigDecimal delta) { |
| | | if (userId == null || delta == null || delta.compareTo(BigDecimal.ZERO) == 0) { |
| | | return; |
| | | } |
| | | TAppUser appUser = appUserClient.getUserById(userId).getData(); |
| | | if (appUser == null) { |
| | | throw new RuntimeException("用户不存在"); |
| | | } |
| | | appUser.setBalance(money(appUser.getBalance()).add(delta).setScale(2, RoundingMode.HALF_UP)); |
| | | appUserClient.updateAppUser(appUser); |
| | | } |
| | | @Override |
| | | public AjaxResult paymentChargingOrder(AddChargingOrder addChargingOrder) { |
| | | Long userId = tokenService.getLoginUserApplet().getUserId(); |
| | | TAppUser appUser = appUserClient.getUserById(userId).getData(); |
| | | Integer payMethod = addChargingOrder.getPayMethod() == null ? 3 : addChargingOrder.getPayMethod(); |
| | | BigDecimal rechargeAmount = money(addChargingOrder.getPaymentAmount()); |
| | | BigDecimal userBalance = money(appUser.getBalance()); |
| | | BigDecimal balancePayAmount = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP); |
| | | BigDecimal thirdPayAmount = rechargeAmount; |
| | | if (isBalancePayMode(payMethod)) { |
| | | addChargingOrder.setAppUserCouponId(null); |
| | | if (payMethod == 1 && userBalance.compareTo(rechargeAmount) < 0) { |
| | | return AjaxResult.error("余额不足,请选择组合支付或第三方支付"); |
| | | } |
| | | balancePayAmount = payMethod == 1 ? rechargeAmount : userBalance.min(rechargeAmount).setScale(2, RoundingMode.HALF_UP); |
| | | thirdPayAmount = rechargeAmount.subtract(balancePayAmount).setScale(2, RoundingMode.HALF_UP); |
| | | } |
| | | //查询待支付状态的订单,没有支付则删除订单 |
| | | List<TChargingOrder> list = this.list(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, userId) |
| | | .eq(TChargingOrder::getRechargePaymentStatus, 1).eq(TChargingOrder::getDelFlag, 0)); |
| | |
| | | chargingOrder.setChargingGunId(addChargingOrder.getId()); |
| | | chargingOrder.setRechargePaymentType(addChargingOrder.getPaymentType()); |
| | | chargingOrder.setRechargePaymentStatus(1); |
| | | chargingOrder.setRechargeAmount(addChargingOrder.getPaymentAmount()); |
| | | chargingOrder.setPayMethod(payMethod); |
| | | chargingOrder.setBalancePayAmount(balancePayAmount); |
| | | chargingOrder.setThirdPayAmount(thirdPayAmount); |
| | | chargingOrder.setBalanceRefundAmount(BigDecimal.ZERO); |
| | | chargingOrder.setThirdRefundAmount(BigDecimal.ZERO); |
| | | chargingOrder.setRechargeAmount(rechargeAmount); |
| | | chargingOrder.setAppCouponId(addChargingOrder.getAppUserCouponId()); |
| | | chargingOrder.setVipDiscountAmount(BigDecimal.ZERO); |
| | | chargingOrder.setOrderSource(1); |
| | |
| | | TAccountingStrategy accountingStrategy = accountingStrategyClient.getAccountingStrategyById(accountingStrategyId).getData(); |
| | | |
| | | //直营站点才可以享受会员折扣 |
| | | if (null != appUser.getVipId() && 1 == site.getBusinessCategory()) { |
| | | if (!isBalancePayMode(payMethod) && null != appUser.getVipId() && 1 == site.getBusinessCategory()) { |
| | | TVip vip = vipClient.getInfo1(appUser.getVipId()).getData(); |
| | | BigDecimal discount = null; |
| | | if (1 == vip.getType()) { |
| | |
| | | } |
| | | accountingStrategyDetailOrderService.saveBatch(list1); |
| | | |
| | | if (balancePayAmount.compareTo(BigDecimal.ZERO) > 0) { |
| | | changeUserBalance(userId, balancePayAmount.negate()); |
| | | } |
| | | if (thirdPayAmount.compareTo(BigDecimal.ZERO) == 0) { |
| | | return chargingOrderCallback(addChargingOrder.getPaymentType(), chargingOrder.getCode(), "BALANCE", null); |
| | | } |
| | | //会员优惠折扣将其计入增加充电时长(增加总充电金额) |
| | | //如果充电总金额未使用完,则需要退回费用=(原金额/总金额)*(总金额-实际充电金额) |
| | | if (1 == addChargingOrder.getPaymentType()) { |
| | | PaymentOrder paymentOrder = new PaymentOrder(); |
| | | paymentOrder.setCode(chargingOrder.getCode()); |
| | | paymentOrder.setAmount(addChargingOrder.getPaymentAmount()); |
| | | paymentOrder.setAmount(thirdPayAmount); |
| | | paymentOrder.setOpenId(appUser.getWxOpenid()); |
| | | paymentOrder.setDescription("充电充值"); |
| | | paymentOrder.setNotifyUrl("/payment/wx/pay/notify"); |
| | |
| | | if (2 == addChargingOrder.getPaymentType()) { |
| | | AliPaymentReq req = new AliPaymentReq(); |
| | | req.setOutTradeNo(chargingOrder.getCode()); |
| | | req.setTotalAmount(addChargingOrder.getPaymentAmount().toString()); |
| | | req.setTotalAmount(thirdPayAmount.toString()); |
| | | req.setSubject("充电充值"); |
| | | req.setBuyerOpenId(appUser.getAliOpenid()); |
| | | req.setBody("充电充值"); |
| | |
| | | if (3 == addChargingOrder.getPaymentType()) { |
| | | AliPaymentReq req = new AliPaymentReq(); |
| | | req.setOutTradeNo(chargingOrder.getCode()); |
| | | req.setTotalAmount(addChargingOrder.getPaymentAmount().toString()); |
| | | req.setTotalAmount(thirdPayAmount.toString()); |
| | | req.setSubject("充电充值"); |
| | | req.setBuyerOpenId(appUser.getAliOpenid()); |
| | | req.setBody("充电充值"); |
| | |
| | | |
| | | //计算优惠券 |
| | | BigDecimal couponDiscount = BigDecimal.ZERO; |
| | | if (null != chargingOrder.getAppCouponId()) { |
| | | if (!isBalancePayMode(chargingOrder.getPayMethod()) && null != chargingOrder.getAppCouponId()) { |
| | | //判断实际充电金额是否满足优惠券使用条件,如果不满足则不适用优惠券。 |
| | | TAppCoupon appCoupon = appCouponClient.getAppCouponById(chargingOrder.getAppCouponId()).getData(); |
| | | String couponJson = appCoupon.getCouponJson(); |
| | |
| | | } |
| | | chargingOrder.setCouponDiscountAmount(couponDiscount.setScale(2, RoundingMode.HALF_EVEN)); |
| | | chargingOrder.setServiceCharge(serviceCharge_total.setScale(2, RoundingMode.HALF_EVEN)); |
| | | BigDecimal exchangeCodeDeductAmount = BigDecimal.ZERO; |
| | | if (chargingOrder.getAppUserId() != null && payAmount.compareTo(BigDecimal.ZERO) > 0) { |
| | | 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(payAmount.setScale(2, RoundingMode.HALF_EVEN)); |
| | | exchangeCodeConsumeDTO.setAmount(balanceUsedAmount); |
| | | R<ExchangeCodeConsumeResultVO> consumeResult = otherClient.consumeExchangeCodeBalance(exchangeCodeConsumeDTO); |
| | | if (consumeResult != null && consumeResult.getData() != null |
| | | && consumeResult.getData().getDeductedAmount() != null) { |
| | | exchangeCodeDeductAmount = consumeResult.getData().getDeductedAmount(); |
| | | balanceUsedAmount = consumeResult.getData().getDeductedAmount(); |
| | | } |
| | | } |
| | | payAmount = payAmount.subtract(exchangeCodeDeductAmount); |
| | | if (payAmount.compareTo(BigDecimal.ZERO) < 0) { |
| | | payAmount = BigDecimal.ZERO; |
| | | } |
| | | chargingOrder.setPaymentAmount(payAmount.setScale(2, RoundingMode.HALF_EVEN)); |
| | | BigDecimal balanceRefundAmount = money(chargingOrder.getBalancePayAmount()).subtract(balanceUsedAmount); |
| | | if (balanceRefundAmount.compareTo(BigDecimal.ZERO) > 0) { |
| | | changeUserBalance(chargingOrder.getAppUserId(), balanceRefundAmount); |
| | | } |
| | | BigDecimal actualThirdPayAmount = payAmount.subtract(balanceUsedAmount); |
| | | 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; |
| | | } |
| | | refundAmount = thirdRefundAmount.add(balanceRefundAmount); |
| | | chargingOrder.setBalanceRefundAmount(balanceRefundAmount.setScale(2, RoundingMode.HALF_UP)); |
| | | chargingOrder.setThirdRefundAmount(thirdRefundAmount.setScale(2, RoundingMode.HALF_UP)); |
| | | chargingOrder.setPaymentAmount(actualThirdPayAmount.setScale(2, RoundingMode.HALF_EVEN)); |
| | | chargingOrder.setRefundAmount(refundAmount.setScale(2, RoundingMode.HALF_EVEN)); |
| | | chargingOrder.setRefundStatus(1); |
| | | UploadRealTimeMonitoringData asc = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode(), "asc"); |