Commit 00e66216c591c7c55e82758ef3ebdc0b60679eac

Authored by YunaiV
1 parent 35528e82

trade:【交易售后】查询分页列表的前端

Showing 19 changed files with 371 additions and 181 deletions
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/TradeAfterSaleStatusEnum.java
@@ -17,15 +17,15 @@ import java.util.Arrays; @@ -17,15 +17,15 @@ import java.util.Arrays;
17 @Getter 17 @Getter
18 public enum TradeAfterSaleStatusEnum implements IntArrayValuable { 18 public enum TradeAfterSaleStatusEnum implements IntArrayValuable {
19 19
20 - APPLY(10,"申请中"),  
21 - SELLER_AGREE(20, "卖家通过"), // 卖家通过售后  
22 - BUYER_DELIVERY(30,"待卖家收货"), // 买家已退货,等待卖家收货  
23 - WAIT_REFUND(40, "等待平台退款"), // 卖家已收货,等待平台退款  
24 - COMPLETE(50, "完成"), // 完成退款  
25 -  
26 - BUYER_CANCEL(61, "买家取消售后"),  
27 - SELLER_DISAGREE(62,"卖家拒绝"), // 卖家拒绝售后  
28 - SELLER_REFUSE(63,"卖家拒绝收货"), // 卖家拒绝收货,终止售后 20 + APPLY(10,"申请中"), // 【申请售后】
  21 + SELLER_AGREE(20, "卖家通过"), // 卖家通过售后;【商品待退货】
  22 + BUYER_DELIVERY(30,"待卖家收货"), // 买家已退货,等待卖家收货;【商家待收货】
  23 + WAIT_REFUND(40, "等待平台退款"), // 卖家已收货,等待平台退款;等待退款【等待退款】
  24 + COMPLETE(50, "完成"), // 完成退款【退款成功】
  25 +
  26 + BUYER_CANCEL(61, "买家取消售后"), // 【买家取消】
  27 + SELLER_DISAGREE(62,"卖家拒绝"), // 卖家拒绝售后;商家拒绝【商家拒绝】
  28 + SELLER_REFUSE(63,"卖家拒绝收货"), // 卖家拒绝收货,终止售后;【商家拒收货】
29 ; 29 ;
30 30
31 public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeAfterSaleStatusEnum::getStatus).toArray(); 31 public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeAfterSaleStatusEnum::getStatus).toArray();
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/TradeAfterSaleTypeEnum.java
@@ -9,23 +9,23 @@ import java.util.Arrays; @@ -9,23 +9,23 @@ import java.util.Arrays;
9 /** 9 /**
10 * 交易售后 - 类型 10 * 交易售后 - 类型
11 * 11 *
12 - * @author Sin 12 + * @author 芋道源码
13 */ 13 */
14 @RequiredArgsConstructor 14 @RequiredArgsConstructor
15 @Getter 15 @Getter
16 public enum TradeAfterSaleTypeEnum implements IntArrayValuable { 16 public enum TradeAfterSaleTypeEnum implements IntArrayValuable {
17 17
18 - REFUND(10, "退款"),  
19 - RETURN_AND_REFUND(20, "退货退款"); 18 + IN_SALE(10, "售中退款"), // 交易完成前买家申请退款
  19 + AFTER_SALE(20, "售后退款"); // 交易完成后买家申请退款
20 20
21 public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeAfterSaleTypeEnum::getType).toArray(); 21 public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeAfterSaleTypeEnum::getType).toArray();
22 22
23 /** 23 /**
24 - * 状态值 24 + * 类型
25 */ 25 */
26 private final Integer type; 26 private final Integer type;
27 /** 27 /**
28 - * 状态名 28 + * 类型名
29 */ 29 */
30 private final String name; 30 private final String name;
31 31
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/TradeAfterSaleWayEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.enums.aftersale;
  2 +
  3 +import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
  4 +import lombok.Getter;
  5 +import lombok.RequiredArgsConstructor;
  6 +
  7 +import java.util.Arrays;
  8 +
  9 +/**
  10 + * 交易售后 - 方式
  11 + *
  12 + * @author Sin
  13 + */
  14 +@RequiredArgsConstructor
  15 +@Getter
  16 +public enum TradeAfterSaleWayEnum implements IntArrayValuable {
  17 +
  18 + REFUND(10, "仅退款"),
  19 + RETURN_AND_REFUND(20, "退货退款");
  20 +
  21 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeAfterSaleWayEnum::getWay).toArray();
  22 +
  23 + /**
  24 + * 方式
  25 + */
  26 + private final Integer way;
  27 + /**
  28 + * 方式名
  29 + */
  30 + private final String name;
  31 +
  32 + @Override
  33 + public int[] array() {
  34 + return ARRAYS;
  35 + }
  36 +
  37 +}
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderStatusEnum.java
@@ -53,6 +53,16 @@ public enum TradeOrderStatusEnum implements IntArrayValuable { @@ -53,6 +53,16 @@ public enum TradeOrderStatusEnum implements IntArrayValuable {
53 } 53 }
54 54
55 /** 55 /**
  56 + * 判断指定状态,是否正处于【已完成】状态
  57 + *
  58 + * @param status 指定状态
  59 + * @return 是否
  60 + */
  61 + public static boolean isCompleted(Integer status) {
  62 + return ObjectUtil.equals(status, COMPLETED.getStatus());
  63 + }
  64 +
  65 + /**
56 * 判断指定状态,是否有过【已付款】状态 66 * 判断指定状态,是否有过【已付款】状态
57 * 67 *
58 * @param status 指定状态 68 * @param status 指定状态
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/TradeAfterSaleBaseVO.java
@@ -22,14 +22,18 @@ public class TradeAfterSaleBaseVO { @@ -22,14 +22,18 @@ public class TradeAfterSaleBaseVO {
22 @NotNull(message = "售后流水号不能为空") 22 @NotNull(message = "售后流水号不能为空")
23 private String no; 23 private String no;
24 24
25 - @ApiModelProperty(value = "售后状态", required = true, example = "2", notes = "参见 TradeAfterSaleStatusEnum 枚举") 25 + @ApiModelProperty(value = "售后状态", required = true, example = "10", notes = "参见 TradeAfterSaleStatusEnum 枚举")
26 @NotNull(message = "售后状态不能为空") 26 @NotNull(message = "售后状态不能为空")
27 private Integer status; 27 private Integer status;
28 28
29 - @ApiModelProperty(value = "售后类型", required = true, example = "2", notes = "参见 TradeAfterSaleTypeEnum 枚举") 29 + @ApiModelProperty(value = "售后类型", required = true, example = "20", notes = "参见 TradeAfterSaleTypeEnum 枚举")
30 @NotNull(message = "售后类型不能为空") 30 @NotNull(message = "售后类型不能为空")
31 private Integer type; 31 private Integer type;
32 32
  33 + @ApiModelProperty(value = "售后方式", required = true, example = "10", notes = "参见 TradeAfterSaleWayEnum 枚举")
  34 + @NotNull(message = "售后方式不能为空")
  35 + private Integer way;
  36 +
33 @ApiModelProperty(value = "用户编号", required = true, example = "30337") 37 @ApiModelProperty(value = "用户编号", required = true, example = "30337")
34 @NotNull(message = "用户编号不能为空") 38 @NotNull(message = "用户编号不能为空")
35 private Long userId; 39 private Long userId;
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/TradeAfterSalePageReqVO.java
@@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam; @@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 import cn.iocoder.yudao.framework.common.validation.InEnum; 4 import cn.iocoder.yudao.framework.common.validation.InEnum;
5 import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleStatusEnum; 5 import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleStatusEnum;
6 import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleTypeEnum; 6 import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleTypeEnum;
  7 +import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleWayEnum;
7 import io.swagger.annotations.ApiModel; 8 import io.swagger.annotations.ApiModel;
8 import io.swagger.annotations.ApiModelProperty; 9 import io.swagger.annotations.ApiModelProperty;
9 import lombok.Data; 10 import lombok.Data;
@@ -24,14 +25,18 @@ public class TradeAfterSalePageReqVO extends PageParam { @@ -24,14 +25,18 @@ public class TradeAfterSalePageReqVO extends PageParam {
24 @ApiModelProperty(value = "售后流水号", example = "202211190847450020500077", notes = "模糊匹配") 25 @ApiModelProperty(value = "售后流水号", example = "202211190847450020500077", notes = "模糊匹配")
25 private String no; 26 private String no;
26 27
27 - @ApiModelProperty(value = "售后状态", example = "2", notes = "参见 TradeAfterSaleStatusEnum 枚举") 28 + @ApiModelProperty(value = "售后状态", example = "10", notes = "参见 TradeAfterSaleStatusEnum 枚举")
28 @InEnum(value = TradeAfterSaleStatusEnum.class, message = "售后状态必须是 {value}") 29 @InEnum(value = TradeAfterSaleStatusEnum.class, message = "售后状态必须是 {value}")
29 private Integer status; 30 private Integer status;
30 31
31 - @ApiModelProperty(value = "售后类型", example = "2", notes = "参见 TradeAfterSaleTypeEnum 枚举") 32 + @ApiModelProperty(value = "售后类型", example = "20", notes = "参见 TradeAfterSaleTypeEnum 枚举")
32 @InEnum(value = TradeAfterSaleTypeEnum.class, message = "售后类型必须是 {value}") 33 @InEnum(value = TradeAfterSaleTypeEnum.class, message = "售后类型必须是 {value}")
33 private Integer type; 34 private Integer type;
34 35
  36 + @ApiModelProperty(value = "售后方式", example = "10", notes = "参见 TradeAfterSaleWayEnum 枚举")
  37 + @InEnum(value = TradeAfterSaleWayEnum.class, message = "售后方式必须是 {value}")
  38 + private Integer way;
  39 +
35 @ApiModelProperty(value = "订单编号", example = "18078", notes = "模糊匹配") 40 @ApiModelProperty(value = "订单编号", example = "18078", notes = "模糊匹配")
36 private String orderNo; 41 private String orderNo;
37 42
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/aftersale/vo/AppTradeAfterSaleCreateReqVO.java
1 package cn.iocoder.yudao.module.trade.controller.app.aftersale.vo; 1 package cn.iocoder.yudao.module.trade.controller.app.aftersale.vo;
2 2
3 import cn.iocoder.yudao.framework.common.validation.InEnum; 3 import cn.iocoder.yudao.framework.common.validation.InEnum;
4 -import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleTypeEnum; 4 +import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleWayEnum;
5 import io.swagger.annotations.ApiModel; 5 import io.swagger.annotations.ApiModel;
6 import io.swagger.annotations.ApiModelProperty; 6 import io.swagger.annotations.ApiModelProperty;
7 import lombok.Data; 7 import lombok.Data;
@@ -18,10 +18,10 @@ public class AppTradeAfterSaleCreateReqVO { @@ -18,10 +18,10 @@ public class AppTradeAfterSaleCreateReqVO {
18 @NotNull(message = "订单项编号不能为空") 18 @NotNull(message = "订单项编号不能为空")
19 private Long orderItemId; 19 private Long orderItemId;
20 20
21 - @ApiModelProperty(name = "售后类型", required = true, example = "1", notes = "对应 TradeAfterSaleTypeEnum 枚举")  
22 - @NotNull(message = "售后类型不能为空")  
23 - @InEnum(value = TradeAfterSaleTypeEnum.class, message = "售后类型必须是 {value}")  
24 - private Integer type; 21 + @ApiModelProperty(name = "售后方式", required = true, example = "1", notes = "对应 TradeAfterSaleWayEnum 枚举")
  22 + @NotNull(message = "售后方式不能为空")
  23 + @InEnum(value = TradeAfterSaleWayEnum.class, message = "售后方式必须是 {value}")
  24 + private Integer way;
25 25
26 @ApiModelProperty(name = "退款金额", required = true, example = "100", notes = "单位:分") 26 @ApiModelProperty(name = "退款金额", required = true, example = "100", notes = "单位:分")
27 @NotNull(message = "退款金额不能为空") 27 @NotNull(message = "退款金额不能为空")
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/aftersale/TradeAfterSaleDO.java
@@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; @@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
5 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; 5 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
6 import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleStatusEnum; 6 import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleStatusEnum;
7 import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleTypeEnum; 7 import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleTypeEnum;
  8 +import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleWayEnum;
8 import com.baomidou.mybatisplus.annotation.TableField; 9 import com.baomidou.mybatisplus.annotation.TableField;
9 import com.baomidou.mybatisplus.annotation.TableName; 10 import com.baomidou.mybatisplus.annotation.TableName;
10 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; 11 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
@@ -43,6 +44,12 @@ public class TradeAfterSaleDO extends BaseDO { @@ -43,6 +44,12 @@ public class TradeAfterSaleDO extends BaseDO {
43 */ 44 */
44 private Integer status; 45 private Integer status;
45 /** 46 /**
  47 + * 售后方式
  48 + *
  49 + * 枚举 {@link TradeAfterSaleWayEnum}
  50 + */
  51 + private Integer way;
  52 + /**
46 * 售后类型 53 * 售后类型
47 * 54 *
48 * 枚举 {@link TradeAfterSaleTypeEnum} 55 * 枚举 {@link TradeAfterSaleTypeEnum}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/aftersale/TradeAfterSaleMapper.java
@@ -16,6 +16,7 @@ public interface TradeAfterSaleMapper extends BaseMapperX<TradeAfterSaleDO> { @@ -16,6 +16,7 @@ public interface TradeAfterSaleMapper extends BaseMapperX<TradeAfterSaleDO> {
16 .likeIfPresent(TradeAfterSaleDO::getNo, reqVO.getNo()) 16 .likeIfPresent(TradeAfterSaleDO::getNo, reqVO.getNo())
17 .eqIfPresent(TradeAfterSaleDO::getStatus, reqVO.getStatus()) 17 .eqIfPresent(TradeAfterSaleDO::getStatus, reqVO.getStatus())
18 .eqIfPresent(TradeAfterSaleDO::getType, reqVO.getType()) 18 .eqIfPresent(TradeAfterSaleDO::getType, reqVO.getType())
  19 + .eqIfPresent(TradeAfterSaleDO::getWay, reqVO.getWay())
19 .likeIfPresent(TradeAfterSaleDO::getOrderNo, reqVO.getOrderNo()) 20 .likeIfPresent(TradeAfterSaleDO::getOrderNo, reqVO.getOrderNo())
20 .likeIfPresent(TradeAfterSaleDO::getSpuName, reqVO.getSpuName()) 21 .likeIfPresent(TradeAfterSaleDO::getSpuName, reqVO.getSpuName())
21 .betweenIfPresent(TradeAfterSaleDO::getCreateTime, reqVO.getCreateTime()) 22 .betweenIfPresent(TradeAfterSaleDO::getCreateTime, reqVO.getCreateTime())
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/TradeAfterSaleServiceImpl.java
@@ -17,6 +17,7 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; @@ -17,6 +17,7 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
17 import cn.iocoder.yudao.module.trade.dal.mysql.aftersale.TradeAfterSaleMapper; 17 import cn.iocoder.yudao.module.trade.dal.mysql.aftersale.TradeAfterSaleMapper;
18 import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleStatusEnum; 18 import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleStatusEnum;
19 import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleTypeEnum; 19 import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleTypeEnum;
  20 +import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleWayEnum;
20 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum; 21 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum;
21 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum; 22 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
22 import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties; 23 import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties;
@@ -88,7 +89,6 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService { @@ -88,7 +89,6 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService {
88 if (!TradeOrderItemAfterSaleStatusEnum.isNone(orderItem.getAfterSaleStatus())) { 89 if (!TradeOrderItemAfterSaleStatusEnum.isNone(orderItem.getAfterSaleStatus())) {
89 throw exception(AFTER_SALE_CREATE_FAIL_ORDER_ITEM_APPLIED); 90 throw exception(AFTER_SALE_CREATE_FAIL_ORDER_ITEM_APPLIED);
90 } 91 }
91 - // TODO 芋艿:超过一定时间,不允许售后  
92 92
93 // 申请的退款金额,不能超过商品的价格 93 // 申请的退款金额,不能超过商品的价格
94 if (createReqVO.getRefundPrice() > orderItem.getOrderDividePrice()) { 94 if (createReqVO.getRefundPrice() > orderItem.getOrderDividePrice()) {
@@ -100,6 +100,7 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService { @@ -100,6 +100,7 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService {
100 if (order == null) { 100 if (order == null) {
101 throw exception(ORDER_NOT_FOUND); 101 throw exception(ORDER_NOT_FOUND);
102 } 102 }
  103 + // TODO 芋艿:超过一定时间,不允许售后
103 // 已取消,无法发起售后 104 // 已取消,无法发起售后
104 if (TradeOrderStatusEnum.isCanceled(order.getStatus())) { 105 if (TradeOrderStatusEnum.isCanceled(order.getStatus())) {
105 throw exception(AFTER_SALE_CREATE_FAIL_ORDER_STATUS_CANCELED); 106 throw exception(AFTER_SALE_CREATE_FAIL_ORDER_STATUS_CANCELED);
@@ -109,7 +110,7 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService { @@ -109,7 +110,7 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService {
109 throw exception(AFTER_SALE_CREATE_FAIL_ORDER_STATUS_NO_PAID); 110 throw exception(AFTER_SALE_CREATE_FAIL_ORDER_STATUS_NO_PAID);
110 } 111 }
111 // 如果是【退货退款】的情况,需要额外校验是否发货 112 // 如果是【退货退款】的情况,需要额外校验是否发货
112 - if (createReqVO.getType().equals(TradeAfterSaleTypeEnum.RETURN_AND_REFUND.getType()) 113 + if (createReqVO.getWay().equals(TradeAfterSaleWayEnum.RETURN_AND_REFUND.getWay())
113 && !TradeOrderStatusEnum.haveDelivered(order.getStatus())) { 114 && !TradeOrderStatusEnum.haveDelivered(order.getStatus())) {
114 throw exception(AFTER_SALE_CREATE_FAIL_ORDER_STATUS_NO_DELIVERED); 115 throw exception(AFTER_SALE_CREATE_FAIL_ORDER_STATUS_NO_DELIVERED);
115 } 116 }
@@ -117,16 +118,21 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService { @@ -117,16 +118,21 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService {
117 } 118 }
118 119
119 private TradeAfterSaleDO createAfterSale(AppTradeAfterSaleCreateReqVO createReqVO, 120 private TradeAfterSaleDO createAfterSale(AppTradeAfterSaleCreateReqVO createReqVO,
120 - TradeOrderItemDO tradeOrderItem) { 121 + TradeOrderItemDO orderItem) {
121 // 创建售后单 122 // 创建售后单
122 - TradeAfterSaleDO afterSale = TradeAfterSaleConvert.INSTANCE.convert(createReqVO, tradeOrderItem); 123 + TradeAfterSaleDO afterSale = TradeAfterSaleConvert.INSTANCE.convert(createReqVO, orderItem);
123 afterSale.setNo(RandomUtil.randomString(10)); // TODO 芋艿:优化 no 生成逻辑 124 afterSale.setNo(RandomUtil.randomString(10)); // TODO 芋艿:优化 no 生成逻辑
124 afterSale.setStatus(TradeAfterSaleStatusEnum.APPLY.getStatus()); 125 afterSale.setStatus(TradeAfterSaleStatusEnum.APPLY.getStatus());
  126 + // 标记是售中还是售后
  127 + TradeOrderDO order = tradeOrderService.getOrder(orderItem.getUserId(), orderItem.getOrderId());
  128 + afterSale.setOrderNo(order.getNo()); // 记录 orderNo 订单流水,方便后续检索
  129 + afterSale.setType(TradeOrderStatusEnum.isCompleted(order.getStatus())
  130 + ? TradeAfterSaleTypeEnum.AFTER_SALE.getType() : TradeAfterSaleTypeEnum.IN_SALE.getType());
125 // TODO 退还积分 131 // TODO 退还积分
126 tradeAfterSaleMapper.insert(afterSale); 132 tradeAfterSaleMapper.insert(afterSale);
127 133
128 // 更新交易订单项的售后状态 134 // 更新交易订单项的售后状态
129 - tradeOrderService.updateOrderItemAfterSaleStatus(tradeOrderItem.getId(), 135 + tradeOrderService.updateOrderItemAfterSaleStatus(orderItem.getId(),
130 TradeOrderItemAfterSaleStatusEnum.NONE.getStatus(), 136 TradeOrderItemAfterSaleStatusEnum.NONE.getStatus(),
131 TradeOrderItemAfterSaleStatusEnum.APPLY.getStatus(), null); 137 TradeOrderItemAfterSaleStatusEnum.APPLY.getStatus(), null);
132 138
@@ -145,7 +151,7 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService { @@ -145,7 +151,7 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService {
145 // 更新售后单的状态 151 // 更新售后单的状态
146 // 情况一:退款:标记为 WAIT_REFUND 状态。后续等退款发起成功后,在标记为 COMPLETE 状态 152 // 情况一:退款:标记为 WAIT_REFUND 状态。后续等退款发起成功后,在标记为 COMPLETE 状态
147 // 情况二:退货退款:需要等用户退货后,才能发起退款 153 // 情况二:退货退款:需要等用户退货后,才能发起退款
148 - Integer newStatus = afterSale.getType().equals(TradeAfterSaleTypeEnum.REFUND.getType()) ? 154 + Integer newStatus = afterSale.getType().equals(TradeAfterSaleWayEnum.REFUND.getWay()) ?
149 TradeAfterSaleStatusEnum.WAIT_REFUND.getStatus() : TradeAfterSaleStatusEnum.SELLER_AGREE.getStatus(); 155 TradeAfterSaleStatusEnum.WAIT_REFUND.getStatus() : TradeAfterSaleStatusEnum.SELLER_AGREE.getStatus();
150 updateAfterSaleStatus(afterSale.getId(), TradeAfterSaleStatusEnum.APPLY.getStatus(), new TradeAfterSaleDO() 156 updateAfterSaleStatus(afterSale.getId(), TradeAfterSaleStatusEnum.APPLY.getStatus(), new TradeAfterSaleDO()
151 .setStatus(newStatus).setAuditUserId(userId).setAuditTime(LocalDateTime.now())); 157 .setStatus(newStatus).setAuditUserId(userId).setAuditTime(LocalDateTime.now()));
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/aftersale/TradeAfterSaleServiceTest.java
@@ -11,6 +11,7 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; @@ -11,6 +11,7 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
11 import cn.iocoder.yudao.module.trade.dal.mysql.aftersale.TradeAfterSaleMapper; 11 import cn.iocoder.yudao.module.trade.dal.mysql.aftersale.TradeAfterSaleMapper;
12 import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleStatusEnum; 12 import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleStatusEnum;
13 import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleTypeEnum; 13 import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleTypeEnum;
  14 +import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleWayEnum;
14 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum; 15 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum;
15 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum; 16 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
16 import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties; 17 import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties;
@@ -58,7 +59,7 @@ public class TradeAfterSaleServiceTest extends BaseDbUnitTest { @@ -58,7 +59,7 @@ public class TradeAfterSaleServiceTest extends BaseDbUnitTest {
58 // 准备参数 59 // 准备参数
59 Long userId = 1024L; 60 Long userId = 1024L;
60 AppTradeAfterSaleCreateReqVO createReqVO = new AppTradeAfterSaleCreateReqVO() 61 AppTradeAfterSaleCreateReqVO createReqVO = new AppTradeAfterSaleCreateReqVO()
61 - .setOrderItemId(1L).setRefundPrice(100).setType(TradeAfterSaleTypeEnum.RETURN_AND_REFUND.getType()) 62 + .setOrderItemId(1L).setRefundPrice(100).setWay(TradeAfterSaleWayEnum.RETURN_AND_REFUND.getWay())
62 .setApplyReason("退钱").setApplyDescription("快退") 63 .setApplyReason("退钱").setApplyDescription("快退")
63 .setApplyPicUrls(asList("https://www.baidu.com/1.png", "https://www.baidu.com/2.png")); 64 .setApplyPicUrls(asList("https://www.baidu.com/1.png", "https://www.baidu.com/2.png"));
64 // mock 方法(交易订单项) 65 // mock 方法(交易订单项)
@@ -69,7 +70,8 @@ public class TradeAfterSaleServiceTest extends BaseDbUnitTest { @@ -69,7 +70,8 @@ public class TradeAfterSaleServiceTest extends BaseDbUnitTest {
69 when(tradeOrderService.getOrderItem(eq(1024L), eq(1L))) 70 when(tradeOrderService.getOrderItem(eq(1024L), eq(1L)))
70 .thenReturn(orderItem); 71 .thenReturn(orderItem);
71 // mock 方法(交易订单) 72 // mock 方法(交易订单)
72 - TradeOrderDO order = randomPojo(TradeOrderDO.class, o -> o.setStatus(TradeOrderStatusEnum.DELIVERED.getStatus())); 73 + TradeOrderDO order = randomPojo(TradeOrderDO.class, o -> o.setStatus(TradeOrderStatusEnum.DELIVERED.getStatus())
  74 + .setNo("202211301234"));
73 when(tradeOrderService.getOrder(eq(1024L), eq(111L))).thenReturn(order); 75 when(tradeOrderService.getOrder(eq(1024L), eq(111L))).thenReturn(order);
74 76
75 // 调用 77 // 调用
@@ -78,9 +80,11 @@ public class TradeAfterSaleServiceTest extends BaseDbUnitTest { @@ -78,9 +80,11 @@ public class TradeAfterSaleServiceTest extends BaseDbUnitTest {
78 TradeAfterSaleDO afterSale = tradeAfterSaleMapper.selectById(afterSaleId); 80 TradeAfterSaleDO afterSale = tradeAfterSaleMapper.selectById(afterSaleId);
79 assertNotNull(afterSale.getNo()); 81 assertNotNull(afterSale.getNo());
80 assertEquals(afterSale.getStatus(), TradeAfterSaleStatusEnum.APPLY.getStatus()); 82 assertEquals(afterSale.getStatus(), TradeAfterSaleStatusEnum.APPLY.getStatus());
  83 + assertEquals(afterSale.getType(), TradeAfterSaleTypeEnum.IN_SALE.getType());
81 assertPojoEquals(afterSale, createReqVO); 84 assertPojoEquals(afterSale, createReqVO);
82 assertEquals(afterSale.getUserId(), 1024L); 85 assertEquals(afterSale.getUserId(), 1024L);
83 assertPojoEquals(afterSale, orderItem, "id", "creator", "createTime", "updater", "updateTime"); 86 assertPojoEquals(afterSale, orderItem, "id", "creator", "createTime", "updater", "updateTime");
  87 + assertEquals(afterSale.getOrderNo(), "202211301234");
84 assertNull(afterSale.getPayRefundId()); 88 assertNull(afterSale.getPayRefundId());
85 assertNull(afterSale.getRefundTime()); 89 assertNull(afterSale.getRefundTime());
86 assertNull(afterSale.getLogisticsId()); 90 assertNull(afterSale.getLogisticsId());
@@ -95,7 +99,8 @@ public class TradeAfterSaleServiceTest extends BaseDbUnitTest { @@ -95,7 +99,8 @@ public class TradeAfterSaleServiceTest extends BaseDbUnitTest {
95 TradeAfterSaleDO dbAfterSale = randomPojo(TradeAfterSaleDO.class, o -> { // 等会查询到 99 TradeAfterSaleDO dbAfterSale = randomPojo(TradeAfterSaleDO.class, o -> { // 等会查询到
96 o.setNo("202211190847450020500077"); 100 o.setNo("202211190847450020500077");
97 o.setStatus(TradeAfterSaleStatusEnum.APPLY.getStatus()); 101 o.setStatus(TradeAfterSaleStatusEnum.APPLY.getStatus());
98 - o.setType(TradeAfterSaleTypeEnum.RETURN_AND_REFUND.getType()); 102 + o.setWay(TradeAfterSaleWayEnum.RETURN_AND_REFUND.getWay());
  103 + o.setType(TradeAfterSaleTypeEnum.IN_SALE.getType());
99 o.setOrderNo("202211190847450020500011"); 104 o.setOrderNo("202211190847450020500011");
100 o.setSpuName("芋艿"); 105 o.setSpuName("芋艿");
101 o.setCreateTime(buildTime(2022, 1, 15)); 106 o.setCreateTime(buildTime(2022, 1, 15));
@@ -105,8 +110,10 @@ public class TradeAfterSaleServiceTest extends BaseDbUnitTest { @@ -105,8 +110,10 @@ public class TradeAfterSaleServiceTest extends BaseDbUnitTest {
105 tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setNo("202211190847450020500066"))); 110 tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setNo("202211190847450020500066")));
106 // 测试 status 不匹配 111 // 测试 status 不匹配
107 tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setStatus(TradeAfterSaleStatusEnum.SELLER_REFUSE.getStatus()))); 112 tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setStatus(TradeAfterSaleStatusEnum.SELLER_REFUSE.getStatus())));
  113 + // 测试 way 不匹配
  114 + tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setWay(TradeAfterSaleWayEnum.REFUND.getWay())));
108 // 测试 type 不匹配 115 // 测试 type 不匹配
109 - tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setType(TradeAfterSaleTypeEnum.REFUND.getType()))); 116 + tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setType(TradeAfterSaleTypeEnum.AFTER_SALE.getType())));
110 // 测试 orderNo 不匹配 117 // 测试 orderNo 不匹配
111 tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setOrderNo("202211190847450020500022"))); 118 tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setOrderNo("202211190847450020500022")));
112 // 测试 spuName 不匹配 119 // 测试 spuName 不匹配
@@ -117,7 +124,8 @@ public class TradeAfterSaleServiceTest extends BaseDbUnitTest { @@ -117,7 +124,8 @@ public class TradeAfterSaleServiceTest extends BaseDbUnitTest {
117 TradeAfterSalePageReqVO reqVO = new TradeAfterSalePageReqVO(); 124 TradeAfterSalePageReqVO reqVO = new TradeAfterSalePageReqVO();
118 reqVO.setNo("20221119084745002050007"); 125 reqVO.setNo("20221119084745002050007");
119 reqVO.setStatus(TradeAfterSaleStatusEnum.APPLY.getStatus()); 126 reqVO.setStatus(TradeAfterSaleStatusEnum.APPLY.getStatus());
120 - reqVO.setType(TradeAfterSaleTypeEnum.RETURN_AND_REFUND.getType()); 127 + reqVO.setWay(TradeAfterSaleWayEnum.RETURN_AND_REFUND.getWay());
  128 + reqVO.setType(TradeAfterSaleTypeEnum.IN_SALE.getType());
121 reqVO.setOrderNo("20221119084745002050001"); 129 reqVO.setOrderNo("20221119084745002050001");
122 reqVO.setSpuName("芋"); 130 reqVO.setSpuName("芋");
123 reqVO.setCreateTime(new LocalDateTime[]{buildTime(2022, 1, 1), buildTime(2022, 1, 16)}); 131 reqVO.setCreateTime(new LocalDateTime[]{buildTime(2022, 1, 1), buildTime(2022, 1, 16)});
yudao-module-mall/yudao-module-trade-biz/src/test/resources/sql/create_tables.sql
@@ -75,6 +75,7 @@ CREATE TABLE IF NOT EXISTS "trade_after_sale" ( @@ -75,6 +75,7 @@ CREATE TABLE IF NOT EXISTS "trade_after_sale" (
75 "no" varchar NOT NULL, 75 "no" varchar NOT NULL,
76 "status" int NOT NULL, 76 "status" int NOT NULL,
77 "type" int NOT NULL, 77 "type" int NOT NULL,
  78 + "way" int NOT NULL,
78 "user_id" bigint NOT NULL, 79 "user_id" bigint NOT NULL,
79 "apply_reason" varchar NOT NULL, 80 "apply_reason" varchar NOT NULL,
80 "apply_description" varchar, 81 "apply_description" varchar,
yudao-ui-admin/src/api/mall/trade/afterSale.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +// 获得交易售后
  4 +export function getAfterSale(id) {
  5 + return request({
  6 + url: '/trade/after-sale/get?id=' + id,
  7 + method: 'get'
  8 + })
  9 +}
  10 +
  11 +// 获得交易售后分页
  12 +export function getAfterSalePage(query) {
  13 + return request({
  14 + url: '/trade/after-sale/page',
  15 + method: 'get',
  16 + params: query
  17 + })
  18 +}
yudao-ui-admin/src/router/index.js
@@ -216,12 +216,6 @@ export const constantRoutes = [ @@ -216,12 +216,6 @@ export const constantRoutes = [
216 hidden: true, 216 hidden: true,
217 meta: { title: '订单详情' }, 217 meta: { title: '订单详情' },
218 component: (resolve) => require(['@/views/mall/trade/order/detail'], resolve) 218 component: (resolve) => require(['@/views/mall/trade/order/detail'], resolve)
219 - },  
220 - {  
221 - path: '/mall/trade/orderrefund',  
222 - name: '退款维权',  
223 - meta: { title: '退款维权' },  
224 - component: (resolve) => require(['@/views/mall/trade/orderrefund'], resolve)  
225 } 219 }
226 ] 220 ]
227 } 221 }
yudao-ui-admin/src/utils/constants.js
@@ -3,6 +3,37 @@ @@ -3,6 +3,37 @@
3 * 3 *
4 * 枚举类 4 * 枚举类
5 */ 5 */
  6 +import {beginOfDay, endOfDay} from "@/utils/dateUtils";
  7 +
  8 +export const datePickerOptions = {
  9 + shortcuts: [{
  10 + text: '最近一周',
  11 + onClick(picker) {
  12 + const start = new Date();
  13 + start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
  14 + const end = new Date();
  15 + picker.$emit('pick', [beginOfDay(start), endOfDay(end)]);
  16 + }
  17 + }, {
  18 + text: '最近一个月',
  19 + onClick(picker) {
  20 + const start = new Date();
  21 + start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
  22 + const end = new Date();
  23 + picker.$emit('pick', [beginOfDay(start), endOfDay(end)]);
  24 + }
  25 + }, {
  26 + text: '最近三个月',
  27 + onClick(picker) {
  28 + const start = new Date();
  29 + start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
  30 + const end = new Date();
  31 + picker.$emit('pick', [beginOfDay(start), endOfDay(end)]);
  32 + }
  33 + }]
  34 +}
  35 +
  36 +// ========== 静态变量 ==========
6 37
7 /** 38 /**
8 * 全局通用状态枚举 39 * 全局通用状态枚举
yudao-ui-admin/src/utils/dateUtils.js
@@ -24,3 +24,11 @@ export function getDate(ms) { @@ -24,3 +24,11 @@ export function getDate(ms) {
24 return 0 + "秒"; 24 return 0 + "秒";
25 } 25 }
26 } 26 }
  27 +
  28 +export function beginOfDay(date) {
  29 + return new Date(date.getFullYear(), date.getMonth(), date.getDate());
  30 +}
  31 +
  32 +export function endOfDay(date) {
  33 + return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59, 999);
  34 +}
yudao-ui-admin/src/utils/dict.js
@@ -60,6 +60,11 @@ export const DICT_TYPE = { @@ -60,6 +60,11 @@ export const DICT_TYPE = {
60 // ========== MALL - PRODUCT 模块 ========== 60 // ========== MALL - PRODUCT 模块 ==========
61 PRODUCT_SPU_STATUS: 'product_spu_status', // 商品 SPU 状态 61 PRODUCT_SPU_STATUS: 'product_spu_status', // 商品 SPU 状态
62 62
  63 + // ========== MALL - ORDER 模块 ==========
  64 + TRADE_AFTER_SALE_STATUS: 'trade_after_sale_status', // 售后 - 状态
  65 + TRADE_AFTER_SALE_WAY: 'trade_after_sale_way', // 售后 - 方式
  66 + TRADE_AFTER_SALE_TYPE: 'trade_after_sale_type', // 售后 - 类型
  67 +
63 // ========== MALL - PROMOTION 模块 ========== 68 // ========== MALL - PROMOTION 模块 ==========
64 PROMOTION_DISCOUNT_TYPE: 'promotion_discount_type', // 优惠类型 69 PROMOTION_DISCOUNT_TYPE: 'promotion_discount_type', // 优惠类型
65 PROMOTION_PRODUCT_SCOPE: 'promotion_product_scope', // 营销的商品范围 70 PROMOTION_PRODUCT_SCOPE: 'promotion_product_scope', // 营销的商品范围
yudao-ui-admin/src/views/mall/trade/orderrefund/index.vue renamed to yudao-ui-admin/src/views/mall/trade/afterSale/bak.vue
@@ -4,42 +4,6 @@ @@ -4,42 +4,6 @@
4 <el-row :gutter="20"> 4 <el-row :gutter="20">
5 <el-form :model="queryParams" label-width="68px" size="small"> 5 <el-form :model="queryParams" label-width="68px" size="small">
6 <el-col :span="6" :xs="24"> 6 <el-col :span="6" :xs="24">
7 - <el-form-item label="商品名称">  
8 - <el-input v-model="queryParams.name" style="width: 240px"></el-input>  
9 - </el-form-item>  
10 - </el-col>  
11 - <el-col :span="6" :xs="24">  
12 - <el-form-item label="订单编号">  
13 - <el-input v-model="queryParams.No" style="width: 240px"></el-input>  
14 - </el-form-item>  
15 - </el-col>  
16 - <el-col :span="6" :xs="24">  
17 - <el-form-item label="退款编号">  
18 - <el-input v-model="queryParams.refundNo" style="width: 240px"></el-input>  
19 - </el-form-item>  
20 - </el-col>  
21 - <el-col :span="6" :xs="24">  
22 - <el-form-item label="退款状态">  
23 - <el-select v-model="queryParams.refundStatus" clearable style="width: 240px">  
24 - <el-option v-for="dict in dicData.refundStatus" v-bind="dict" :key="dict.value"/>  
25 - </el-select>  
26 - </el-form-item>  
27 - </el-col>  
28 - <el-col :span="6" :xs="24">  
29 - <el-form-item label="退款方式">  
30 - <el-select v-model="queryParams.refundWay" clearable style="width: 240px">  
31 - <el-option v-for="dict in dicData.refundWay" v-bind="dict" :key="dict.value"/>  
32 - </el-select>  
33 - </el-form-item>  
34 - </el-col>  
35 - <el-col :span="6" :xs="24">  
36 - <el-form-item label="维权类型">  
37 - <el-select v-model="queryParams.refundType" clearable style="width: 240px">  
38 - <el-option v-for="dict in dicData.refundType" v-bind="dict" :key="dict.value"/>  
39 - </el-select>  
40 - </el-form-item>  
41 - </el-col>  
42 - <el-col :span="6" :xs="24">  
43 <el-form-item label="下单时间"> 7 <el-form-item label="下单时间">
44 <el-date-picker v-model="queryParams.date" type="daterange" range-separator="至" 8 <el-date-picker v-model="queryParams.date" type="daterange" range-separator="至"
45 start-placeholder="开始日期" end-placeholder="结束日期" :picker-options="rangePickerOptions" style="width: 240px"/> 9 start-placeholder="开始日期" end-placeholder="结束日期" :picker-options="rangePickerOptions" style="width: 240px"/>
@@ -60,12 +24,6 @@ @@ -60,12 +24,6 @@
60 <el-table :data="tableData" :show-header="false" class="table-wrapper"> 24 <el-table :data="tableData" :show-header="false" class="table-wrapper">
61 <el-table-column> 25 <el-table-column>
62 <template slot-scope="{ row }"> 26 <template slot-scope="{ row }">
63 - <div class="table-header">  
64 - 退款编号:{{row.tkbh}}  
65 - <el-button type="text" style="margin-left: 10px">  
66 - 订单编号:{{row.ddbh}}  
67 - </el-button>  
68 - </div>  
69 <!-- 订单下的商品 --> 27 <!-- 订单下的商品 -->
70 <el-table :data="row.goods" border> 28 <el-table :data="row.goods" border>
71 <el-table-column label="商品信息" prop="spxx" header-align="center" width="auto" min-width="300"> 29 <el-table-column label="商品信息" prop="spxx" header-align="center" width="auto" min-width="300">
@@ -114,33 +72,7 @@ const dicData = { @@ -114,33 +72,7 @@ const dicData = {
114 { label: '售后退款', value: 'shtk' } 72 { label: '售后退款', value: 'shtk' }
115 ] 73 ]
116 } 74 }
117 -const rangePickerOptions = {  
118 - shortcuts: [{  
119 - text: '最近一周',  
120 - onClick(picker) {  
121 - const end = new Date();  
122 - const start = new Date();  
123 - start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);  
124 - picker.$emit('pick', [start, end]);  
125 - }  
126 - }, {  
127 - text: '最近一个月',  
128 - onClick(picker) {  
129 - const end = new Date();  
130 - const start = new Date();  
131 - start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);  
132 - picker.$emit('pick', [start, end]);  
133 - }  
134 - }, {  
135 - text: '最近三个月',  
136 - onClick(picker) {  
137 - const end = new Date();  
138 - const start = new Date();  
139 - start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);  
140 - picker.$emit('pick', [start, end]);  
141 - }  
142 - }]  
143 -} 75 +
144 export default { 76 export default {
145 name: "index", 77 name: "index",
146 data () { 78 data () {
@@ -172,15 +104,6 @@ export default { @@ -172,15 +104,6 @@ export default {
172 tkje: 460, 104 tkje: 460,
173 sqsj: '2022-11-19', 105 sqsj: '2022-11-19',
174 tkzt: '申请维权(仅退款)' 106 tkzt: '申请维权(仅退款)'
175 - },  
176 - {  
177 - name: '颜衫短袖男polo衫夏季翻领衣服潮牌休闲上衣夏天翻领半袖男士t恤',  
178 - img: 'https://b2c-v5-yanshi.oss-cn-hangzhou.aliyuncs.com/upload/1/common/images/20220723/20220723115621165854858145027_SMALL.webp',  
179 - ddje: '199',  
180 - mj: '张三',  
181 - tkje: 460,  
182 - sqsj: '2022-11-19',  
183 - tkzt: '申请维权(仅退款)'  
184 } 107 }
185 ] 108 ]
186 }, 109 },
@@ -196,15 +119,6 @@ export default { @@ -196,15 +119,6 @@ export default {
196 tkje: 460, 119 tkje: 460,
197 sqsj: '2022-11-19', 120 sqsj: '2022-11-19',
198 tkzt: '申请维权(仅退款)' 121 tkzt: '申请维权(仅退款)'
199 - },  
200 - {  
201 - name: '颜衫短袖男polo衫夏季翻领衣服潮牌休闲上衣夏天翻领半袖男士t恤',  
202 - img: 'https://b2c-v5-yanshi.oss-cn-hangzhou.aliyuncs.com/upload/1/common/images/20220723/20220723115621165854858145027_SMALL.webp',  
203 - ddje: '199',  
204 - mj: '张三',  
205 - tkje: 460,  
206 - sqsj: '2022-11-19',  
207 - tkzt: '申请维权(仅退款)'  
208 } 122 }
209 ] 123 ]
210 }, 124 },
@@ -220,15 +134,6 @@ export default { @@ -220,15 +134,6 @@ export default {
220 tkje: 460, 134 tkje: 460,
221 sqsj: '2022-11-19', 135 sqsj: '2022-11-19',
222 tkzt: '申请维权(仅退款)' 136 tkzt: '申请维权(仅退款)'
223 - },  
224 - {  
225 - name: '颜衫短袖男polo衫夏季翻领衣服潮牌休闲上衣夏天翻领半袖男士t恤',  
226 - img: 'https://b2c-v5-yanshi.oss-cn-hangzhou.aliyuncs.com/upload/1/common/images/20220723/20220723115621165854858145027_SMALL.webp',  
227 - ddje: '199',  
228 - mj: '张三',  
229 - tkje: 460,  
230 - sqsj: '2022-11-19',  
231 - tkzt: '申请维权(仅退款)'  
232 } 137 }
233 ] 138 ]
234 } 139 }
@@ -242,48 +147,3 @@ export default { @@ -242,48 +147,3 @@ export default {
242 } 147 }
243 } 148 }
244 </script> 149 </script>
245 -  
246 -<style lang="scss" scoped>  
247 - ::v-deep .table-wrapper{  
248 - border-bottom: none;  
249 - &::before{  
250 - height: 0;  
251 - }  
252 - .table-header{  
253 - line-height: 36px;  
254 - }  
255 - .el-table__row{  
256 - .el-table__cell{  
257 - border-bottom: none;  
258 - .cell{  
259 - .el-table {  
260 - .el-table__row{  
261 - >.el-table__cell{  
262 - .goods-info{  
263 - display: flex;  
264 - img{  
265 - margin-right: 10px;  
266 - width: 60px;  
267 - height: 60px;  
268 - border: 1px solid #e2e2e2;  
269 - }  
270 - }  
271 - .ellipsis-2{  
272 - display: -webkit-box;  
273 - overflow: hidden;  
274 - text-overflow: ellipsis;  
275 - white-space: normal;  
276 - -webkit-line-clamp: 2; /* 要显示的行数 */  
277 - -webkit-box-orient: vertical;  
278 - word-break: break-all;  
279 - line-height: 22px !important;  
280 - max-height: 44px !important;  
281 - }  
282 - }  
283 - }  
284 - }  
285 - }  
286 - }  
287 - }  
288 - }  
289 -</style>  
yudao-ui-admin/src/views/mall/trade/afterSale/index.vue 0 → 100644
  1 +<template>
  2 + <div class="app-container">
  3 +
  4 + <!-- 搜索工作栏 -->
  5 + <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
  6 + <el-form-item label="商品名称" prop="spuName">
  7 + <el-input v-model="queryParams.spuName" placeholder="请输入商品 SPU 名称" clearable @keyup.enter.native="handleQuery"/>
  8 + </el-form-item>
  9 + <el-form-item label="退款编号" prop="no">
  10 + <el-input v-model="queryParams.no" placeholder="请输入退款编号" clearable @keyup.enter.native="handleQuery"/>
  11 + </el-form-item>
  12 + <el-form-item label="订单编号" prop="orderNo">
  13 + <el-input v-model="queryParams.orderNo" placeholder="请输入订单编号" clearable @keyup.enter.native="handleQuery"/>
  14 + </el-form-item>
  15 + <el-form-item label="售后状态" prop="status">
  16 + <el-select v-model="queryParams.status" placeholder="请选择售后状态" clearable size="small">
  17 + <el-option v-for="dict in this.getDictDatas(DICT_TYPE.TRADE_AFTER_SALE_STATUS)"
  18 + :key="dict.value" :label="dict.label" :value="dict.value"/>
  19 + </el-select>
  20 + </el-form-item>
  21 + <el-form-item label="售后方式" prop="way">
  22 + <el-select v-model="queryParams.way" placeholder="请选择售后方式" clearable size="small">
  23 + <el-option v-for="dict in this.getDictDatas(DICT_TYPE.TRADE_AFTER_SALE_WAY)"
  24 + :key="dict.value" :label="dict.label" :value="dict.value"/>
  25 + </el-select>
  26 + </el-form-item>
  27 + <el-form-item label="售后类型" prop="type">
  28 + <el-select v-model="queryParams.type" placeholder="请选择售后类型" clearable size="small">
  29 + <el-option v-for="dict in this.getDictDatas(DICT_TYPE.TRADE_AFTER_SALE_TYPE)"
  30 + :key="dict.value" :label="dict.label" :value="dict.value"/>
  31 + </el-select>
  32 + </el-form-item>
  33 + <el-form-item label="创建时间" prop="createTime">
  34 + <el-date-picker v-model="queryParams.createTime" style="width: 240px" value-format="yyyy-MM-dd HH:mm:ss" type="daterange"
  35 + range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
  36 + :picker-options="datePickerOptions" :default-time="['00:00:00', '23:59:59']" />
  37 + </el-form-item>
  38 + <el-form-item>
  39 + <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
  40 + <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
  41 + </el-form-item>
  42 + </el-form>
  43 +
  44 + <!-- 操作工具栏 -->
  45 + <el-row :gutter="10" class="mb8">
  46 + <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
  47 + </el-row>
  48 +
  49 + <!-- 列表 -->
  50 + <el-table v-loading="loading" :data="list">
  51 + <el-table-column label="退款编号" align="center" prop="no" />
  52 + <el-table-column label="订单编号" align="center" prop="orderNo" />
  53 + <el-table-column label="订单编号" align="center" prop="orderNo" />
  54 + <el-table-column label="商品信息" align="center" prop="status" width="auto" min-width="300">
  55 + <!-- TODO @小红:样式不太对,辛苦改改 -->
  56 +<!-- <div slot-scope="{ row }" class="goods-info">-->
  57 +<!-- <img :src="row.picUrl"/>-->
  58 +<!-- <span class="ellipsis-2" :title="row.name">{{row.name}}</span>-->
  59 +<!-- </div>-->
  60 + </el-table-column>
  61 + <el-table-column label="订单金额" align="center" prop="refundPrice" />
  62 + <el-table-column label="买家" align="center" prop="userId" />
  63 + <el-table-column label="申请时间" align="center" prop="createTime" width="180">
  64 + <template v-slot="scope">
  65 + <span>{{ parseTime(scope.row.createTime) }}</span>
  66 + </template>
  67 + </el-table-column>
  68 + <el-table-column label="售后状态" align="center">
  69 + <template v-slot="scope">
  70 + <dict-tag :type="DICT_TYPE.TRADE_AFTER_SALE_STATUS" :value="scope.row.status" />
  71 + </template>
  72 + </el-table-column>
  73 + <el-table-column label="售后方式" align="center">
  74 + <template v-slot="scope">
  75 + <dict-tag :type="DICT_TYPE.TRADE_AFTER_SALE_WAY" :value="scope.row.way" />
  76 + </template>
  77 + </el-table-column>
  78 + <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
  79 + <template v-slot="scope">
  80 +<!-- <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"-->
  81 +<!-- v-hasPermi="['trade:after-sale:update']">修改</el-button>-->
  82 + </template>
  83 + </el-table-column>
  84 + </el-table>
  85 + <!-- 分页组件 -->
  86 + <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
  87 + @pagination="getList"/>
  88 + </div>
  89 +</template>
  90 +
  91 +<script>
  92 +import { getAfterSalePage } from "@/api/mall/trade/afterSale";
  93 +import { datePickerOptions } from "@/utils/constants";
  94 +
  95 +export default {
  96 + name: "AfterSale",
  97 + components: {
  98 + },
  99 + data() {
  100 + return {
  101 + // 遮罩层
  102 + loading: true,
  103 + // 导出遮罩层
  104 + exportLoading: false,
  105 + // 显示搜索条件
  106 + showSearch: true,
  107 + // 总条数
  108 + total: 0,
  109 + // 交易售后列表
  110 + list: [],
  111 + // 弹出层标题
  112 + title: "",
  113 + // 是否显示弹出层
  114 + open: false,
  115 + // 查询参数
  116 + queryParams: {
  117 + pageNo: 1,
  118 + pageSize: 10,
  119 + no: null,
  120 + status: null,
  121 + orderNo: null,
  122 + spuName: null,
  123 + createTime: [],
  124 + way: null,
  125 + type: null,
  126 + },
  127 + // 静态变量
  128 + datePickerOptions: datePickerOptions
  129 + };
  130 + },
  131 + created() {
  132 + this.getList();
  133 + },
  134 + methods: {
  135 + /** 查询列表 */
  136 + getList() {
  137 + this.loading = true;
  138 + // 执行查询
  139 + getAfterSalePage(this.queryParams).then(response => {
  140 + this.list = response.data.list;
  141 + this.total = response.data.total;
  142 + this.loading = false;
  143 + });
  144 + },
  145 + /** 搜索按钮操作 */
  146 + handleQuery() {
  147 + this.queryParams.pageNo = 1;
  148 + this.getList();
  149 + },
  150 + /** 重置按钮操作 */
  151 + resetQuery() {
  152 + this.resetForm("queryForm");
  153 + this.handleQuery();
  154 + },
  155 + }
  156 +};
  157 +</script>
  158 +
  159 +<style lang="scss" scoped>
  160 +::v-deep .table-wrapper {
  161 + .el-table__row{
  162 + .el-table__cell {
  163 + border-bottom: none;
  164 + .cell{
  165 + .el-table {
  166 + .el-table__row {
  167 + >.el-table__cell {
  168 + .goods-info{
  169 + display: flex;
  170 + img{
  171 + margin-right: 10px;
  172 + width: 60px;
  173 + height: 60px;
  174 + border: 1px solid #e2e2e2;
  175 + }
  176 + }
  177 + .ellipsis-2 {
  178 + display: -webkit-box;
  179 + overflow: hidden;
  180 + text-overflow: ellipsis;
  181 + white-space: normal;
  182 + -webkit-line-clamp: 2; /* 要显示的行数 */
  183 + -webkit-box-orient: vertical;
  184 + word-break: break-all;
  185 + line-height: 22px !important;
  186 + max-height: 44px !important;
  187 + }
  188 + }
  189 + }
  190 + }
  191 + }
  192 + }
  193 + }
  194 +}
  195 +</style>