Commit 35569c5ec8a0286c914b4d6e9f200024455eea70
1 parent
1b477aaa
trade:下单时,如果是门店自提,增加核销码的生成
Showing
7 changed files
with
48 additions
and
40 deletions
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( | ... | ... |