diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/Order.java b/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/Order.java index b5c1a13..588449c 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/Order.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/Order.java @@ -249,4 +249,20 @@ public class Order extends BaseEntity { @Excel(name = "是否改过价") @ApiModelProperty("是否改过价") private Boolean priceChanged; + + @Excel(name = "骑行费退款") + @ApiModelProperty("骑行费退款") + private BigDecimal ridingRefund; + + @Excel(name = "调度费退款") + @ApiModelProperty("调度费退款") + private BigDecimal dispatchRefund; + + @Excel(name = "管理费退款") + @ApiModelProperty("管理费退款") + private BigDecimal manageRefund; + + @Excel(name = "车损费退款") + @ApiModelProperty("车损费退款") + private BigDecimal deductionRefund; } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/OrderVO.java b/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/OrderVO.java index 2859efa..7e09f0d 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/OrderVO.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/OrderVO.java @@ -4,7 +4,6 @@ import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; -import com.ruoyi.bst.order.constants.OrderConstants; import com.ruoyi.bst.order.utils.OrderUtil; import com.ruoyi.bst.orderDevice.domain.OrderDeviceVO; import com.ruoyi.common.utils.MathUtils; @@ -101,16 +100,26 @@ public class OrderVO extends Order implements IotDevice { return this.currentLat; } - // 允许押金退款金额 - public BigDecimal getCanDepositRefundAmount() { - return OrderUtil.calcCanAdminRefundAmount(this, OrderConstants.REFUND_TYPE_DEPOSIT); + // 实收骑行费(含退款) + public BigDecimal getActualReceivedRidingFee() { + return MathUtils.subtractDecimal(this.getActualRidingFee(), this.getRidingRefund()); } - // 允许骑行费退款金额 - public BigDecimal getCanRideRefundAmount() { - return OrderUtil.calcCanAdminRefundAmount(this, OrderConstants.REFUND_TYPE_RIDE); + // 实收调度费(含退款) + public BigDecimal getActualReceivedDispatchFee() { + return MathUtils.subtractDecimal(this.getActualDispatchFee(), this.getDispatchRefund()); } + // 实收管理费(含退款) + public BigDecimal getActualReceivedManageFee() { + return MathUtils.subtractDecimal(this.getActualManageFee(), this.getManageRefund()); + } + + // 实收车损费(含退款) + public BigDecimal getActualReceivedDeductionFee() { + return MathUtils.subtractDecimal(this.getActualDeductionFee(), this.getDeductionRefund()); + } + // 允许自动退款金额 public BigDecimal getCanAutoRefundAmount() { return OrderUtil.calcCanAutoRefundAmount(this); diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/bo/OrderCreateBO.java b/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/bo/OrderCreateBO.java index fa1ddb7..0b61aa7 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/bo/OrderCreateBO.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/bo/OrderCreateBO.java @@ -41,6 +41,9 @@ public class OrderCreateBO { // 下单用户 private UserVO user; + // 未支付的订单数量 + private Integer unpaidCount; + // 用户进行中的订单设备 private OrderDeviceVO userOrderDevice; diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/dto/OrderRefundDTO.java b/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/dto/OrderRefundDTO.java index 5c9b468..3b2b292 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/dto/OrderRefundDTO.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/dto/OrderRefundDTO.java @@ -3,7 +3,6 @@ package com.ruoyi.bst.order.domain.dto; import java.math.BigDecimal; import javax.validation.constraints.Min; -import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; @@ -19,10 +18,21 @@ public class OrderRefundDTO implements LogBizParam { @NotNull(message = "订单ID不允许为空") private Long orderId; - @ApiModelProperty("退款金额") - @NotNull(message = "退款金额不允许为空") - @Min(value = 0, message = "退款金额不允许小于0") - private BigDecimal amount; + @ApiModelProperty("骑行费退款") + @Min(value = 0, message = "骑行费退款不允许小于0") + private BigDecimal ridingRefund; + + @ApiModelProperty("调度费退款") + @Min(value = 0, message = "调度费退款不允许小于0") + private BigDecimal dispatchRefund; + + @ApiModelProperty("管理费退款") + @Min(value = 0, message = "管理费退款不允许小于0") + private BigDecimal manageRefund; + + @ApiModelProperty("车损费退款") + @Min(value = 0, message = "车损费退款不允许小于0") + private BigDecimal deductionRefund; @ApiModelProperty("退款原因") @Size(max = 200, message = "退款原因不允许超过200个字符") @@ -34,10 +44,6 @@ public class OrderRefundDTO implements LogBizParam { @ApiModelProperty("操作人名称") private String userName; - @ApiModelProperty("退款类型:1-押金退款,2-骑行费退款") - @NotBlank(message = "退款类型不允许为空") - private String refundType; - @Override public Object logBizId() { return orderId; diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/dto/OrderRefundDetailDTO.java b/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/dto/OrderRefundDetailDTO.java new file mode 100644 index 0000000..bbb699f --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/dto/OrderRefundDetailDTO.java @@ -0,0 +1,27 @@ +package com.ruoyi.bst.order.domain.dto; + +import java.math.BigDecimal; + +import com.ruoyi.common.utils.MathUtils; + +import lombok.Data; + +@Data +public class OrderRefundDetailDTO { + + // 骑行费 + private BigDecimal ridingRefund; + + // 调度费 + private BigDecimal dispatchRefund; + + // 管理费 + private BigDecimal manageRefund; + + // 车损费 + private BigDecimal deductionRefund; + + public BigDecimal getTotalRefund() { + return MathUtils.addDecimal(ridingRefund, dispatchRefund, manageRefund, deductionRefund); + } +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/order/mapper/OrderMapper.java b/ruoyi-service/src/main/java/com/ruoyi/bst/order/mapper/OrderMapper.java index f9ab7b8..ad29f86 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/order/mapper/OrderMapper.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/order/mapper/OrderMapper.java @@ -209,4 +209,12 @@ public interface OrderMapper { */ int deductDeposit(@Param("id") Long id, @Param("amount") BigDecimal amount); + /** + * 更新退款信息 + * @param data + * @param query + * @return + */ + int updateRefund(@Param("data") Order data, @Param("query") OrderQuery query); + } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/order/mapper/OrderMapper.xml b/ruoyi-service/src/main/java/com/ruoyi/bst/order/mapper/OrderMapper.xml index 0639d3b..9a3c5b9 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/order/mapper/OrderMapper.xml +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/order/mapper/OrderMapper.xml @@ -67,6 +67,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" bo.admin_refund_amount, bo.ride_pay_time, bo.price_changed, + bo.riding_refund, + bo.dispatch_refund, + bo.manage_refund, + bo.deduction_refund, as deposit_deduct_remain, ba.name as area_name, su.nick_name as user_name, @@ -283,6 +287,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" admin_refund_amount, ride_pay_time, price_changed, + riding_refund, + dispatch_refund, + manage_refund, + deduction_refund, #{no}, @@ -340,6 +348,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{adminRefundAmount}, #{ridePayTime}, #{priceChanged}, + #{ridingRefund}, + #{dispatchRefund}, + #{manageRefund}, + #{deductionRefund}, @@ -407,6 +419,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" admin_refund_amount = #{data.adminRefundAmount}, ride_pay_time = #{data.ridePayTime}, price_changed = #{data.priceChanged}, + riding_refund = #{data.ridingRefund}, + dispatch_refund = #{data.dispatchRefund}, + manage_refund = #{data.manageRefund}, + deduction_refund = #{data.deductionRefund}, @@ -626,4 +642,43 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and >= #{deductionFee} + + + + update bst_order bo + + admin_refund_count = admin_refund_count + 1, + admin_refund_amount = admin_refund_amount + #{data.adminRefundAmount}, + + riding_refund = riding_refund + #{data.ridingRefund}, + + + dispatch_refund = dispatch_refund + #{data.dispatchRefund}, + + + manage_refund = manage_refund + #{data.manageRefund}, + + + deduction_refund = deduction_refund + #{data.deductionRefund}, + + + + + and actual_riding_fee >= (riding_refund + #{data.ridingRefund}) + + + and actual_dispatch_fee >= (dispatch_refund + #{data.dispatchRefund}) + + + and actual_manage_fee >= (manage_refund + #{data.manageRefund}) + + + and actual_deduction_fee >= (deduction_refund + #{data.deductionRefund}) + + + + + + + diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/OrderDashboard.java b/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/OrderDashboard.java index b01cfde..5a7cbdf 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/OrderDashboard.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/OrderDashboard.java @@ -114,5 +114,11 @@ public interface OrderDashboard { */ BigDecimal selectSumOfActualManageFee(OrderQuery query); + /** + * 根据用户ID查询未支付订单数量 + * @param userId + */ + int selectUnpaidCountByUserId(Long userId); + } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderConverterImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderConverterImpl.java index 70ecbbf..4f75f68 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderConverterImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderConverterImpl.java @@ -45,6 +45,7 @@ import com.ruoyi.bst.order.domain.enums.OrderStatus; import com.ruoyi.bst.order.domain.vo.OrderInParkingVO; import com.ruoyi.bst.order.domain.vo.OrderPrePriceVO; import com.ruoyi.bst.order.service.OrderConverter; +import com.ruoyi.bst.order.service.OrderDashboard; import com.ruoyi.bst.order.service.OrderService; import com.ruoyi.bst.order.service.OrderValidator; import com.ruoyi.bst.order.utils.OrderUtil; @@ -118,6 +119,9 @@ public class OrderConverterImpl implements OrderConverter{ @Autowired private DeviceAssembler deviceAssembler; + @Autowired + private OrderDashboard orderDashboard; + @Override public OrderPrePriceVO toOrderPrePriceVO(OrderCalcPrePriceDTO dto) { if (dto == null) { @@ -168,6 +172,11 @@ public class OrderConverterImpl implements OrderConverter{ UserVO user = userService.selectUserById(dto.getUserId()); bo.setUser(user); + // 未支付骑行费的订单 + if (user != null) { + bo.setUnpaidCount(orderDashboard.selectUnpaidCountByUserId(user.getUserId())); + } + // 用户进行中的订单设备 OrderDeviceVO userOrderDevice = orderDeviceService.selectUsingByUserId(dto.getUserId()); bo.setUserOrderDevice(userOrderDevice); diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderDashboardImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderDashboardImpl.java index 993b8af..951a7c3 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderDashboardImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderDashboardImpl.java @@ -138,4 +138,15 @@ public class OrderDashboardImpl implements OrderDashboard { public BigDecimal selectSumOfActualManageFee(OrderQuery query) { return MathUtils.dv(orderMapper.selectSumOfActualManageFee(query)); } + + @Override + public int selectUnpaidCountByUserId(Long userId) { + if (userId == null) { + return 0; + } + OrderQuery query = new OrderQuery(); + query.setUserId(userId); + query.setStatus(OrderStatus.RIDE_WAIT_PAY.getCode()); + return this.selectCount(query); + } } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderServiceImpl.java index 5ef80b0..050b5ac 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderServiceImpl.java @@ -57,6 +57,7 @@ import com.ruoyi.bst.order.domain.dto.OrderEndDTO; import com.ruoyi.bst.order.domain.dto.OrderOpenDeviceDTO; import com.ruoyi.bst.order.domain.dto.OrderPayRideFeeDTO; import com.ruoyi.bst.order.domain.dto.OrderRefundDTO; +import com.ruoyi.bst.order.domain.dto.OrderRefundDetailDTO; import com.ruoyi.bst.order.domain.dto.OrderSeatDTO; import com.ruoyi.bst.order.domain.dto.OrderUpdatePriceDTO; import com.ruoyi.bst.order.domain.dto.OrderVerifyDTO; @@ -497,7 +498,7 @@ public class OrderServiceImpl implements OrderService { ServiceUtil.assertion(deduct != 1, "ID为%s的订单自动押金抵扣失败", order.getId()); } } - + /** * 设置日志参数 * @param device 设备信息 @@ -697,11 +698,9 @@ public class OrderServiceImpl implements OrderService { @Override public int refund(OrderRefundDTO dto) { OrderVO order = this.selectOrderById(dto.getOrderId()); - BigDecimal amount = dto.getAmount(); ServiceUtil.assertion(order == null, "参数错误,订单不存在"); ServiceUtil.assertion(!OrderStatus.canRefund().contains(order.getStatus()), "ID为%s的订单当前状态不允许退款", order.getId()); - ServiceUtil.assertion(amount == null || amount.compareTo(BigDecimal.ZERO) <= 0, "参数错误,退款金额不允许为空且必须大于0"); // 退款加锁,短时间内不允许多次退款 Long lockKey = order.getId(); @@ -709,52 +708,88 @@ public class OrderServiceImpl implements OrderService { ServiceUtil.assertion(!lock, "订单%s退款过于频繁,请稍后重试", order.getNo()); try { - BigDecimal canRefundAmount = OrderUtil.calcCanAdminRefundAmount(order, dto.getRefundType()); - ServiceUtil.assertion(canRefundAmount.compareTo(amount) < 0, "ID为%s的订单可退款金额不足,当前可退款金额为%s元", order.getId(), - canRefundAmount); - String type = RefundType.ADMIN.getCode(); + // 校验退款金额 + ServiceUtil.assertion(MathUtils.biggerThan(dto.getRidingRefund(), order.getActualReceivedRidingFee()), "骑行费可退款金额不足,当前可退款金额为%s元", order.getActualReceivedRidingFee()); + ServiceUtil.assertion(MathUtils.biggerThan(dto.getDispatchRefund(), order.getActualReceivedDispatchFee()), "调度费可退款金额不足,当前可退款金额为%s元", order.getActualReceivedDispatchFee()); + ServiceUtil.assertion(MathUtils.biggerThan(dto.getManageRefund(), order.getActualReceivedManageFee()), "管理费可退款金额不足,当前可退款金额为%s元", order.getActualReceivedManageFee()); + ServiceUtil.assertion(MathUtils.biggerThan(dto.getDeductionRefund(), order.getActualReceivedDeductionFee()), "车损费可退款金额不足,当前可退款金额为%s元", order.getActualReceivedDeductionFee()); + + // 总退款金额不允许为0 + BigDecimal totalRefund = MathUtils.addDecimal(dto.getRidingRefund(), dto.getDispatchRefund(), dto.getManageRefund(), dto.getDeductionRefund()); + ServiceUtil.assertion(totalRefund.compareTo(BigDecimal.ZERO) <= 0, "退款总额不允许小于或等于0"); - // 退款原因 - String refundReason = this.getRefundReason(dto.getReason(), type, dto.getUserName(), order.getNo(), amount); + int rows = 0; + try { + // 执行退款(押金) + rows = this.doRefund(order, dto, OrderConstants.REFUND_TYPE_DEPOSIT); - Integer result = transactionTemplate.execute(status -> { - // 更新订单退款信息 - Order data = new Order(); - data.setAdminRefundCount(order.getAdminRefundCount() + 1); - data.setAdminRefundAmount(MathUtils.addDecimal(order.getAdminRefundAmount(), amount)); - OrderQuery query = new OrderQuery(); - query.setId(order.getId()); - query.setAdminRefundCount(order.getAdminRefundCount()); - query.setPayType(order.getPayType()); - query.setAdminRefundAmount(order.getAdminRefundAmount()); - int rows = orderMapper.updateByQuery(data, query); - ServiceUtil.assertion(rows != 1, "ID为%s订单当前状态已发生变化,请稍后重试", order.getId()); + // 执行退款(支付) + rows += this.doRefund(order, dto, OrderConstants.REFUND_TYPE_RIDE); + } catch (Exception e) { + log.error("退款失败: {}, {}", order.getId(), e.getMessage()); + } - // 分成退款 - boolean bonusRefund = bonusService.refundByBst(BonusBstType.ORDER, order.getId(), amount, refundReason); - ServiceUtil.assertion(!bonusRefund, "ID为%s的订单分成退款失败,请联系管理员处理", order.getId()); - - // 支付退款 - PayRefundDTO refundDto = new PayRefundDTO(); - if (OrderConstants.REFUND_TYPE_DEPOSIT.equals(dto.getRefundType())) { - refundDto.setId(order.getPayId()); - } else if (OrderConstants.REFUND_TYPE_RIDE.equals(dto.getRefundType())) { - refundDto.setId(order.getRidePayId()); - } - refundDto.setRefundAmount(amount); - refundDto.setRefundReason(refundReason); - refundDto.setUserId(dto.getUserId()); - refundDto.setUserName(dto.getUserName()); - refundDto.setType(type); - return payService.refund(refundDto); - }); - - return result == null ? 0 : 1; + return rows; } finally { redisLock.unlock(RedisLockKey.ORDER_ADMIN_REFUND, lockKey); } } + private int doRefund(OrderVO order, OrderRefundDTO dto, String refundType) { + + // 计算需要退款的金额 + OrderRefundDetailDTO detail = OrderUtil.calcRefundDetail(order, dto, refundType); + BigDecimal refundAmount = detail.getTotalRefund(); + + // 若需要退款的金额为0,则不进行退款 + if (refundAmount == null || BigDecimal.ZERO.compareTo(refundAmount) == 0) { + return 1; + } + // 若退款金额小于0,则不进行退款,并返回0 + if (BigDecimal.ZERO.compareTo(refundAmount) > 0) { + return 0; + } + + // 退款原因 + String type = RefundType.ADMIN.getCode(); + String refundReason = this.getRefundReason(dto.getReason(), type, dto.getUserName(), order.getNo(), refundAmount); + + Integer result = transactionTemplate.execute(status -> { + // 更新订单退款信息 + Order data = new Order(); + data.setAdminRefundAmount(refundAmount); + data.setRidingRefund(detail.getRidingRefund()); + data.setDispatchRefund(detail.getDispatchRefund()); + data.setManageRefund(detail.getManageRefund()); + data.setDeductionRefund(detail.getDeductionRefund()); + OrderQuery query = new OrderQuery(); + query.setId(order.getId()); + query.setPayType(order.getPayType()); + int rows = orderMapper.updateRefund(data, query); + ServiceUtil.assertion(rows != 1, "ID为%s订单当前状态已发生变化,请稍后重试", order.getId()); + + // 分成退款 + boolean bonusRefund = bonusService.refundByBst(BonusBstType.ORDER, order.getId(), refundAmount, refundReason); + ServiceUtil.assertion(!bonusRefund, "ID为%s的订单分成退款失败,请联系管理员处理", order.getId()); + + // 支付退款 + PayRefundDTO refundDto = new PayRefundDTO(); + if (OrderConstants.REFUND_TYPE_DEPOSIT.equals(refundType)) { + refundDto.setId(order.getPayId()); + } else if (OrderConstants.REFUND_TYPE_RIDE.equals(refundType)) { + refundDto.setId(order.getRidePayId()); + } + refundDto.setRefundAmount(refundAmount); + refundDto.setRefundReason(refundReason); + refundDto.setUserId(dto.getUserId()); + refundDto.setUserName(dto.getUserName()); + refundDto.setType(type); + return payService.refund(refundDto); + }); + + return result == null ? 0 : result; + } + @Override public DeviceIotVO openDevice(OrderOpenDeviceDTO dto) { ServiceUtil.assertion(dto == null, "参数错误,dto不允许为空"); @@ -991,21 +1026,21 @@ public class OrderServiceImpl implements OrderService { ServiceUtil.assertion(!lock, "ID为%s的订单正在支付中,请稍后重试", order.getId()); try { ServiceUtil.assertion(!OrderStatus.canDeduct().contains(order.getStatus()), "ID为%s的订单当前状态不允许抵扣", order.getId()); - + // 获取实际抵扣金额 BigDecimal max = OrderUtil.calcRemainCanDeductDeposit(order); BigDecimal deductAmount = MathUtils.min(MathUtils.dv(order.getTotalFee()), max); - + // 关闭订单的支付ID boolean closePay = payService.closeByBstId(PayBstType.ORDER_RIDE.getType(), order.getId()); ServiceUtil.assertion(!closePay, "ID为%s的订单骑行费支付关闭失败", order.getId()); - + // 更新订单数据 Integer result = transactionTemplate.execute(status -> { // 押金抵扣 int deduct = orderMapper.deductDeposit(order.getId(), deductAmount); ServiceUtil.assertion(deduct != 1, "ID为%s的订单押金抵扣失败,剩余可抵扣押金不足%s元", order.getId(), deductAmount); - + // 处理抵扣成功 OrderRidePaySuccessBO bo = new OrderRidePaySuccessBO(); bo.setOrder(order); @@ -1016,7 +1051,7 @@ public class OrderServiceImpl implements OrderService { bo.setPayTime(LocalDateTime.now()); return this.handleRidePaySuccess(bo); }); - + return result == null ? 0 : result; } finally { redisLock.unlock(RedisLockKey.ORDER_PAY_RIDE_FEE, lockKey); @@ -1096,7 +1131,7 @@ public class OrderServiceImpl implements OrderService { } finally { redisLock.unlock(RedisLockKey.ORDER_PAY_RIDE_FEE, lockKey); } - + } @Override @@ -1115,7 +1150,7 @@ public class OrderServiceImpl implements OrderService { // 关闭支付订单 boolean closePay = payService.closeByBstId(PayBstType.ORDER_RIDE.getType(), order.getId()); ServiceUtil.assertion(!closePay, "ID为%s的订单骑行费支付关闭失败", dto.getId()); - + Integer result = transactionTemplate.execute(status -> { // 修改订单数据 Order data = new Order(); diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderValidatorImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderValidatorImpl.java index 42437c0..a5c7155 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderValidatorImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderValidatorImpl.java @@ -87,6 +87,9 @@ public class OrderValidatorImpl implements OrderValidator{ boolean isReal = user.getIsReal() != null && user.getIsReal(); ServiceUtil.assertion(needRealName && !isReal, "用户%s未实名认证", user.getNickName(), ServiceCode.USER_NOT_REAL_NAME); + // 用户未支付的订单数量 + ServiceUtil.assertion(bo.getUnpaidCount() != null && bo.getUnpaidCount() > 0, "您有未支付的骑行费,请支付后下单"); + // 用户进行中的订单设备 OrderDeviceVO userOrderDevice = bo.getUserOrderDevice(); if (userOrderDevice != null) { diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/order/utils/OrderUtil.java b/ruoyi-service/src/main/java/com/ruoyi/bst/order/utils/OrderUtil.java index 050b0bb..0a21f5d 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/order/utils/OrderUtil.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/order/utils/OrderUtil.java @@ -15,6 +15,9 @@ import com.ruoyi.bst.device.domain.enums.DeviceStatus; import com.ruoyi.bst.order.constants.OrderConstants; import com.ruoyi.bst.order.domain.Order; import com.ruoyi.bst.order.domain.OrderVO; +import com.ruoyi.bst.order.domain.dto.OrderRefundDTO; +import com.ruoyi.bst.order.domain.dto.OrderRefundDetailDTO; +import com.ruoyi.bst.order.domain.enums.OrderPayType; import com.ruoyi.bst.order.domain.vo.OrderFeeVO; import com.ruoyi.bst.order.domain.vo.OrderInParkingVO; import com.ruoyi.bst.order.domain.vo.OrderPrePriceVO; @@ -246,4 +249,38 @@ public class OrderUtil { data.getDeductionFee() ); } + + public static OrderRefundDetailDTO calcRefundDetail(OrderVO order, OrderRefundDTO dto, String refundType) { + OrderRefundDetailDTO result = new OrderRefundDetailDTO(); + BigDecimal deductionRefund = null; + BigDecimal ridingRefund = null; + BigDecimal dispatchRefund = null; + BigDecimal manageRefund = null; + // 押金退款 + if (OrderConstants.REFUND_TYPE_DEPOSIT.equals(refundType)) { + deductionRefund = dto.getDeductionRefund(); + if (OrderPayType.DEPOSIT_DEDUCTION.getCode().equals(order.getPayType())) { + ridingRefund = dto.getRidingRefund(); + dispatchRefund = dto.getDispatchRefund(); + manageRefund = dto.getManageRefund(); + } + } + // 支付退款 + else if (OrderConstants.REFUND_TYPE_RIDE.equals(refundType)) { + ridingRefund = dto.getRidingRefund(); + dispatchRefund = dto.getDispatchRefund(); + manageRefund = dto.getManageRefund(); + if (OrderPayType.DEPOSIT_DEDUCTION.getCode().equals(order.getPayType())) { + ridingRefund = BigDecimal.ZERO; + dispatchRefund = BigDecimal.ZERO; + manageRefund = BigDecimal.ZERO; + } + } + + result.setRidingRefund(MathUtils.dv(ridingRefund)); + result.setDispatchRefund(MathUtils.dv(dispatchRefund)); + result.setManageRefund(MathUtils.dv(manageRefund)); + result.setDeductionRefund(MathUtils.dv(deductionRefund)); + return result; + } } diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/bst/OrderController.java b/ruoyi-web/src/main/java/com/ruoyi/web/bst/OrderController.java index 95a1576..fec84d5 100644 --- a/ruoyi-web/src/main/java/com/ruoyi/web/bst/OrderController.java +++ b/ruoyi-web/src/main/java/com/ruoyi/web/bst/OrderController.java @@ -135,7 +135,11 @@ public class OrderController extends BaseController } dto.setUserId(getUserId()); dto.setUserName(getNickName()); - return toAjax(orderService.refund(dto)); + int count = orderService.refund(dto); + if (count == 0) { + return error("退款失败"); + } + return success(count); } /** @@ -161,7 +165,7 @@ public class OrderController extends BaseController if (!orderValidator.canOperate(dto.getId())) { return error("您无权押金抵扣ID为" + dto.getId() + "的订单"); } - dto.setIgnoreVerify(true); + dto.setIgnoreVerify(false); return toAjax(orderService.deduct(dto)); }