UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -2043,6 +2043,11 @@ } } orderMoney = orderMoney < 0 ? 0 : orderMoney; ResultUtil prepaySettleResult = settlePrivateCarPrepayIfNoSecondPay(orderPrivateCar, userInfo, orderMoney); if (prepaySettleResult != null) { return prepaySettleResult; } orderMoney = getPrivateCarPrepayFinalPayAmount(orderPrivateCar, orderMoney); if (payType == 1) {//微信支付 String outTradeNo = orderId + "_1_" + UUIDUtil.getRandomCode(5); JSONObject response = cbyzxOrderPayHelper.createOrder(orderPrivateCar.getUserId(), userInfo.getAppletsOpenId(), outTradeNo, orderMoney); @@ -2303,7 +2308,14 @@ orderMoney = new BigDecimal(orderMoney).setScale(2, RoundingMode.HALF_UP).doubleValue(); System.out.println("!!!" + orderMoney + "!!!!"); orderMoney = orderMoney < 0 ? 0 : orderMoney; orderPrivateCar.setPayMoney(orderMoney); ResultUtil prepaySettleResult = settlePrivateCarPrepayIfNoSecondPay(orderPrivateCar, userInfo, orderMoney); if (prepaySettleResult != null) { return prepaySettleResult; } orderMoney = getPrivateCarPrepayFinalPayAmount(orderPrivateCar, orderMoney); if (!isPrivateCarPrepaySpreadStage(orderPrivateCar)) { orderPrivateCar.setPayMoney(orderMoney); } if (payType == 1) {//微信支付 if (orderMoney == 0) { return ResultUtil.error("请使用余额支付"); @@ -2599,6 +2611,120 @@ .doubleValue(); } private boolean isPrivateCarPrepayFinalStage(OrderPrivateCar orderPrivateCar) { return orderPrivateCar != null && Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) && !Integer.valueOf(1).equals(orderPrivateCar.getPrepayStage()) && !Integer.valueOf(5).equals(orderPrivateCar.getPrepayStage()) && orderPrivateCar.getPayMoney() != null && orderPrivateCar.getPayMoney() > 0; } private BigDecimal toMoney(Double amount) { return new BigDecimal(String.valueOf(amount == null ? 0D : amount)).setScale(2, RoundingMode.HALF_UP); } private Double getPrivateCarPrepayFinalPayAmount(OrderPrivateCar orderPrivateCar, Double finalAmount) { if (!isPrivateCarPrepayFinalStage(orderPrivateCar)) { return toMoney(finalAmount).doubleValue(); } BigDecimal spreadAmount = toMoney(finalAmount).subtract(toMoney(orderPrivateCar.getPayMoney())).setScale(2, RoundingMode.HALF_UP); if (spreadAmount.compareTo(BigDecimal.ZERO) > 0) { orderPrivateCar.setPrepayStage(3); return spreadAmount.doubleValue(); } return 0D; } private ResultUtil settlePrivateCarPrepayIfNoSecondPay(OrderPrivateCar orderPrivateCar, UserInfo userInfo, Double finalAmount) throws Exception { if (!isPrivateCarPrepayFinalStage(orderPrivateCar)) { return null; } BigDecimal paidAmount = toMoney(orderPrivateCar.getPayMoney()); BigDecimal settleAmount = toMoney(finalAmount); BigDecimal refundAmount = paidAmount.subtract(settleAmount).setScale(2, RoundingMode.HALF_UP); if (refundAmount.compareTo(BigDecimal.ZERO) < 0) { return null; } if (refundAmount.compareTo(BigDecimal.ZERO) > 0) { ResultUtil refundResult = refundPrivateCarPrepayDifference(orderPrivateCar, userInfo, refundAmount.doubleValue()); if (!ResultUtil.SUCCESS.equals(refundResult.getCode())) { return refundResult; } } finishPrivateCarPrepayOrder(orderPrivateCar, settleAmount.doubleValue()); return ResultUtil.success(); } private ResultUtil refundPrivateCarPrepayDifference(OrderPrivateCar orderPrivateCar, UserInfo userInfo, Double refundAmount) throws Exception { if (Integer.valueOf(3).equals(orderPrivateCar.getPayType())) { userInfo.setBalance(new BigDecimal(null != userInfo.getBalance() ? userInfo.getBalance() : 0D) .add(toMoney(refundAmount)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); userInfoService.updateById(userInfo); orderPrivateCar.setPrepayRefundNo("BALANCE_REFUND_1_" + orderPrivateCar.getId() + "_" + ToolUtil.getRandomString(5)); orderPrivateCar.setPrepayRefundAmount(refundAmount); orderPrivateCar.setPrepayRefundTime(new Date()); transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车先付订单退款", refundAmount, 1, 1, 1, 1, orderPrivateCar.getId()); return ResultUtil.success(); } PaymentRecord paymentRecord = paymentRecordService.query(1, orderPrivateCar.getUserId(), 1, orderPrivateCar.getId(), 1, orderPrivateCar.getPayType(), 2); if (paymentRecord == null) { return ResultUtil.error("先付订单缺少已支付流水,无法退款"); } if (Integer.valueOf(1).equals(orderPrivateCar.getPayType())) { CbyzxPayUtil.ClosePayOrderRequest request = new CbyzxPayUtil.ClosePayOrderRequest(); request.setOutRequestNo(ToolUtil.isNotEmpty(orderPrivateCar.getPrepaySecondPayNo()) ? orderPrivateCar.getPrepaySecondPayNo() : paymentRecord.getCode()); request.setRefundOutRequestNo("PREPAY_DIFF_REFUND_1_" + orderPrivateCar.getId() + ToolUtil.getRandomString(5)); request.setRefundAmount(toFen(refundAmount)); request.setRefundDesc("快车先付订单多退少补退款"); JSONObject response = CbyzxPayUtil.closePayOrder(request); if (!isPrivateCarPrepayRefundSuccess(response)) { return ResultUtil.error(extractPrivateCarRefundMessage(response), response); } orderPrivateCar.setPrepayRefundNo(extractPrivateCarRefundNo(response)); orderPrivateCar.setPrepayRefundAmount(refundAmount); orderPrivateCar.setPrepayRefundTime(new Date()); transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车先付订单退款", refundAmount, 1, 1, 1, 1, orderPrivateCar.getId()); return ResultUtil.success(response); } if (Integer.valueOf(2).equals(orderPrivateCar.getPayType())) { Map<String, String> map = payMoneyUtil.aliRefund(paymentRecord.getCode(), refundAmount.toString()); if (!"10000".equals(map.get("code"))) { return ResultUtil.error(map.get("msg")); } orderPrivateCar.setPrepayRefundNo(map.get("trade_no")); orderPrivateCar.setPrepayRefundAmount(refundAmount); orderPrivateCar.setPrepayRefundTime(new Date()); transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车先付订单退款", refundAmount, 1, 1, 1, 1, orderPrivateCar.getId()); return ResultUtil.success(map); } return ResultUtil.error("先付订单支付方式不支持退款"); } private void finishPrivateCarPrepayOrder(OrderPrivateCar orderPrivateCar, Double settleAmount) throws Exception { orderPrivateCar.setState(8); orderPrivateCar.setPayMoney(settleAmount); orderPrivateCar.setPayTime(new Date()); orderPrivateCar.setPrepayStage(5); if (orderPrivateCar.getRecoveryOrder() != null && 0 == orderPrivateCar.getRecoveryOrder()) { Double incomeAmount = (2 == orderPrivateCar.getAbnormal() && 2 == orderPrivateCar.getAbnormalStatus() ? orderPrivateCar.getResponsibilityMoney().doubleValue() : orderPrivateCar.getOrderMoney()); Map<String, Object> map = incomeService.saveIncome(orderPrivateCar.getId(), 1, incomeAmount); orderPrivateCar.setSplitAllocation(JSON.toJSONString(map)); } this.updateAllColumnById(orderPrivateCar); promotion(orderPrivateCar.getId()); new Thread(new Runnable() { @Override public void run() { pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0); pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0); } }).start(); systemNoticeService.addSystemNotice(1, "您的快车先付订单已完成结算,请注意查收。", orderPrivateCar.getUserId(), 1); } private void consumePrivateCarBenefits(OrderPrivateCar orderPrivateCar) throws Exception { if (null != orderPrivateCar.getCouponId()) { UserCouponRecord userCouponRecord = userCouponRecordService.selectById(orderPrivateCar.getCouponId()); UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java
@@ -1355,6 +1355,11 @@ } } ResultUtil prepaySettleResult = settleTaxiPrepayIfNoSecondPay(orderTaxi, userInfo, orderMoney); if (prepaySettleResult != null) { return prepaySettleResult; } orderMoney = getTaxiPrepayFinalPayAmount(orderTaxi, orderMoney); if (payType == 1) {//微信支付 String outTradeNo = orderId + "_2_" + UUIDUtil.getRandomCode(5); JSONObject response = cbyzxOrderPayHelper.createOrder(orderTaxi.getUserId(), userInfo.getAppletsOpenId(), outTradeNo, orderMoney); @@ -1608,6 +1613,11 @@ } orderMoney = orderMoney < 0 ? 0 : orderMoney; orderMoney = new BigDecimal(orderMoney).setScale(2, RoundingMode.HALF_UP).doubleValue(); ResultUtil prepaySettleResult = settleTaxiPrepayIfNoSecondPay(orderTaxi, userInfo, orderMoney); if (prepaySettleResult != null) { return prepaySettleResult; } orderMoney = getTaxiPrepayFinalPayAmount(orderTaxi, orderMoney); System.out.println("!!!" + orderMoney + "!!!!"); if (payType == 1) {//微信支付 if (orderMoney == 0) { @@ -1748,6 +1758,11 @@ return ResultUtil.error("订单不在待支付中,无法完成订单"); } orderTaxi.setPayManner(2);//其他方式支付 UserInfo userInfo = userInfoService.selectById(orderTaxi.getUserId()); ResultUtil prepaySettleResult = settleTaxiPrepayIfNoSecondPay(orderTaxi, userInfo, orderTaxi.getOrderMoney()); if (prepaySettleResult != null) { return prepaySettleResult; } // orderTaxi.setOrderMoney(0D); // orderTaxi.setTravelMoney(0D); // orderTaxi.setParkMoney(0D); @@ -2094,6 +2109,120 @@ .doubleValue(); } private boolean isTaxiPrepayFinalStage(OrderTaxi orderTaxi) { return orderTaxi != null && Integer.valueOf(1).equals(orderTaxi.getPaymentMode()) && !Integer.valueOf(1).equals(orderTaxi.getPrepayStage()) && !Integer.valueOf(5).equals(orderTaxi.getPrepayStage()) && orderTaxi.getPayMoney() != null && orderTaxi.getPayMoney() > 0; } private BigDecimal toMoney(Double amount) { return new BigDecimal(String.valueOf(amount == null ? 0D : amount)).setScale(2, RoundingMode.HALF_UP); } private Double getTaxiPrepayFinalPayAmount(OrderTaxi orderTaxi, Double finalAmount) { if (!isTaxiPrepayFinalStage(orderTaxi)) { return toMoney(finalAmount).doubleValue(); } BigDecimal spreadAmount = toMoney(finalAmount).subtract(toMoney(orderTaxi.getPayMoney())).setScale(2, RoundingMode.HALF_UP); if (spreadAmount.compareTo(BigDecimal.ZERO) > 0) { orderTaxi.setPrepayStage(3); return spreadAmount.doubleValue(); } return 0D; } private ResultUtil settleTaxiPrepayIfNoSecondPay(OrderTaxi orderTaxi, UserInfo userInfo, Double finalAmount) throws Exception { if (!isTaxiPrepayFinalStage(orderTaxi)) { return null; } BigDecimal paidAmount = toMoney(orderTaxi.getPayMoney()); BigDecimal settleAmount = toMoney(finalAmount); BigDecimal refundAmount = paidAmount.subtract(settleAmount).setScale(2, RoundingMode.HALF_UP); if (refundAmount.compareTo(BigDecimal.ZERO) < 0) { return null; } if (refundAmount.compareTo(BigDecimal.ZERO) > 0) { ResultUtil refundResult = refundTaxiPrepayDifference(orderTaxi, userInfo, refundAmount.doubleValue()); if (!ResultUtil.SUCCESS.equals(refundResult.getCode())) { return refundResult; } } finishTaxiPrepayOrder(orderTaxi, settleAmount.doubleValue()); return ResultUtil.success(); } private ResultUtil refundTaxiPrepayDifference(OrderTaxi orderTaxi, UserInfo userInfo, Double refundAmount) throws Exception { if (Integer.valueOf(3).equals(orderTaxi.getPayType())) { userInfo.setBalance(new BigDecimal(null != userInfo.getBalance() ? userInfo.getBalance() : 0D) .add(toMoney(refundAmount)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); userInfoService.updateById(userInfo); orderTaxi.setPrepayRefundNo("BALANCE_REFUND_2_" + orderTaxi.getId() + "_" + ToolUtil.getRandomString(5)); orderTaxi.setPrepayRefundAmount(refundAmount); orderTaxi.setPrepayRefundTime(new Date()); transactionDetailsService.saveData(orderTaxi.getUserId(), "出租车先付订单退款", refundAmount, 1, 1, 1, 2, orderTaxi.getId()); return ResultUtil.success(); } PaymentRecord paymentRecord = paymentRecordService.query(1, orderTaxi.getUserId(), 1, orderTaxi.getId(), 2, orderTaxi.getPayType(), 2); if (paymentRecord == null) { return ResultUtil.error("先付订单缺少已支付流水,无法退款"); } if (Integer.valueOf(1).equals(orderTaxi.getPayType())) { CbyzxPayUtil.ClosePayOrderRequest request = new CbyzxPayUtil.ClosePayOrderRequest(); request.setOutRequestNo(ToolUtil.isNotEmpty(orderTaxi.getPrepaySecondPayNo()) ? orderTaxi.getPrepaySecondPayNo() : paymentRecord.getCode()); request.setRefundOutRequestNo("PREPAY_DIFF_REFUND_2_" + orderTaxi.getId() + ToolUtil.getRandomString(5)); request.setRefundAmount(toFen(refundAmount)); request.setRefundDesc("出租车先付订单多退少补退款"); JSONObject response = CbyzxPayUtil.closePayOrder(request); if (!isTaxiPrepayRefundSuccess(response)) { return ResultUtil.error(extractTaxiRefundMessage(response), response); } orderTaxi.setPrepayRefundNo(extractTaxiRefundNo(response)); orderTaxi.setPrepayRefundAmount(refundAmount); orderTaxi.setPrepayRefundTime(new Date()); transactionDetailsService.saveData(orderTaxi.getUserId(), "出租车先付订单退款", refundAmount, 1, 1, 1, 2, orderTaxi.getId()); return ResultUtil.success(response); } if (Integer.valueOf(2).equals(orderTaxi.getPayType())) { Map<String, String> map = payMoneyUtil.aliRefund(paymentRecord.getCode(), refundAmount.toString()); if (!"10000".equals(map.get("code"))) { return ResultUtil.error(map.get("msg")); } orderTaxi.setPrepayRefundNo(map.get("trade_no")); orderTaxi.setPrepayRefundAmount(refundAmount); orderTaxi.setPrepayRefundTime(new Date()); transactionDetailsService.saveData(orderTaxi.getUserId(), "出租车先付订单退款", refundAmount, 1, 1, 1, 2, orderTaxi.getId()); return ResultUtil.success(map); } return ResultUtil.error("先付订单支付方式不支持退款"); } private void finishTaxiPrepayOrder(OrderTaxi orderTaxi, Double settleAmount) throws Exception { orderTaxi.setState(8); orderTaxi.setPayMoney(settleAmount); orderTaxi.setPayTime(new Date()); orderTaxi.setPrepayStage(5); if (0 == orderTaxi.getRecoveryOrder()) { Double incomeAmount = (2 == orderTaxi.getAbnormal() && 2 == orderTaxi.getAbnormalStatus() ? orderTaxi.getResponsibilityMoney().doubleValue() : orderTaxi.getOrderMoney()); Map<String, Object> map = incomeService.saveIncome(orderTaxi.getId(), 2, incomeAmount); orderTaxi.setSplitAllocation(JSON.toJSONString(map)); } this.updateAllColumnById(orderTaxi); promotion(orderTaxi.getId()); new Thread(new Runnable() { @Override public void run() { pushUtil.pushOrderState(1, orderTaxi.getUserId(), orderTaxi.getId(), 2, orderTaxi.getState(), 0); pushUtil.pushOrderState(2, orderTaxi.getDriverId(), orderTaxi.getId(), 2, orderTaxi.getState(), 0); } }).start(); systemNoticeService.addSystemNotice(1, "您的出租车先付订单已完成结算,请注意查收。", orderTaxi.getUserId(), 1); } private void consumeTaxiBenefits(OrderTaxi orderTaxi) throws Exception { if (null != orderTaxi.getCouponId()) { UserCouponRecord userCouponRecord = userCouponRecordService.selectById(orderTaxi.getCouponId());