Commit e942b52a67471b6b79f525be52b1df371dcc8b90
1 parent
e745bb66
mall:订单详情:调整售后字段
Showing
11 changed files
with
67 additions
and
67 deletions
yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/delivery/DeliveryTypeEnum.java renamed to yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/delivery/DeliveryTypeEnum.java
| 1 | -package cn.iocoder.yudao.module.product.enums.delivery; | |
| 1 | +package cn.iocoder.yudao.module.trade.enums.delivery; | |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.common.core.IntArrayValuable; |
| 4 | 4 | import lombok.AllArgsConstructor; |
| ... | ... | @@ -15,9 +15,8 @@ import java.util.Arrays; |
| 15 | 15 | @AllArgsConstructor |
| 16 | 16 | public enum DeliveryTypeEnum implements IntArrayValuable { |
| 17 | 17 | |
| 18 | - // TODO 芋艿:英文单词,需要再想下; | |
| 19 | 18 | EXPRESS(1, "快递发货"), |
| 20 | - USER(2, "用户自提"),; | |
| 19 | + PICK_UP(2, "用户自提"),; | |
| 21 | 20 | |
| 22 | 21 | public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(DeliveryTypeEnum::getMode).toArray(); |
| 23 | 22 | ... | ... |
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderItemAfterSaleStatusEnum.java
| ... | ... | @@ -17,8 +17,8 @@ import java.util.Arrays; |
| 17 | 17 | public enum TradeOrderItemAfterSaleStatusEnum implements IntArrayValuable { |
| 18 | 18 | |
| 19 | 19 | NONE(0, "未售后"), |
| 20 | - APPLY(1, "售后中"), | |
| 21 | - SUCCESS(2, "已退款"); | |
| 20 | + APPLY(10, "售后中"), | |
| 21 | + SUCCESS(20, "售后成功"); | |
| 22 | 22 | |
| 23 | 23 | public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeOrderItemAfterSaleStatusEnum::getStatus).toArray(); |
| 24 | 24 | |
| ... | ... | @@ -31,9 +31,6 @@ public enum TradeOrderItemAfterSaleStatusEnum implements IntArrayValuable { |
| 31 | 31 | */ |
| 32 | 32 | private final String name; |
| 33 | 33 | |
| 34 | - // TODO 芋艿:EXPIRED 已失效不允许申请售后 | |
| 35 | - // TODO 芋艿:PART_AFTER_SALE 部分售后 | |
| 36 | - | |
| 37 | 34 | @Override |
| 38 | 35 | public int[] array() { |
| 39 | 36 | return ARRAYS; | ... | ... |
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderAfterSaleStatusEnum.java renamed to yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderRefundStatusEnum.java
| ... | ... | @@ -7,19 +7,19 @@ import lombok.RequiredArgsConstructor; |
| 7 | 7 | import java.util.Arrays; |
| 8 | 8 | |
| 9 | 9 | /** |
| 10 | - * 交易订单 - 售后状态 | |
| 10 | + * 交易订单 - 退款状态 | |
| 11 | 11 | * |
| 12 | 12 | * @author Sin |
| 13 | 13 | */ |
| 14 | 14 | @RequiredArgsConstructor |
| 15 | 15 | @Getter |
| 16 | -public enum TradeOrderAfterSaleStatusEnum implements IntArrayValuable { | |
| 16 | +public enum TradeOrderRefundStatusEnum implements IntArrayValuable { | |
| 17 | 17 | |
| 18 | 18 | NONE(0, "未退款"), |
| 19 | - PART(1, "部分退款"), | |
| 20 | - ALL(2, "全部退款"); | |
| 19 | + PART(10, "部分退款"), | |
| 20 | + ALL(20, "全部退款"); | |
| 21 | 21 | |
| 22 | - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeOrderAfterSaleStatusEnum::getStatus).toArray(); | |
| 22 | + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeOrderRefundStatusEnum::getStatus).toArray(); | |
| 23 | 23 | |
| 24 | 24 | /** |
| 25 | 25 | * 状态值 | ... | ... |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.java
| ... | ... | @@ -13,6 +13,7 @@ import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert; |
| 13 | 13 | import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; |
| 14 | 14 | import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; |
| 15 | 15 | import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum; |
| 16 | +import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties; | |
| 16 | 17 | import cn.iocoder.yudao.module.trade.service.order.TradeOrderService; |
| 17 | 18 | import io.swagger.v3.oas.annotations.Operation; |
| 18 | 19 | import io.swagger.v3.oas.annotations.Parameter; |
| ... | ... | @@ -46,6 +47,9 @@ public class AppTradeOrderController { |
| 46 | 47 | @Resource |
| 47 | 48 | private ProductPropertyValueApi productPropertyValueApi; |
| 48 | 49 | |
| 50 | + @Resource | |
| 51 | + private TradeOrderProperties tradeOrderProperties; | |
| 52 | + | |
| 49 | 53 | @GetMapping("/settlement") |
| 50 | 54 | @Operation(summary = "获得订单结算信息") |
| 51 | 55 | @PreAuthenticated |
| ... | ... | @@ -154,7 +158,8 @@ public class AppTradeOrderController { |
| 154 | 158 | List<ProductPropertyValueDetailRespDTO> propertyValueDetails = productPropertyValueApi |
| 155 | 159 | .getPropertyValueDetailList(TradeOrderConvert.INSTANCE.convertPropertyValueIds(orderItems)); |
| 156 | 160 | // 最终组合 |
| 157 | - return success(TradeOrderConvert.INSTANCE.convert02(order, orderItems, propertyValueDetails)); | |
| 161 | + return success(TradeOrderConvert.INSTANCE.convert02(order, orderItems, | |
| 162 | + propertyValueDetails, tradeOrderProperties)); | |
| 158 | 163 | } |
| 159 | 164 | |
| 160 | 165 | @GetMapping("/page") | ... | ... |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderDetailRespVO.java
| 1 | 1 | package cn.iocoder.yudao.module.trade.controller.app.order.vo; |
| 2 | 2 | |
| 3 | -import cn.iocoder.yudao.module.trade.controller.app.base.property.AppProductPropertyValueDetailRespVO; | |
| 3 | +import cn.iocoder.yudao.module.trade.controller.app.order.vo.item.AppTradeOrderItemRespVO; | |
| 4 | 4 | import io.swagger.v3.oas.annotations.media.Schema; |
| 5 | 5 | import lombok.Data; |
| 6 | 6 | |
| ... | ... | @@ -38,6 +38,9 @@ public class AppTradeOrderDetailRespVO { |
| 38 | 38 | @Schema(description = "订单取消时间") |
| 39 | 39 | private LocalDateTime cancelTime; |
| 40 | 40 | |
| 41 | + @Schema(description = "是否评价", required = true, example = "true") | |
| 42 | + private Boolean commentStatus; | |
| 43 | + | |
| 41 | 44 | // ========== 价格 + 支付基本信息 ========== |
| 42 | 45 | |
| 43 | 46 | @Schema(description = "是否已支付", required = true, example = "true") |
| ... | ... | @@ -49,6 +52,9 @@ public class AppTradeOrderDetailRespVO { |
| 49 | 52 | @Schema(description = "付款时间") |
| 50 | 53 | private LocalDateTime payTime; |
| 51 | 54 | |
| 55 | + @Schema(description = "付款超时时间", required = true) | |
| 56 | + private LocalDateTime payExpireTime; | |
| 57 | + | |
| 52 | 58 | @Schema(description = "支付渠道", required = true, example = "wx_lite_pay") |
| 53 | 59 | private String payChannelCode; |
| 54 | 60 | |
| ... | ... | @@ -72,6 +78,9 @@ public class AppTradeOrderDetailRespVO { |
| 72 | 78 | |
| 73 | 79 | // ========== 收件 + 物流基本信息 ========== |
| 74 | 80 | |
| 81 | + @Schema(description = "配送方式", required = true, example = "1") | |
| 82 | + private Integer deliveryType; | |
| 83 | + | |
| 75 | 84 | @Schema(description = "发货物流单号", example = "1024") |
| 76 | 85 | private String logisticsNo; |
| 77 | 86 | |
| ... | ... | @@ -112,42 +121,6 @@ public class AppTradeOrderDetailRespVO { |
| 112 | 121 | /** |
| 113 | 122 | * 订单项数组 |
| 114 | 123 | */ |
| 115 | - private List<Item> items; | |
| 116 | - | |
| 117 | - @Schema(description = "用户 App - 交易订单的分页项的订单项目") | |
| 118 | - @Data | |
| 119 | - public static class Item { | |
| 120 | - | |
| 121 | - @Schema(description = "编号", required = true, example = "1") | |
| 122 | - private Long id; | |
| 123 | - | |
| 124 | - @Schema(description = "商品 SPU 编号", required = true, example = "1") | |
| 125 | - private Long spuId; | |
| 126 | - @Schema(description = "商品 SPU 名称", required = true, example = "芋道源码") | |
| 127 | - private String spuName; | |
| 128 | - | |
| 129 | - @Schema(description = "商品 SKU 编号", required = true, example = "1") | |
| 130 | - private Long skuId; | |
| 131 | - | |
| 132 | - /** | |
| 133 | - * 属性数组 | |
| 134 | - */ | |
| 135 | - private List<AppProductPropertyValueDetailRespVO> properties; | |
| 136 | - | |
| 137 | - @Schema(description = "商品图片", required = true, example = "https://www.iocoder.cn/1.png") | |
| 138 | - private String picUrl; | |
| 139 | - | |
| 140 | - @Schema(description = "购买数量", required = true, example = "1") | |
| 141 | - private Integer count; | |
| 142 | - | |
| 143 | - @Schema(description = "是否评价", required = true, example = "true") | |
| 144 | - private Boolean commentStatus; | |
| 145 | - | |
| 146 | - // ========== 价格 + 支付基本信息 ========== | |
| 147 | - | |
| 148 | - @Schema(description = "商品原价(单)", required = true, example = "100") | |
| 149 | - private Integer price; | |
| 150 | - | |
| 151 | - } | |
| 124 | + private List<AppTradeOrderItemRespVO> items; | |
| 152 | 125 | |
| 153 | 126 | } | ... | ... |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderPageItemRespVO.java
| ... | ... | @@ -37,6 +37,11 @@ public class AppTradeOrderPageItemRespVO { |
| 37 | 37 | @Schema(description = "应付金额,单位:分", required = true, example = "1000") |
| 38 | 38 | private Integer payPrice; |
| 39 | 39 | |
| 40 | + // ========== 收件 + 物流基本信息 ========== | |
| 41 | + | |
| 42 | + @Schema(description = "配送方式", required = true, example = "1") | |
| 43 | + private Integer deliveryType; | |
| 44 | + | |
| 40 | 45 | /** |
| 41 | 46 | * 订单项数组 |
| 42 | 47 | */ | ... | ... |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/item/AppTradeOrderItemRespVO.java
| ... | ... | @@ -15,25 +15,38 @@ public class AppTradeOrderItemRespVO { |
| 15 | 15 | |
| 16 | 16 | @Schema(description = "商品 SPU 编号", required = true, example = "1") |
| 17 | 17 | private Long spuId; |
| 18 | - | |
| 19 | 18 | @Schema(description = "商品 SPU 名称", required = true, example = "芋道源码") |
| 20 | 19 | private String spuName; |
| 21 | 20 | |
| 22 | 21 | @Schema(description = "商品 SKU 编号", required = true, example = "1") |
| 23 | 22 | private Long skuId; |
| 24 | 23 | |
| 24 | + /** | |
| 25 | + * 属性数组 | |
| 26 | + */ | |
| 27 | + private List<AppProductPropertyValueDetailRespVO> properties; | |
| 28 | + | |
| 25 | 29 | @Schema(description = "商品图片", required = true, example = "https://www.iocoder.cn/1.png") |
| 26 | 30 | private String picUrl; |
| 27 | 31 | |
| 28 | 32 | @Schema(description = "购买数量", required = true, example = "1") |
| 29 | 33 | private Integer count; |
| 30 | 34 | |
| 35 | + @Schema(description = "是否评价", required = true, example = "true") | |
| 36 | + private Boolean commentStatus; | |
| 37 | + | |
| 38 | + // ========== 价格 + 支付基本信息 ========== | |
| 39 | + | |
| 31 | 40 | @Schema(description = "商品原价(单)", required = true, example = "100") |
| 32 | 41 | private Integer price; |
| 33 | 42 | |
| 34 | - /** | |
| 35 | - * 属性数组 | |
| 36 | - */ | |
| 37 | - private List<AppProductPropertyValueDetailRespVO> properties; | |
| 43 | + // ========== 营销基本信息 ========== | |
| 44 | + | |
| 45 | + // TODO 芋艿:在捉摸一下 | |
| 46 | + | |
| 47 | + // ========== 售后基本信息 ========== | |
| 38 | 48 | |
| 49 | + @Schema(description = "售后状态", required = true, example = "1") | |
| 50 | + private Integer afterSaleStatus; | |
| 51 | + | |
| 39 | 52 | } | ... | ... |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderConvert.java
| ... | ... | @@ -212,8 +212,9 @@ public interface TradeOrderConvert { |
| 212 | 212 | AppProductPropertyValueDetailRespVO convert02(ProductPropertyValueDetailRespDTO bean); |
| 213 | 213 | |
| 214 | 214 | default AppTradeOrderDetailRespVO convert02(TradeOrderDO order, List<TradeOrderItemDO> orderItems, |
| 215 | - List<ProductPropertyValueDetailRespDTO> propertyValueDetails) { | |
| 215 | + List<ProductPropertyValueDetailRespDTO> propertyValueDetails, TradeOrderProperties tradeOrderProperties) { | |
| 216 | 216 | AppTradeOrderDetailRespVO orderVO = convert3(order, orderItems); |
| 217 | + orderVO.setPayExpireTime(addTime(tradeOrderProperties.getExpireTime())); | |
| 217 | 218 | // 处理商品属性 |
| 218 | 219 | Map<Long, ProductPropertyValueDetailRespDTO> propertyValueDetailMap = convertMap(propertyValueDetails, ProductPropertyValueDetailRespDTO::getValueId); |
| 219 | 220 | for (int i = 0; i < orderItems.size(); i++) { |
| ... | ... | @@ -221,7 +222,7 @@ public interface TradeOrderConvert { |
| 221 | 222 | if (CollUtil.isEmpty(properties)) { |
| 222 | 223 | continue; |
| 223 | 224 | } |
| 224 | - AppTradeOrderDetailRespVO.Item item = orderVO.getItems().get(i); | |
| 225 | + AppTradeOrderItemRespVO item = orderVO.getItems().get(i); | |
| 225 | 226 | item.setProperties(new ArrayList<>(properties.size())); |
| 226 | 227 | // 遍历每个 properties,设置到 TradeOrderPageItemRespVO.Item 中 |
| 227 | 228 | properties.forEach(property -> { | ... | ... |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderDO.java
| ... | ... | @@ -3,8 +3,9 @@ package cn.iocoder.yudao.module.trade.dal.dataobject.order; |
| 3 | 3 | import cn.iocoder.yudao.framework.common.enums.TerminalEnum; |
| 4 | 4 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| 5 | 5 | import cn.iocoder.yudao.module.promotion.api.price.dto.PriceCalculateRespDTO.OrderItem; |
| 6 | +import cn.iocoder.yudao.module.trade.enums.delivery.DeliveryTypeEnum; | |
| 6 | 7 | import cn.iocoder.yudao.module.trade.enums.order.TradeOrderCancelTypeEnum; |
| 7 | -import cn.iocoder.yudao.module.trade.enums.order.TradeOrderAfterSaleStatusEnum; | |
| 8 | +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderRefundStatusEnum; | |
| 8 | 9 | import cn.iocoder.yudao.module.trade.enums.order.TradeOrderDeliveryStatusEnum; |
| 9 | 10 | import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum; |
| 10 | 11 | import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum; |
| ... | ... | @@ -180,6 +181,12 @@ public class TradeOrderDO extends BaseDO { |
| 180 | 181 | |
| 181 | 182 | // ========== 收件 + 物流基本信息 ========== |
| 182 | 183 | /** |
| 184 | + * 配送方式 | |
| 185 | + * | |
| 186 | + * 枚举 {@link DeliveryTypeEnum} | |
| 187 | + */ | |
| 188 | + private Integer deliveryType; | |
| 189 | + /** | |
| 183 | 190 | * 配置模板的编号 |
| 184 | 191 | * |
| 185 | 192 | * 关联 DeliveryTemplateDO 的 id 编号 |
| ... | ... | @@ -229,9 +236,9 @@ public class TradeOrderDO extends BaseDO { |
| 229 | 236 | /** |
| 230 | 237 | * 售后状态 |
| 231 | 238 | * |
| 232 | - * 枚举 {@link TradeOrderAfterSaleStatusEnum} | |
| 239 | + * 枚举 {@link TradeOrderRefundStatusEnum} | |
| 233 | 240 | */ |
| 234 | - private Integer afterSaleStatus; | |
| 241 | + private Integer refundStatus; | |
| 235 | 242 | /** |
| 236 | 243 | * 退款金额,单位:分 |
| 237 | 244 | * | ... | ... |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceImpl.java
| ... | ... | @@ -178,12 +178,12 @@ public class TradeOrderServiceImpl implements TradeOrderService { |
| 178 | 178 | tradeOrderDO.setNo(IdUtil.getSnowflakeNextId() + ""); // TODO @LeeYan9: 思考下, 怎么生成好点哈; 这个是会展示给用户的; |
| 179 | 179 | tradeOrderDO.setStatus(TradeOrderStatusEnum.UNPAID.getStatus()); |
| 180 | 180 | tradeOrderDO.setType(TradeOrderTypeEnum.NORMAL.getType()); |
| 181 | - tradeOrderDO.setAfterSaleStatus(TradeOrderAfterSaleStatusEnum.NONE.getStatus()); | |
| 181 | + tradeOrderDO.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus()); | |
| 182 | 182 | tradeOrderDO.setProductCount(getSumValue(order.getItems(), PriceCalculateRespDTO.OrderItem::getCount, Integer::sum)); |
| 183 | 183 | tradeOrderDO.setTerminal(TerminalEnum.H5.getTerminal()); // todo 数据来源? |
| 184 | 184 | tradeOrderDO.setAdjustPrice(0).setPayed(false); // 支付信息 |
| 185 | 185 | tradeOrderDO.setDeliveryStatus(TradeOrderDeliveryStatusEnum.UNDELIVERED.getStatus()); // 物流信息 |
| 186 | - tradeOrderDO.setAfterSaleStatus(TradeOrderAfterSaleStatusEnum.NONE.getStatus()).setRefundPrice(0); // 退款信息 | |
| 186 | + tradeOrderDO.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus()).setRefundPrice(0); // 退款信息 | |
| 187 | 187 | tradeOrderMapper.insert(tradeOrderDO); |
| 188 | 188 | return tradeOrderDO; |
| 189 | 189 | } |
| ... | ... | @@ -491,7 +491,7 @@ public class TradeOrderServiceImpl implements TradeOrderService { |
| 491 | 491 | Integer orderRefundPrice = order.getRefundPrice() + refundPrice; |
| 492 | 492 | if (isAllOrderItemAfterSaleSuccess(order.getId())) { // 如果都售后成功,则需要取消订单 |
| 493 | 493 | tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId()) |
| 494 | - .setAfterSaleStatus(TradeOrderAfterSaleStatusEnum.ALL.getStatus()).setRefundPrice(orderRefundPrice) | |
| 494 | + .setRefundStatus(TradeOrderRefundStatusEnum.ALL.getStatus()).setRefundPrice(orderRefundPrice) | |
| 495 | 495 | .setCancelType(TradeOrderCancelTypeEnum.AFTER_SALE_CLOSE.getType()).setCancelTime(LocalDateTime.now())); |
| 496 | 496 | |
| 497 | 497 | // TODO 芋艿:记录订单日志 |
| ... | ... | @@ -499,7 +499,7 @@ public class TradeOrderServiceImpl implements TradeOrderService { |
| 499 | 499 | // TODO 芋艿:站内信? |
| 500 | 500 | } else { // 如果部分售后,则更新退款金额 |
| 501 | 501 | tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId()) |
| 502 | - .setAfterSaleStatus(TradeOrderAfterSaleStatusEnum.PART.getStatus()).setRefundPrice(orderRefundPrice)); | |
| 502 | + .setRefundStatus(TradeOrderRefundStatusEnum.PART.getStatus()).setRefundPrice(orderRefundPrice)); | |
| 503 | 503 | } |
| 504 | 504 | |
| 505 | 505 | // TODO 芋艿:未来如果有分佣,需要更新相关分佣订单为已失效 | ... | ... |
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceTest.java
| ... | ... | @@ -185,7 +185,7 @@ public class TradeOrderServiceTest extends BaseDbUnitTest { |
| 185 | 185 | assertEquals(tradeOrderDO.getReceiverMobile(), "15601691300"); |
| 186 | 186 | assertEquals(tradeOrderDO.getReceiverAreaId(), 3306); |
| 187 | 187 | assertEquals(tradeOrderDO.getReceiverDetailAddress(), "土豆村"); |
| 188 | - assertEquals(tradeOrderDO.getAfterSaleStatus(), TradeOrderAfterSaleStatusEnum.NONE.getStatus()); | |
| 188 | + assertEquals(tradeOrderDO.getRefundStatus(), TradeOrderRefundStatusEnum.NONE.getStatus()); | |
| 189 | 189 | assertEquals(tradeOrderDO.getRefundPrice(), 0); |
| 190 | 190 | assertEquals(tradeOrderDO.getCouponPrice(), 30); |
| 191 | 191 | assertEquals(tradeOrderDO.getPointPrice(), 10); | ... | ... |