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 e4c888d..92e5b5e 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 @@ -59,5 +59,10 @@ public class OrderVO extends Order { private LocalDateTime payTime; @ApiModelProperty("支付渠道名称") private String payChannelName; + @ApiModelProperty("自动退款金额") + private BigDecimal payAutoRefund; + @ApiModelProperty("管理员退款金额") + private BigDecimal payAdminRefund; + } 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 18b5ed0..fc94adb 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 @@ -33,6 +33,9 @@ public class OrderRefundDTO implements LogBizParam { @ApiModelProperty("操作人名称") private String userName; + @ApiModelProperty("退款方式(1-自动退款,2-管理员退款)") + private String type; + @Override public Object logBizId() { return orderId; 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 5a72333..d338f84 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 @@ -61,6 +61,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" bp.refunding as pay_refunding, bp.pay_time as pay_time, bp.channel_name as pay_channel_name, + bp.auto_refund as pay_auto_refund, + bp.admin_refund as pay_admin_refund, bod.device_id, bod.device_mac, bod.device_sn, 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 3042fb8..44af5d3 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 @@ -66,6 +66,7 @@ import com.ruoyi.bst.pay.domain.enums.PayBstType; import com.ruoyi.bst.pay.domain.vo.DoPayVO; import com.ruoyi.bst.pay.service.PayConverter; import com.ruoyi.bst.pay.service.PayService; +import com.ruoyi.bst.refund.domain.enums.RefundType; import com.ruoyi.bst.sms.service.SmsService; import com.ruoyi.common.core.domain.vo.UserVO; import com.ruoyi.common.core.redis.RedisLock; @@ -497,8 +498,7 @@ public class OrderServiceImpl implements OrderService // 订单剩余金额退款 BigDecimal refund = MathUtils.subtractDecimal(order.getPayAmount(), order.getTotalFee()); if (refund != null && refund.compareTo(BigDecimal.ZERO) > 0) { - String reason = "【自动退款】订单剩余金额退款" + order.getNo(); - return this.refund(order, refund, reason, null, "系统"); + return this.refund(order, refund, null, null, "系统", RefundType.AUTO.getCode()); } return 1; @@ -513,7 +513,7 @@ public class OrderServiceImpl implements OrderService * @param userName 操作人名称 * @return 结果 */ - private int refund(OrderVO order, BigDecimal amount, String reason, Long userId, String userName) { + private int refund(OrderVO order, BigDecimal amount, String reason, Long userId, String userName, String type) { ServiceUtil.assertion(order == null, "参数错误,order不允许为空"); ServiceUtil.assertion(!OrderStatus.canRefund().contains(order.getStatus()), "ID为%s的订单当前状态不允许退款", order.getId()); ServiceUtil.assertion(amount == null || amount.compareTo(BigDecimal.ZERO) <= 0, "参数错误,退款金额不允许为空且必须大于0"); @@ -521,18 +521,32 @@ public class OrderServiceImpl implements OrderService BigDecimal canRefundAmount = OrderUtil.calcCanRefundAmount(order); ServiceUtil.assertion(canRefundAmount.compareTo(amount) < 0, "ID为%s的订单可退款金额不足,当前可退款金额为%s元", order.getId(), canRefundAmount); + + // 退款原因 + if (RefundType.ADMIN.getCode().equals(type)) { + reason = String.format("【管理员退款】%s订单%s退款 %s 元", userName, order.getNo(), amount); + } else { + reason = String.format("【自动退款】%s订单%s退款 %s 元", userName, order.getNo(), amount); + } + if (StringUtils.isNotBlank(reason)) { + reason += ":" + reason; + } + String refundReason = reason; + Integer result = transactionTemplate.execute(status -> { + // 分成退款 - boolean bonusRefund = bonusService.refundByBst(BonusBstType.ORDER, order.getId(), amount, order.getPayAmount(), reason); + boolean bonusRefund = bonusService.refundByBst(BonusBstType.ORDER, order.getId(), amount, order.getPayAmount(), refundReason); ServiceUtil.assertion(!bonusRefund, "ID为%s的订单分成退款失败", order.getId()); // 支付退款 PayRefundDTO dto = new PayRefundDTO(); dto.setId(order.getPayId()); dto.setRefundAmount(amount); - dto.setRefundReason(reason); + dto.setRefundReason(refundReason); dto.setUserId(userId); dto.setUserName(userName); + dto.setType(type); return payService.refund(dto); }); @@ -588,8 +602,7 @@ public class OrderServiceImpl implements OrderService public int refund(OrderRefundDTO dto) { OrderVO order = this.selectOrderById(dto.getOrderId()); - // 退款 - return this.refund(order, dto.getAmount(), dto.getReason(), dto.getUserId(), dto.getUserName()); + return this.refund(order, dto.getAmount(), dto.getReason(), dto.getUserId(), dto.getUserName(), dto.getType()); } @Override diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/pay/domain/Pay.java b/ruoyi-service/src/main/java/com/ruoyi/bst/pay/domain/Pay.java index ce3e0f5..d0947ee 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/pay/domain/Pay.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/pay/domain/Pay.java @@ -100,6 +100,14 @@ public class Pay extends BaseEntity implements Payable @ApiModelProperty("运营区ID") private Long areaId; + @Excel(name = "自动退款金额", readConverterExp = "元=") + @ApiModelProperty("自动退款金额") + private BigDecimal autoRefund; + + @Excel(name = "管理员退款金额", readConverterExp = "元=") + @ApiModelProperty("管理员退款金额") + private BigDecimal adminRefund; + /** * 获取价格(分) */ diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/pay/domain/dto/PayRefundDTO.java b/ruoyi-service/src/main/java/com/ruoyi/bst/pay/domain/dto/PayRefundDTO.java index e4a3a11..c6fb33e 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/pay/domain/dto/PayRefundDTO.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/pay/domain/dto/PayRefundDTO.java @@ -27,4 +27,7 @@ public class PayRefundDTO { @ApiModelProperty("退款操作人名称") private String userName; + @ApiModelProperty("退款方式(1-自动退款,2-管理员退款)") + private String type; + } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/pay/mapper/PayMapper.java b/ruoyi-service/src/main/java/com/ruoyi/bst/pay/mapper/PayMapper.java index e188cb9..1fdfc27 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/pay/mapper/PayMapper.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/pay/mapper/PayMapper.java @@ -83,7 +83,7 @@ public interface PayMapper * @param amount 退款金额 * @return 结果 */ - int addRefundingAmount(@Param("id") Long id, @Param("amount") BigDecimal amount); + int addRefundingAmount(@Param("id") Long id, @Param("amount") BigDecimal amount, @Param("type") String type); /** * 记录退款金额 diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/pay/mapper/PayMapper.xml b/ruoyi-service/src/main/java/com/ruoyi/bst/pay/mapper/PayMapper.xml index 97f6f01..ca1b243 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/pay/mapper/PayMapper.xml +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/pay/mapper/PayMapper.xml @@ -28,7 +28,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" bp.expire_time, bp.app_name, bp.channel_name, - bp.area_id + bp.area_id, + bp.auto_refund, + bp.admin_refund from bst_pay bp @@ -95,6 +97,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" app_name, channel_name, area_id, + auto_refund, + admin_refund, #{no}, @@ -117,6 +121,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{appName}, #{channelName}, #{areaId}, + #{autoRefund}, + #{adminRefund}, @@ -160,6 +166,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" app_name = #{data.appName}, channel_name = #{data.channelName}, area_id = #{data.areaId}, + auto_refund = #{data.autoRefund}, + admin_refund = #{data.adminRefund}, @@ -176,7 +184,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update bst_pay - set refunding = refunding + #{amount} + + refunding = refunding + #{amount}, + + auto_refund = auto_refund + #{amount}, + + + admin_refund = admin_refund + #{amount}, + + where id = #{id} and amount >= refunded + refunding + #{amount} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/pay/service/impl/PayServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/pay/service/impl/PayServiceImpl.java index 55eaf40..6a97541 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/pay/service/impl/PayServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/pay/service/impl/PayServiceImpl.java @@ -489,7 +489,7 @@ public class PayServiceImpl implements PayService { } // 增加退款中金额 - int addRefunding = payMapper.addRefundingAmount(dto.getId(), dto.getRefundAmount()); + int addRefunding = payMapper.addRefundingAmount(dto.getId(), dto.getRefundAmount(), dto.getType()); ServiceUtil.assertion(addRefunding != 1, "记录退款中的金额失败"); // 创建退款订单 diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/refund/domain/Refund.java b/ruoyi-service/src/main/java/com/ruoyi/bst/refund/domain/Refund.java index 98b5ef4..2c84b4b 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/refund/domain/Refund.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/refund/domain/Refund.java @@ -49,4 +49,7 @@ public class Refund extends BaseEntity @ApiModelProperty("退款操作人名称") private String userName; + @Excel(name = "退款方式", readConverterExp = "1=自动退款,2=管理员退款") + @ApiModelProperty("退款方式(1-自动退款 2-管理员退款)") + private String type; } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/refund/domain/enums/RefundType.java b/ruoyi-service/src/main/java/com/ruoyi/bst/refund/domain/enums/RefundType.java new file mode 100644 index 0000000..f038484 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/refund/domain/enums/RefundType.java @@ -0,0 +1,15 @@ +package com.ruoyi.bst.refund.domain.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum RefundType { + AUTO("1", "自动退款"), + ADMIN("2", "管理员退款"); + + private final String code; + private final String name; + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/refund/mapper/RefundMapper.xml b/ruoyi-service/src/main/java/com/ruoyi/bst/refund/mapper/RefundMapper.xml index eccd08f..411ad59 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/refund/mapper/RefundMapper.xml +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/refund/mapper/RefundMapper.xml @@ -17,6 +17,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" br.reason, br.user_id, br.user_name, + br.type, bp.channel_id, bp.app_id, bp.no as pay_no, @@ -45,6 +46,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and bp.bst_type = #{query.payBstType} and bp.area_id = #{query.payAreaId} and bp.channel_id = #{query.channelId} + and br.type = #{query.type} and date(br.create_time) >= #{query.createDateRange[0]} and date(br.create_time) <= #{query.createDateRange[1]} @@ -82,6 +84,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" reason, user_id, user_name, + type, #{no}, @@ -92,6 +95,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{reason}, #{userId}, #{userName}, + #{type}, @@ -112,6 +116,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" reason = #{data.reason}, user_id = #{data.userId}, user_name = #{data.userName}, + type = #{data.type}, 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 b4ec5ae..9ada92d 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 @@ -17,7 +17,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.aliyun.core.utils.StringUtils; import com.ruoyi.bst.areaJoin.domain.enums.AreaJoinPermission; import com.ruoyi.bst.order.domain.OrderQuery; import com.ruoyi.bst.order.domain.OrderVO; @@ -29,6 +28,7 @@ import com.ruoyi.bst.order.domain.vo.OrderEndVO; import com.ruoyi.bst.order.service.OrderAssembler; import com.ruoyi.bst.order.service.OrderService; import com.ruoyi.bst.order.service.OrderValidator; +import com.ruoyi.bst.refund.domain.enums.RefundType; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; @@ -131,12 +131,9 @@ public class OrderController extends BaseController if (!orderValidator.canOperate(dto.getOrderId())) { return error("您无权退款ID为" + dto.getOrderId() + "的订单"); } - String userName = getNickName(); dto.setUserId(getUserId()); - dto.setUserName(userName); - if (StringUtils.isBlank(dto.getReason())) { - dto.setReason("管理员【" + userName + "】退款"); - } + dto.setUserName(getNickName()); + dto.setType(RefundType.ADMIN.getCode()); return toAjax(orderService.refund(dto)); }