Commit 35569c5ec8a0286c914b4d6e9f200024455eea70

Authored by YunaiV
1 parent 1b477aaa

trade:下单时,如果是门店自提,增加核销码的生成

yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/delivery/DeliveryTypeEnum.java
@@ -18,12 +18,12 @@ public enum DeliveryTypeEnum implements IntArrayValuable { @@ -18,12 +18,12 @@ public enum DeliveryTypeEnum implements IntArrayValuable {
18 EXPRESS(1, "快递发货"), 18 EXPRESS(1, "快递发货"),
19 PICK_UP(2, "用户自提"),; 19 PICK_UP(2, "用户自提"),;
20 20
21 - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(DeliveryTypeEnum::getMode).toArray(); 21 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(DeliveryTypeEnum::getType).toArray();
22 22
23 /** 23 /**
24 * 配送方式 24 * 配送方式
25 */ 25 */
26 - private final Integer mode; 26 + private final Integer type;
27 /** 27 /**
28 * 状态名 28 * 状态名
29 */ 29 */
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.http
@@ -8,7 +8,7 @@ GET {{appApi}}/trade/order/settlement?type=0&items[0].cartId=50&couponId=1 @@ -8,7 +8,7 @@ GET {{appApi}}/trade/order/settlement?type=0&items[0].cartId=50&couponId=1
8 Authorization: Bearer {{appToken}} 8 Authorization: Bearer {{appToken}}
9 tenant-id: {{appTenentId}} 9 tenant-id: {{appTenentId}}
10 10
11 -### /trade-order/create 创建订单(基于商品) 11 +### /trade-order/create 创建订单(基于商品)【快递】
12 POST {{appApi}}/trade/order/create 12 POST {{appApi}}/trade/order/create
13 Content-Type: application/json 13 Content-Type: application/json
14 Authorization: Bearer {{appToken}} 14 Authorization: Bearer {{appToken}}
@@ -27,6 +27,27 @@ tenant-id: {{appTenentId}} @@ -27,6 +27,27 @@ tenant-id: {{appTenentId}}
27 "remark": "我是备注" 27 "remark": "我是备注"
28 } 28 }
29 29
  30 +### /trade-order/create 创建订单(基于商品)【自提】
  31 +POST {{appApi}}/trade/order/create
  32 +Content-Type: application/json
  33 +Authorization: Bearer {{appToken}}
  34 +tenant-id: {{appTenentId}}
  35 +
  36 +{
  37 + "pointStatus": true,
  38 + "deliveryType": 2,
  39 + "pickUpStoreId": 1,
  40 + "items": [
  41 + {
  42 + "skuId": 1,
  43 + "count": 2
  44 + }
  45 + ],
  46 + "remark": "我是备注",
  47 + "receiverName": "土豆",
  48 + "receiverMobile": "15601691300"
  49 +}
  50 +
30 ### 获得订单交易的分页 51 ### 获得订单交易的分页
31 GET {{appApi}}/trade/order/page?pageNo=1&pageSize=10 52 GET {{appApi}}/trade/order/page?pageNo=1&pageSize=10
32 Authorization: Bearer {{appToken}} 53 Authorization: Bearer {{appToken}}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderConvert.java
@@ -65,14 +65,10 @@ public interface TradeOrderConvert { @@ -65,14 +65,10 @@ public interface TradeOrderConvert {
65 @Mapping(source = "calculateRespBO.price.deliveryPrice", target = "deliveryPrice"), 65 @Mapping(source = "calculateRespBO.price.deliveryPrice", target = "deliveryPrice"),
66 @Mapping(source = "calculateRespBO.price.couponPrice", target = "couponPrice"), 66 @Mapping(source = "calculateRespBO.price.couponPrice", target = "couponPrice"),
67 @Mapping(source = "calculateRespBO.price.pointPrice", target = "pointPrice"), 67 @Mapping(source = "calculateRespBO.price.pointPrice", target = "pointPrice"),
68 - @Mapping(source = "calculateRespBO.price.payPrice", target = "payPrice"),  
69 - @Mapping(source = "address.name", target = "receiverName"),  
70 - @Mapping(source = "address.mobile", target = "receiverMobile"),  
71 - @Mapping(source = "address.areaId", target = "receiverAreaId"),  
72 - @Mapping(source = "address.detailAddress", target = "receiverDetailAddress"), 68 + @Mapping(source = "calculateRespBO.price.payPrice", target = "payPrice")
73 }) 69 })
74 TradeOrderDO convert(Long userId, String userIp, AppTradeOrderCreateReqVO createReqVO, 70 TradeOrderDO convert(Long userId, String userIp, AppTradeOrderCreateReqVO createReqVO,
75 - TradePriceCalculateRespBO calculateRespBO, AddressRespDTO address); 71 + TradePriceCalculateRespBO calculateRespBO);
76 72
77 TradeOrderRespDTO convert(TradeOrderDO orderDO); 73 TradeOrderRespDTO convert(TradeOrderDO orderDO);
78 74
@@ -215,6 +211,7 @@ public interface TradeOrderConvert { @@ -215,6 +211,7 @@ public interface TradeOrderConvert {
215 TradePriceCalculateReqBO reqBO = new TradePriceCalculateReqBO().setUserId(userId) 211 TradePriceCalculateReqBO reqBO = new TradePriceCalculateReqBO().setUserId(userId)
216 .setCouponId(settlementReqVO.getCouponId()).setPointStatus(settlementReqVO.getPointStatus()) 212 .setCouponId(settlementReqVO.getCouponId()).setPointStatus(settlementReqVO.getPointStatus())
217 .setDeliveryType(settlementReqVO.getDeliveryType()).setAddressId(settlementReqVO.getAddressId()) 213 .setDeliveryType(settlementReqVO.getDeliveryType()).setAddressId(settlementReqVO.getAddressId())
  214 + .setPickUpStoreId(settlementReqVO.getPickUpStoreId())
218 .setItems(new ArrayList<>(settlementReqVO.getItems().size())); 215 .setItems(new ArrayList<>(settlementReqVO.getItems().size()));
219 // 商品项的构建 216 // 商品项的构建
220 Map<Long, CartDO> cartMap = convertMap(cartList, CartDO::getId); 217 Map<Long, CartDO> cartMap = convertMap(cartList, CartDO::getId);
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderDO.java
@@ -224,6 +224,10 @@ public class TradeOrderDO extends BaseDO { @@ -224,6 +224,10 @@ public class TradeOrderDO extends BaseDO {
224 * 关联 {@link DeliveryPickUpStoreDO#getId()} 224 * 关联 {@link DeliveryPickUpStoreDO#getId()}
225 */ 225 */
226 private Long pickUpStoreId; 226 private Long pickUpStoreId;
  227 + /**
  228 + * 自提核销码
  229 + */
  230 + private String pickUpVerifyCode;
227 231
228 // ========== 售后基本信息 ========== 232 // ========== 售后基本信息 ==========
229 /** 233 /**
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java
@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.trade.service.order; @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.trade.service.order;
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.lang.Assert; 4 import cn.hutool.core.lang.Assert;
5 import cn.hutool.core.util.ObjectUtil; 5 import cn.hutool.core.util.ObjectUtil;
  6 +import cn.hutool.core.util.RandomUtil;
6 import cn.hutool.core.util.StrUtil; 7 import cn.hutool.core.util.StrUtil;
7 import cn.hutool.extra.spring.SpringUtil; 8 import cn.hutool.extra.spring.SpringUtil;
8 import cn.iocoder.yudao.framework.common.core.KeyValue; 9 import cn.iocoder.yudao.framework.common.core.KeyValue;
@@ -42,7 +43,6 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; @@ -42,7 +43,6 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
42 import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderItemMapper; 43 import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderItemMapper;
43 import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderMapper; 44 import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderMapper;
44 import cn.iocoder.yudao.module.trade.dal.redis.no.TradeOrderNoRedisDAO; 45 import cn.iocoder.yudao.module.trade.dal.redis.no.TradeOrderNoRedisDAO;
45 -import cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants;  
46 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum; 46 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum;
47 import cn.iocoder.yudao.module.trade.enums.delivery.DeliveryTypeEnum; 47 import cn.iocoder.yudao.module.trade.enums.delivery.DeliveryTypeEnum;
48 import cn.iocoder.yudao.module.trade.enums.order.*; 48 import cn.iocoder.yudao.module.trade.enums.order.*;
@@ -203,44 +203,30 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { @@ -203,44 +203,30 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
203 203
204 // TODO @puhui999:订单超时,自动取消; 204 // TODO @puhui999:订单超时,自动取消;
205 205
206 - /**  
207 - * 校验收件地址是否存在  
208 - *  
209 - * @param userId 用户编号  
210 - * @param addressId 收件地址编号  
211 - * @return 收件地址  
212 - */  
213 - private AddressRespDTO validateAddress(Long userId, Long addressId) {  
214 - AddressRespDTO address = addressApi.getAddress(addressId, userId);  
215 - if (address == null) {  
216 - throw exception(ErrorCodeConstants.ORDER_CREATE_ADDRESS_NOT_FOUND);  
217 - }  
218 - return address;  
219 - }  
220 -  
221 private TradeOrderDO createTradeOrder(Long userId, String clientIp, AppTradeOrderCreateReqVO createReqVO, 206 private TradeOrderDO createTradeOrder(Long userId, String clientIp, AppTradeOrderCreateReqVO createReqVO,
222 TradePriceCalculateRespBO calculateRespBO) { 207 TradePriceCalculateRespBO calculateRespBO) {
223 - // 用户选择物流配送的时候才需要填写收货地址  
224 - AddressRespDTO address = new AddressRespDTO();  
225 - if (Objects.equals(createReqVO.getDeliveryType(), DeliveryTypeEnum.EXPRESS.getMode())) {  
226 - // 用户收件地址的校验  
227 - address = validateAddress(userId, createReqVO.getAddressId());  
228 - }  
229 - TradeOrderDO order = TradeOrderConvert.INSTANCE.convert(userId, clientIp, createReqVO, calculateRespBO, address); 208 + TradeOrderDO order = TradeOrderConvert.INSTANCE.convert(userId, clientIp, createReqVO, calculateRespBO);
230 order.setType(calculateRespBO.getType()); 209 order.setType(calculateRespBO.getType());
231 order.setNo(orderNoRedisDAO.generate(TradeOrderNoRedisDAO.TRADE_ORDER_NO_PREFIX)); 210 order.setNo(orderNoRedisDAO.generate(TradeOrderNoRedisDAO.TRADE_ORDER_NO_PREFIX));
232 order.setStatus(TradeOrderStatusEnum.UNPAID.getStatus()); 211 order.setStatus(TradeOrderStatusEnum.UNPAID.getStatus());
233 order.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus()); 212 order.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus());
234 order.setProductCount(getSumValue(calculateRespBO.getItems(), TradePriceCalculateRespBO.OrderItem::getCount, Integer::sum)); 213 order.setProductCount(getSumValue(calculateRespBO.getItems(), TradePriceCalculateRespBO.OrderItem::getCount, Integer::sum));
235 order.setTerminal(TerminalEnum.H5.getTerminal()); // todo 数据来源? 214 order.setTerminal(TerminalEnum.H5.getTerminal()); // todo 数据来源?
236 - // 支付信息 215 + // 支付 + 退款信息
237 order.setAdjustPrice(0).setPayStatus(false); 216 order.setAdjustPrice(0).setPayStatus(false);
  217 + order.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus()).setRefundPrice(0);
238 // 物流信息 218 // 物流信息
239 order.setDeliveryType(createReqVO.getDeliveryType()); 219 order.setDeliveryType(createReqVO.getDeliveryType());
240 - // 退款信息  
241 - order.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus()).setRefundPrice(0); 220 + if (Objects.equals(createReqVO.getDeliveryType(), DeliveryTypeEnum.EXPRESS.getType())) {
  221 + AddressRespDTO address = addressApi.getAddress(createReqVO.getAddressId(), userId);
  222 + Assert.notNull(address, "地址({}) 不能为空", createReqVO.getAddressId()); // 价格计算时,已经计算
  223 + order.setReceiverName(address.getName()).setReceiverMobile(address.getMobile())
  224 + .setReceiverAreaId(address.getAreaId()).setReceiverDetailAddress(address.getDetailAddress());
  225 + } else if (Objects.equals(createReqVO.getDeliveryType(), DeliveryTypeEnum.PICK_UP.getType())) {
  226 + order.setReceiverName(createReqVO.getReceiverName()).setReceiverMobile(createReqVO.getReceiverMobile());
  227 + order.setPickUpVerifyCode(RandomUtil.randomNumbers(8)); // 随机一个核销码,长度为 8 位
  228 + }
242 tradeOrderMapper.insert(order); 229 tradeOrderMapper.insert(order);
243 - // TODO @puhui999:如果是门店订单,则需要生成核销码;  
244 return order; 230 return order;
245 } 231 }
246 232
@@ -423,7 +409,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { @@ -423,7 +409,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
423 // 1.1 校验并获得交易订单(可发货) 409 // 1.1 校验并获得交易订单(可发货)
424 TradeOrderDO order = validateOrderDeliverable(deliveryReqVO.getId()); 410 TradeOrderDO order = validateOrderDeliverable(deliveryReqVO.getId());
425 // 1.2 校验 deliveryType 是否为快递,是快递才可以发货 411 // 1.2 校验 deliveryType 是否为快递,是快递才可以发货
426 - if (ObjectUtil.notEqual(order.getDeliveryType(), DeliveryTypeEnum.EXPRESS.getMode())) { 412 + if (ObjectUtil.notEqual(order.getDeliveryType(), DeliveryTypeEnum.EXPRESS.getType())) {
427 throw exception(ORDER_DELIVERY_FAIL_DELIVERY_TYPE_NOT_EXPRESS); 413 throw exception(ORDER_DELIVERY_FAIL_DELIVERY_TYPE_NOT_EXPRESS);
428 } 414 }
429 415
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeDeliveryPriceCalculator.java
@@ -50,9 +50,9 @@ public class TradeDeliveryPriceCalculator implements TradePriceCalculator { @@ -50,9 +50,9 @@ public class TradeDeliveryPriceCalculator implements TradePriceCalculator {
50 if (param.getDeliveryType() == null) { 50 if (param.getDeliveryType() == null) {
51 return; 51 return;
52 } 52 }
53 - if (DeliveryTypeEnum.PICK_UP.getMode().equals(param.getDeliveryType())) { 53 + if (DeliveryTypeEnum.PICK_UP.getType().equals(param.getDeliveryType())) {
54 calculateByPickUp(param, result); 54 calculateByPickUp(param, result);
55 - } else if (DeliveryTypeEnum.EXPRESS.getMode().equals(param.getDeliveryType())) { 55 + } else if (DeliveryTypeEnum.EXPRESS.getType().equals(param.getDeliveryType())) {
56 calculateExpress(param, result); 56 calculateExpress(param, result);
57 } 57 }
58 } 58 }
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeDeliveryPriceCalculatorTest.java
@@ -50,7 +50,7 @@ public class TradeDeliveryPriceCalculatorTest extends BaseMockitoUnitTest { @@ -50,7 +50,7 @@ public class TradeDeliveryPriceCalculatorTest extends BaseMockitoUnitTest {
50 public void init(){ 50 public void init(){
51 // 准备参数 51 // 准备参数
52 reqBO = new TradePriceCalculateReqBO() 52 reqBO = new TradePriceCalculateReqBO()
53 - .setDeliveryType(DeliveryTypeEnum.EXPRESS.getMode()) 53 + .setDeliveryType(DeliveryTypeEnum.EXPRESS.getType())
54 .setAddressId(10L) 54 .setAddressId(10L)
55 .setUserId(1L) 55 .setUserId(1L)
56 .setItems(asList( 56 .setItems(asList(