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 18 EXPRESS(1, "快递发货"),
19 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 8 Authorization: Bearer {{appToken}}
9 9 tenant-id: {{appTenentId}}
10 10  
11   -### /trade-order/create 创建订单(基于商品)
  11 +### /trade-order/create 创建订单(基于商品)【快递】
12 12 POST {{appApi}}/trade/order/create
13 13 Content-Type: application/json
14 14 Authorization: Bearer {{appToken}}
... ... @@ -27,6 +27,27 @@ tenant-id: {{appTenentId}}
27 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 52 GET {{appApi}}/trade/order/page?pageNo=1&pageSize=10
32 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 65 @Mapping(source = "calculateRespBO.price.deliveryPrice", target = "deliveryPrice"),
66 66 @Mapping(source = "calculateRespBO.price.couponPrice", target = "couponPrice"),
67 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 70 TradeOrderDO convert(Long userId, String userIp, AppTradeOrderCreateReqVO createReqVO,
75   - TradePriceCalculateRespBO calculateRespBO, AddressRespDTO address);
  71 + TradePriceCalculateRespBO calculateRespBO);
76 72  
77 73 TradeOrderRespDTO convert(TradeOrderDO orderDO);
78 74  
... ... @@ -215,6 +211,7 @@ public interface TradeOrderConvert {
215 211 TradePriceCalculateReqBO reqBO = new TradePriceCalculateReqBO().setUserId(userId)
216 212 .setCouponId(settlementReqVO.getCouponId()).setPointStatus(settlementReqVO.getPointStatus())
217 213 .setDeliveryType(settlementReqVO.getDeliveryType()).setAddressId(settlementReqVO.getAddressId())
  214 + .setPickUpStoreId(settlementReqVO.getPickUpStoreId())
218 215 .setItems(new ArrayList<>(settlementReqVO.getItems().size()));
219 216 // 商品项的构建
220 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 224 * 关联 {@link DeliveryPickUpStoreDO#getId()}
225 225 */
226 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 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.lang.Assert;
5 5 import cn.hutool.core.util.ObjectUtil;
  6 +import cn.hutool.core.util.RandomUtil;
6 7 import cn.hutool.core.util.StrUtil;
7 8 import cn.hutool.extra.spring.SpringUtil;
8 9 import cn.iocoder.yudao.framework.common.core.KeyValue;
... ... @@ -42,7 +43,6 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
42 43 import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderItemMapper;
43 44 import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderMapper;
44 45 import cn.iocoder.yudao.module.trade.dal.redis.no.TradeOrderNoRedisDAO;
45   -import cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants;
46 46 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum;
47 47 import cn.iocoder.yudao.module.trade.enums.delivery.DeliveryTypeEnum;
48 48 import cn.iocoder.yudao.module.trade.enums.order.*;
... ... @@ -203,44 +203,30 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
203 203  
204 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 206 private TradeOrderDO createTradeOrder(Long userId, String clientIp, AppTradeOrderCreateReqVO createReqVO,
222 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 209 order.setType(calculateRespBO.getType());
231 210 order.setNo(orderNoRedisDAO.generate(TradeOrderNoRedisDAO.TRADE_ORDER_NO_PREFIX));
232 211 order.setStatus(TradeOrderStatusEnum.UNPAID.getStatus());
233 212 order.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus());
234 213 order.setProductCount(getSumValue(calculateRespBO.getItems(), TradePriceCalculateRespBO.OrderItem::getCount, Integer::sum));
235 214 order.setTerminal(TerminalEnum.H5.getTerminal()); // todo 数据来源?
236   - // 支付信息
  215 + // 支付 + 退款信息
237 216 order.setAdjustPrice(0).setPayStatus(false);
  217 + order.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus()).setRefundPrice(0);
238 218 // 物流信息
239 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 229 tradeOrderMapper.insert(order);
243   - // TODO @puhui999:如果是门店订单,则需要生成核销码;
244 230 return order;
245 231 }
246 232  
... ... @@ -423,7 +409,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
423 409 // 1.1 校验并获得交易订单(可发货)
424 410 TradeOrderDO order = validateOrderDeliverable(deliveryReqVO.getId());
425 411 // 1.2 校验 deliveryType 是否为快递,是快递才可以发货
426   - if (ObjectUtil.notEqual(order.getDeliveryType(), DeliveryTypeEnum.EXPRESS.getMode())) {
  412 + if (ObjectUtil.notEqual(order.getDeliveryType(), DeliveryTypeEnum.EXPRESS.getType())) {
427 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 50 if (param.getDeliveryType() == null) {
51 51 return;
52 52 }
53   - if (DeliveryTypeEnum.PICK_UP.getMode().equals(param.getDeliveryType())) {
  53 + if (DeliveryTypeEnum.PICK_UP.getType().equals(param.getDeliveryType())) {
54 54 calculateByPickUp(param, result);
55   - } else if (DeliveryTypeEnum.EXPRESS.getMode().equals(param.getDeliveryType())) {
  55 + } else if (DeliveryTypeEnum.EXPRESS.getType().equals(param.getDeliveryType())) {
56 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 50 public void init(){
51 51 // 准备参数
52 52 reqBO = new TradePriceCalculateReqBO()
53   - .setDeliveryType(DeliveryTypeEnum.EXPRESS.getMode())
  53 + .setDeliveryType(DeliveryTypeEnum.EXPRESS.getType())
54 54 .setAddressId(10L)
55 55 .setUserId(1L)
56 56 .setItems(asList(
... ...