From cb05c459096d1e25c3e6ca50b9b5bdcd2c605db6 Mon Sep 17 00:00:00 2001 From: huk Date: Fri, 12 Sep 2025 13:22:26 +0800 Subject: [PATCH] =?UTF-8?q?refactor(order):=20=E9=87=8D=E6=9E=84=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E6=A8=A1=E5=9D=97=E5=B9=B6=E6=B7=BB=E5=8A=A0=E9=80=80?= =?UTF-8?q?=E6=AC=BE=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重构了订单相关实体类和VO类,优化了字段设计 - 新增了AftersaleStatus枚举类,用于表示售后状态- 在OrderService中实现了退款功能 - 优化了订单查询相关SQL和Mapper方法 -调整了分账相关逻辑,增加了回退状态 --- .../order/controller/OrderController.java | 6 - .../wzj/soopin/order/domain/bo/OrderBo.java | 15 +- .../wzj/soopin/order/domain/bo/RefundBO.java | 79 ++++++++ .../order/domain/entity/AftersaleItem.java | 9 +- .../wzj/soopin/order/domain/entity/Order.java | 23 ++- .../soopin/order/domain/query/OrderQuery.java | 11 +- .../order/domain/vo/ManagerOrderVO.java | 8 +- .../wzj/soopin/order/domain/vo/OrderVO.java | 15 +- .../soopin/order/emum/AftersaleStatus.java | 22 +++ .../soopin/order/emum/OrderStatusEnum.java | 2 +- .../wzj/soopin/order/mapper/OrderMapper.java | 2 +- .../soopin/order/service/OrderService.java | 5 +- .../order/service/impl/OrderServiceImpl.java | 138 ++++++++------ .../src/main/resources/mapper/OrderMapper.xml | 34 ++-- .../service/impl/SysTenantServiceImpl.java | 2 +- .../controller/TransEasypayController.java | 8 +- .../transaction/domain/bo/DivideDetailBO.java | 17 +- .../domain/bo/SeparateRefundBO.java | 42 +++++ .../domain/bo/easypay/PayInfo.java | 3 +- .../refund/req/SeparateRefundReqBody.java | 57 ++++++ .../refund/resp/SeparateRefundRespBody.java | 42 +++++ .../trade/notice/req/TradeNoticeReqBody.java | 57 ------ .../transaction/domain/po/DivideDetail.java | 9 +- .../transaction/domain/vo/DivideDetailVO.java | 25 ++- .../transaction/enums/DivideStatus.java | 2 +- .../mapper/DivideDetailMapper.java | 3 - .../transaction/service/IEasypayService.java | 8 +- .../service/impl/DivideServiceImpl.java | 11 +- .../service/impl/EasypayServiceImpl.java | 178 ++++++++++++++---- 29 files changed, 574 insertions(+), 259 deletions(-) create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/RefundBO.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/emum/AftersaleStatus.java create mode 100644 ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/domain/bo/SeparateRefundBO.java create mode 100644 ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/domain/bo/easypay/separate/refund/req/SeparateRefundReqBody.java create mode 100644 ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/domain/bo/easypay/separate/refund/resp/SeparateRefundRespBody.java delete mode 100644 ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/domain/bo/easypay/trade/notice/req/TradeNoticeReqBody.java diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderController.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderController.java index 5fe2331f0..6a9f40a1b 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderController.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderController.java @@ -150,11 +150,5 @@ public class OrderController extends BaseController { } } - @Tag(name = "订单退款") - @GetMapping("/refund") - public R refund(@RequestParam Long orderId, @RequestParam(required = false) String reason) { - log.info("订单退款开始,订单ID: {}", orderId); - return orderService.refund(orderId,reason); - } } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/OrderBo.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/OrderBo.java index 10f877eb3..a6eeee5a3 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/OrderBo.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/OrderBo.java @@ -38,11 +38,13 @@ public class OrderBo extends BaseBO { @Schema(description ="支付方式:0->未支付;1->支付宝;2->微信 精确匹配") private Integer payType; - @Schema(description ="订单状态:0->待付款;1->待核销;2->已完成;3->已关闭;4->退款中;5->已退款 6->已取消 9->已分账;10->无效订单 精确匹配") + /** + * 订单状态枚举类型见{@link com.wzj.soopin.order.emum.OrderStatusEnum} + */ private Integer status; - @Schema(description ="退款状态,枚举值:1:无售后或售后关闭,2:售后处理中,3:退款中,4: 退款成功 精确匹配") - private Integer aftersaleStatus; + @Schema(description="是否处于退款状态") + private Boolean aftersale; @Schema(description ="省份/直辖市 精确匹配") @@ -72,10 +74,6 @@ public class OrderBo extends BaseBO { @Schema(description ="商家备注 精确匹配") private String MEMBER_ID; - - @Schema(description ="删除状态:0->未删除;1->已删除 精确匹配") - private Integer deleteStatus; - @Schema(description ="支付时间 精确匹配") private LocalDateTime paymentTime; @@ -102,8 +100,7 @@ public class OrderBo extends BaseBO { .eq(tenantId != null, Order::getTenantId, tenantId) .eq(payType != null, Order::getPayType, payType) .eq(status != null, Order::getStatus, status) - .eq(aftersaleStatus != null, Order::getAftersaleStatus, aftersaleStatus) - .eq(deleteStatus != null, Order::getDeleteStatus, deleteStatus) + .eq(aftersale != null, Order::getAftersale, aftersale) .between(startTime != null && endTime != null, Order::getCreateTime, startTime, endTime) .ge(startTime != null && endTime == null, Order::getCreateTime, startTime) .le(endTime != null && startTime == null, Order::getCreateTime, endTime); diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/RefundBO.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/RefundBO.java new file mode 100644 index 000000000..c86483631 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/RefundBO.java @@ -0,0 +1,79 @@ +package com.wzj.soopin.order.domain.bo; + +import com.wzj.soopin.order.domain.entity.Order; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.dromara.common.excel.annotation.Excel; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 退款请求 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class RefundBO { + /** + * 订单ID + */ + @NotNull(message = "订单ID不能为空") + private Long orderId; + + /** + * 退款项 + */ + @NotNull(message = "退款项不能为空") + @Valid + private List refundItemBoList; + + /** + * 退款原因 + */ + private String refundReason; + + /** + * 订单信息 + */ + @Schema(description = "订单信息", hidden = true) + private Order order; + + /** + * 退款总金额 + */ + @Schema(description = "退款总金额", hidden = true) + private BigDecimal totalRefundAmount; + + + @Data + @AllArgsConstructor + @NoArgsConstructor + @Builder + public static class RefundItemBO { + + /** + * 订单子项ID + */ + @NotNull(message = "订单子项ID不能为空") + private Long orderItemId; + + /** + * 退款金额,单位:元 + */ + @NotNull(message = "退款金额不能为空") + private BigDecimal refundAmount; + + /** + * 退货数量 + */ + @NotNull(message = "退货数量不能为空") + private Integer quantity; + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/AftersaleItem.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/AftersaleItem.java index 3ceb1a88a..db85b2456 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/AftersaleItem.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/AftersaleItem.java @@ -2,10 +2,14 @@ package com.wzj.soopin.order.domain.entity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; import lombok.Data; +import lombok.EqualsAndHashCode; import org.dromara.common.core.domain.model.BaseAudit; import org.dromara.common.excel.annotation.Excel; +import java.io.Serial; +import java.io.Serializable; import java.math.BigDecimal; /** @@ -13,10 +17,13 @@ import java.math.BigDecimal; * * @author zcc */ +@EqualsAndHashCode(callSuper = true) @Schema(description = "订单售后对象") @Data @TableName("oms_aftersale_item") -public class AftersaleItem extends BaseAudit { +@Builder +public class AftersaleItem extends BaseAudit implements Serializable { + @Serial private static final long serialVersionUID = 1L; @Schema(description = "ID") diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/Order.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/Order.java index 15d746b2b..04fc45f81 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/Order.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/Order.java @@ -2,13 +2,12 @@ package com.wzj.soopin.order.domain.entity; import com.baomidou.mybatisplus.annotation.*; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; import org.dromara.common.core.domain.model.BaseAudit; import org.dromara.common.excel.annotation.Excel; +import java.io.Serial; +import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -17,14 +16,16 @@ import java.time.LocalDateTime; * * @author zcc */ +@EqualsAndHashCode(callSuper = true) @Schema(description = "订单表对象") @Data @TableName("oms_order") @Builder @NoArgsConstructor @AllArgsConstructor -public class Order extends BaseAudit { +public class Order extends BaseAudit implements Serializable { + @Serial private static final long serialVersionUID = 1L; @Schema(description = "订单id") @@ -76,9 +77,11 @@ public class Order extends BaseAudit { */ private Integer status; - @Schema(description = "退款状态,枚举值:1:无售后或售后关闭,2:售后处理中,3:退款中,4: 退款成功") - @Excel(name = "退款状态,枚举值:1:无售后或售后关闭,2:售后处理中,3:退款中,4: 退款成功") - private Integer aftersaleStatus; + /** + * 是否处于退款状态 + */ + @Schema(description="是否处于退款状态") + private Boolean aftersale; @@ -118,10 +121,6 @@ public class Order extends BaseAudit { @Excel(name = "订单备注") private String note; - @Schema(description = "删除状态:0->未删除;1->已删除") - @Excel(name = "删除状态:0->未删除;1->已删除") - private Integer deleteStatus; - @Schema(description = "支付时间") @Excel(name = "支付时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") private LocalDateTime paymentTime; diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderQuery.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderQuery.java index 46d1feff7..3b18fed3e 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderQuery.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderQuery.java @@ -35,11 +35,13 @@ public class OrderQuery { @Schema(description = "支付方式:0->未支付;1->支付宝;2->微信 精确匹配") private Integer payType; - @Schema(description = "订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单 精确匹配") + /** + * 订单状态枚举类型见{@link com.wzj.soopin.order.emum.OrderStatusEnum} + */ private Integer status; - @Schema(description = "退款状态,枚举值:1:无售后或售后关闭,2:售后处理中,3:退款中,4: 退款成功 精确匹配") - private Integer aftersaleStatus; + @Schema(description="是否处于退款状态") + private Boolean aftersale; @Schema(description = "物流公司 精确匹配") private String deliveryCompany; @@ -86,9 +88,6 @@ public class OrderQuery { @Schema(description = "确认收货状态:0->未确认;1->已确认 精确匹配") private Integer confirmStatus; - @Schema(description = "删除状态:0->未删除;1->已删除 精确匹配") - private Integer deleteStatus; - @Schema(description = "支付时间 精确匹配") private LocalDateTime paymentTime; diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerOrderVO.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerOrderVO.java index bc254661e..8ecb8b15f 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerOrderVO.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerOrderVO.java @@ -38,8 +38,8 @@ public class ManagerOrderVO { @Schema(name = "status", description = "订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单", required = true, implementation = Integer.class) private Integer status; - @Schema(description = "退款状态,枚举值:1:无售后或售后关闭,2:售后处理中,3:退款中,4: 退款成功") - private Integer aftersaleStatus; + @Schema(description="是否处于退款状态") + private Boolean aftersale; @Schema(name = "pic", description = "商品图片", required = true, implementation = String.class) private String pic; @@ -119,8 +119,8 @@ public class ManagerOrderVO { if (status != null) { queryWrapper.eq(Order::getStatus, status); } - if (aftersaleStatus != null) { - queryWrapper.eq(Order::getAftersaleStatus, aftersaleStatus); + if (aftersale != null) { + queryWrapper.eq(Order::getAftersale, aftersale); } if (totalAmount != null) { queryWrapper.eq(Order::getTotalAmount, totalAmount); diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderVO.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderVO.java index 930b640f3..f0a90025c 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderVO.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderVO.java @@ -61,13 +61,13 @@ public class OrderVO extends BaseAudit { @Excel(name = "支付方式:0->未支付;1->支付宝;2->微信") private Integer payType; - @Schema(description ="订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单") - @Excel(name = "订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单") + /** + * 订单状态枚举类型见{@link com.wzj.soopin.order.emum.OrderStatusEnum} + */ private Integer status; - @Schema(description ="退款状态,枚举值:1:无售后或售后关闭,2:售后处理中,3:退款中,4: 退款成功") - @Excel(name = "退款状态,枚举值:1:无售后或售后关闭,2:售后处理中,3:退款中,4: 退款成功") - private Integer aftersaleStatus; + @Schema(description="是否处于退款状态") + private Boolean aftersale; @Schema(description ="省份/直辖市") @@ -102,11 +102,6 @@ public class OrderVO extends BaseAudit { @Excel(name = "订单备注") private String note; - - @Schema(description ="发删除状态:0->未删除;1->已删除") - @Excel(name = "删除状态:0->未删除;1->已删除") - private Integer deleteStatus; - @Schema(description ="支付时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @Excel(name = "支付时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/emum/AftersaleStatus.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/emum/AftersaleStatus.java new file mode 100644 index 000000000..21536791a --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/emum/AftersaleStatus.java @@ -0,0 +1,22 @@ +package com.wzj.soopin.order.emum; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 售后状态枚举 + * 0->待处理;1->退款中;2->已退款;3->已拒绝 + */ +@Getter +@AllArgsConstructor +public enum AftersaleStatus { + + UNPAID(0, "待处理"), + VERIFY(1, "退款中"), + PAID(2, "已退款"), + CLOSED(3, "已拒绝"); + + private final Integer code; + + private final String desc; +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/emum/OrderStatusEnum.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/emum/OrderStatusEnum.java index d7c0eb0ef..19b7496ed 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/emum/OrderStatusEnum.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/emum/OrderStatusEnum.java @@ -4,7 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; /** - * 订单状态:0->待付款;1->待核销;2->已完成;3->已关闭;4->退款中;5->已退款 6->已取消 9->已分账;10->无效订单 精确匹配 + * 订单状态:0->待付款;1->待核销;2->已支付;3->已关闭;4->退款中;5->已退款 6->已取消 9->已分账;10->无效订单 精确匹配 */ @Getter @AllArgsConstructor diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderMapper.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderMapper.java index 515a7471b..28f14996d 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderMapper.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderMapper.java @@ -39,7 +39,7 @@ public interface OrderMapper extends BaseMapper { @Select("SELECT " + "COUNT(*) AS count1, " + - "SUM(CASE WHEN aftersale_status = 2 THEN 1 ELSE 0 END) AS count2 " + + "SUM(aftersale = 1) AS count2 " + "FROM oms_order") Map countOrder(); diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderService.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderService.java index 0573151f3..00da46abb 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderService.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.wzj.soopin.order.domain.bo.OrderBo; +import com.wzj.soopin.order.domain.bo.RefundBO; import com.wzj.soopin.order.domain.bo.SaveOrderBO; import com.wzj.soopin.order.domain.entity.Order; import com.wzj.soopin.order.domain.vo.ManagerOrderDetailVO; @@ -32,7 +33,5 @@ public interface OrderService extends IService { void cancel(Long orderId); - R refund(Long orderId, String reason); - - + void refund(RefundBO refundBO); } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderServiceImpl.java index 642b2b551..60ef11116 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderServiceImpl.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderServiceImpl.java @@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.wzj.soopin.goods.domain.entity.Product; @@ -22,6 +23,7 @@ import com.wzj.soopin.member.domain.po.Member; import com.wzj.soopin.member.mapper.MemberMapper; import com.wzj.soopin.member.mapper.MemberWechatMapper; import com.wzj.soopin.order.domain.bo.OrderBo; +import com.wzj.soopin.order.domain.bo.RefundBO; import com.wzj.soopin.order.domain.bo.SaveOrderBO; import com.wzj.soopin.order.domain.bo.SaveOrderSkuItemBO; import com.wzj.soopin.order.domain.entity.*; @@ -29,6 +31,7 @@ import com.wzj.soopin.order.domain.form.DeliverProductForm; import com.wzj.soopin.order.domain.form.ManagerOrderQueryForm; import com.wzj.soopin.order.domain.query.OrderH5Query; import com.wzj.soopin.order.domain.vo.*; +import com.wzj.soopin.order.emum.AftersaleStatus; import com.wzj.soopin.order.emum.OrderStatusEnum; import com.wzj.soopin.order.mapper.*; import com.wzj.soopin.order.service.OrderService; @@ -48,6 +51,7 @@ import org.springframework.beans.BeanUtils; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -58,7 +62,6 @@ import java.util.stream.Collectors; /** * 订单表Service业务层处理 * - * * @author zcc */ @Service @@ -66,21 +69,30 @@ import java.util.stream.Collectors; @RequiredArgsConstructor public class OrderServiceImpl extends ServiceImpl implements OrderService { private final OrderMapper orderMapper; + private final OrderItemMapper orderItemMapper; + private final SkuMapper skuMapper; + + private final ProductMapper productMapper; + private final OrderOperateHistoryMapper orderOperateHistoryMapper; + private final MemberMapper memberMapper; + private final OrderDeliveryHistoryMapper orderDeliveryHistoryMapper; + private final SysTenantMapper sysTenantMapper; + private final AftersaleMapper aftersaleMapper; + private final AftersaleItemMapper aftersaleItemMapper; + /** * 订单前缀 */ private final static String ORDER_SN_PREFIX = "WZJ"; - private final ProductMapper productMapper; - /** * 查询订单表 @@ -95,7 +107,6 @@ public class OrderServiceImpl extends ServiceImpl implements Assert.notNull(order, () -> new ServiceException("无该订单信息")); - ManagerOrderDetailVO managerOrderDetailVO = new ManagerOrderDetailVO(); //封装订单信息 managerOrderDetailVO.setOrderId(id); @@ -157,7 +168,7 @@ public class OrderServiceImpl extends ServiceImpl implements * 查询订单表列表 * * @param query 查询条件 - * @param page 分页条件 + * @param page 分页条件 * @return 订单表 */ public PageImpl selectList(ManagerOrderQueryForm query, Pageable page) { @@ -168,16 +179,16 @@ public class OrderServiceImpl extends ServiceImpl implements //// query.setUserPhone(AesCryptoUtils.encrypt(aesKey, query.getUserPhone())); // } List managerOrderVOList = orderMapper.selectManagerOrderPage(query); - if (CollectionUtil.isEmpty(managerOrderVOList)){ + if (CollectionUtil.isEmpty(managerOrderVOList)) { return new PageImpl<>(managerOrderVOList, page, 0); } - long total = managerOrderVOList.size(); - Map orderMap = managerOrderVOList.stream().collect(Collectors.toMap(ManagerOrderVO::getId, it -> it, (v1,v2) -> v2, LinkedHashMap::new)); + long total = managerOrderVOList.size(); + Map orderMap = managerOrderVOList.stream().collect(Collectors.toMap(ManagerOrderVO::getId, it -> it, (v1, v2) -> v2, LinkedHashMap::new)); //查orderItem QueryWrapper qw = new QueryWrapper<>(); qw.in("order_id", orderMap.keySet()); Map> groupedOrderItemMap = orderItemMapper.selectList(qw) - .stream().collect(Collectors.groupingBy(OrderItem::getOrderId)); + .stream().collect(Collectors.groupingBy(OrderItem::getOrderId)); groupedOrderItemMap.keySet().forEach(key -> { ManagerOrderVO managerOrderVO = orderMap.get(key); managerOrderVO.setBuyNum(0); @@ -206,6 +217,7 @@ public class OrderServiceImpl extends ServiceImpl implements * @return 结果 */ @Override + @Transactional(rollbackFor = Exception.class) public OrderVO saveOrder(SaveOrderBO saveOrderBO) { LoginUser loginUser = LoginHelper.getLoginUser(); List skuItemBOList = saveOrderBO.getSkuItemBOList(); @@ -217,6 +229,8 @@ public class OrderServiceImpl extends ServiceImpl implements .stream().collect(Collectors.toMap(Product::getId, it -> it, (v1, v2) -> v2, LinkedHashMap::new)); for (Sku sku : skus) { Integer quantity = map.get(sku.getId()); + Assert.isTrue(quantity < sku.getStock(), () -> new ServiceException("下单商品库存不足")); + skuMapper.updateStockById(sku.getId(), LocalDateTime.now(), quantity); BigDecimal multiply = sku.getPrice().multiply(new BigDecimal(quantity)); totalAmount = totalAmount.add(multiply); } @@ -240,7 +254,7 @@ public class OrderServiceImpl extends ServiceImpl implements .skuId(sku.getId()) .productName(product != null ? product.getName() : "") .pic(sku.getPic()) - .salePrice(product != null ? product.getPrice() : null) + .salePrice(sku.getPrice()) .quantity(map.get(sku.getId())) .build(); }).toList(); @@ -257,6 +271,52 @@ public class OrderServiceImpl extends ServiceImpl implements orderMapper.updateById(Order.builder().id(orderId).status(OrderStatusEnum.CLOSED.getValue()).build()); } + @Override + public void refund(RefundBO refundBO) { + Long orderId = refundBO.getOrderId(); + String refundReason = refundBO.getRefundReason(); + List refundItemBoList = refundBO.getRefundItemBoList(); + Order order = refundBO.getOrder(); + // 修改订单状态 + orderMapper.updateById(Order.builder() + .id(orderId) + .aftersale(false) + .payAmount(order.getPayAmount().subtract(refundBO.getTotalRefundAmount())) + .status(OrderStatusEnum.REFUNDED_SUCCESS.getValue()) + .build()); + + // 更新售后记录 + Aftersale aftersale = aftersaleMapper.selectOne(Wrappers.lambdaQuery(Aftersale.class) + .eq(Aftersale::getOrderId, orderId).last("limit 1")); + if(aftersale == null){ + aftersale = new Aftersale(); + aftersale.setMemberId(order.getMemberId()); + aftersale.setOrderId(orderId); + aftersale.setReturnAmount(refundBO.getTotalRefundAmount()); + aftersale.setQuantity(refundItemBoList.size()); + aftersale.setType(1); + aftersale.setStatus(AftersaleStatus.PAID.getCode()); + aftersale.setReason(refundReason); + aftersale.setAuthFlag(2); + aftersaleMapper.insert(aftersale); + }else{ + aftersale.setReturnAmount(refundBO.getTotalRefundAmount()); + aftersale.setStatus(AftersaleStatus.PAID.getCode()); + aftersale.setQuantity(refundItemBoList.size()); + aftersaleMapper.updateById(aftersale); + } + Long aftersaleId = aftersale.getId(); + List aftersaleItems = refundItemBoList.stream().map(item -> AftersaleItem.builder() + .aftersaleId(aftersaleId) + .memberId(order.getMemberId()) + .orderId(orderId) + .orderItemId(item.getOrderItemId()) + .returnAmount(item.getRefundAmount()) + .quantity(item.getQuantity()) + .build()).toList(); + aftersaleItemMapper.insert(aftersaleItems); + } + /** * 生成订单sn */ @@ -275,17 +335,15 @@ public class OrderServiceImpl extends ServiceImpl implements * @return 结果 */ public R update(Order order) { - int update = orderMapper.updateById(order); - if (update>1){ + int update = orderMapper.updateById(order); + if (update > 1) { return R.fail("订单修改失败"); - }else { + } else { return R.ok(order); } } - - @Override public R saveMerchantNote(Order order) { // 1. 查询现有订单 @@ -301,7 +359,7 @@ public class OrderServiceImpl extends ServiceImpl implements int affectedRows = orderMapper.update(null, qw); if (affectedRows > 0) { - orderMapper.selectById(order.getId()); + orderMapper.selectById(order.getId()); return R.ok(); } return R.fail("更新失败"); @@ -357,7 +415,7 @@ public class OrderServiceImpl extends ServiceImpl implements public IPage getlist(Page page, OrderBo query) { Long tenantId = Long.valueOf(LoginHelper.getTenantId()); - IPage resultPage = orderMapper.getlist(page,query,tenantId); + IPage resultPage = orderMapper.getlist(page, query, tenantId); List orderVOList = resultPage.getRecords(); if (orderVOList.isEmpty()) { return resultPage; @@ -415,7 +473,7 @@ public class OrderServiceImpl extends ServiceImpl implements @Override public Order getByNo(String orderNo) { - return baseMapper.selectOne(new LambdaQueryWrapper().eq(Order::getOrderSn,orderNo)); + return baseMapper.selectOne(new LambdaQueryWrapper().eq(Order::getOrderSn, orderNo)); } // public void sendMessage(Order order) { @@ -440,49 +498,5 @@ public class OrderServiceImpl extends ServiceImpl implements // } // } - /** - * 处理退款逻辑 - * @param orderId 订单ID - * @return 操作结果 - */ - @Override - public R refund(Long orderId, String reason) { - if (orderId == null) { - return R.fail("订单ID不能为空"); - } - - try { - // 根据订单ID获取订单信息 - Order order = orderMapper.selectById(orderId); - if (order == null) { - return R.fail("未找到对应订单"); - } - if (order.getAftersaleStatus() !=1){ - return R.fail("订单未处于待售后状态"); - } - - // // 设置售后状态 - order.setAftersaleStatus(2); - orderMapper.updateById(order); - - // 创建售后记录 - Aftersale aftersale = new Aftersale(); - aftersale.setMemberId(order.getMemberId()); - aftersale.setOrderId(orderId); - aftersale.setReturnAmount(order.getPayAmount()); - aftersale.setQuantity(1); - aftersale.setType(1); - aftersale.setStatus(0); - aftersale.setReason(reason); - aftersale.setAuthFlag(0); - - aftersaleMapper.insert(aftersale); - - return R.ok("退款申请已提交",aftersale); - } catch (Exception e) { - log.error("处理退款时出错,订单ID: " + orderId, e); - return R.fail("退款处理失败: " + e.getMessage()); - } - } } diff --git a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderMapper.xml b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderMapper.xml index 731f256e5..6429113fd 100644 --- a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderMapper.xml +++ b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderMapper.xml @@ -13,7 +13,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + @@ -29,7 +29,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - @@ -44,7 +43,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select id, member_id, member_username, total_amount, purchase_price, pay_amount, freight_amount, pay_type, status, aftersale_status, delivery_company, delivery_sn, auto_confirm_day, receiver_name, receiver_phone, receiver_post_code, receiver_province, receiver_city, receiver_district, receiver_province_id, receiver_city_id, receiver_district_id, receiver_detail_address, note, confirm_status, delete_status, payment_time, delivery_time, receive_time, create_by, create_time, update_by, update_time from oms_order + select id, member_id, member_username, total_amount, purchase_price, pay_amount, freight_amount, pay_type, status, aftersale, delivery_company, delivery_sn, auto_confirm_day, receiver_name, receiver_phone, receiver_post_code, receiver_province, receiver_city, receiver_district, receiver_province_id, receiver_city_id, receiver_district_id, receiver_detail_address, note, confirm_status, payment_time, delivery_time, receive_time, create_by, create_time, update_by, update_time from oms_order @@ -94,7 +93,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select a.id, a.order_sn orderSn, - a.aftersale_status aftersaleStatus, + a.aftersale aftersale, a.status, a.member_username userName, a.total_amount totalAmount, @@ -125,7 +124,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" from oms_order a -- left join oms_order_item b on a.id = b.order_id left join ums_member c on a.member_id = c.id - where a.aftersale_status = 1 + where a.aftersale = 1 and a.order_sn = #{orderSn} @@ -165,7 +164,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" total_amount, pay_amount, status, - aftersale_status, + aftersale, note, delivery_sn, coupon_amount, @@ -186,10 +185,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and status=#{status} - and aftersale_status=1 - - - and aftersale_status in (2, 3) order by create_time desc @@ -203,7 +198,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" pay_amount, coupon_amount, status, - aftersale_status, + aftersale, note, delivery_sn, create_time, @@ -216,15 +211,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" receiver_detail_address from oms_order where - delete_status=0 - and id=#{orderId} + id=#{orderId} @@ -233,7 +227,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" IFNULL(count(id), 0) orderCount, IFNULL(sum(pay_amount), 0) orderAmount from oms_order - where status in (1,2,3) and aftersale_status=1 and member_id=#{memberId} + where status in (1,2,3) and aftersale = 1 and member_id=#{memberId}