Commit 7056d89b0c11314a4801342c66d4815f36154e52
1 parent
66abe4a8
trade:完成交易订单的收货逻辑
Showing
7 changed files
with
95 additions
and
5 deletions
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/ErrorCodeConstants.java
| @@ -27,6 +27,7 @@ public interface ErrorCodeConstants { | @@ -27,6 +27,7 @@ public interface ErrorCodeConstants { | ||
| 27 | ErrorCode ORDER_UPDATE_PAID_FAIL_PAY_ORDER_STATUS_NOT_SUCCESS = new ErrorCode(1011000015, "交易订单更新支付状态失败,支付单状态不是【支付成功】状态"); | 27 | ErrorCode ORDER_UPDATE_PAID_FAIL_PAY_ORDER_STATUS_NOT_SUCCESS = new ErrorCode(1011000015, "交易订单更新支付状态失败,支付单状态不是【支付成功】状态"); |
| 28 | ErrorCode ORDER_UPDATE_PAID_FAIL_PAY_PRICE_NOT_MATCH = new ErrorCode(1011000016, "交易订单更新支付状态失败,支付单金额不匹配"); | 28 | ErrorCode ORDER_UPDATE_PAID_FAIL_PAY_PRICE_NOT_MATCH = new ErrorCode(1011000016, "交易订单更新支付状态失败,支付单金额不匹配"); |
| 29 | ErrorCode ORDER_DELIVERY_FAIL_STATUS_NOT_UNDELIVERED = new ErrorCode(1011000017, "交易订单发货失败,订单不是【待发货】状态"); | 29 | ErrorCode ORDER_DELIVERY_FAIL_STATUS_NOT_UNDELIVERED = new ErrorCode(1011000017, "交易订单发货失败,订单不是【待发货】状态"); |
| 30 | + ErrorCode ORDER_RECEIVE_FAIL_STATUS_NOT_DELIVERED = new ErrorCode(1011000018, "交易订单收货失败,订单不是【待收货】状态"); | ||
| 30 | 31 | ||
| 31 | // ========== After Sale 模块 1-011-000-000 ========== | 32 | // ========== After Sale 模块 1-011-000-000 ========== |
| 32 | ErrorCode AFTER_SALE_NOT_FOUND = new ErrorCode(1011000100, "售后单不存在"); | 33 | ErrorCode AFTER_SALE_NOT_FOUND = new ErrorCode(1011000100, "售后单不存在"); |
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderStatusEnum.java
| @@ -75,6 +75,15 @@ public enum TradeOrderStatusEnum implements IntArrayValuable { | @@ -75,6 +75,15 @@ public enum TradeOrderStatusEnum implements IntArrayValuable { | ||
| 75 | return ObjectUtil.equal(UNDELIVERED.getStatus(), status); | 75 | return ObjectUtil.equal(UNDELIVERED.getStatus(), status); |
| 76 | } | 76 | } |
| 77 | 77 | ||
| 78 | + /** | ||
| 79 | + * 判断指定状态,是否正处于【已发货】状态 | ||
| 80 | + * | ||
| 81 | + * @param status 指定状态 | ||
| 82 | + * @return 是否 | ||
| 83 | + */ | ||
| 84 | + public static boolean isDelivered(Integer status) { | ||
| 85 | + return ObjectUtil.equals(status, DELIVERED.getStatus()); | ||
| 86 | + } | ||
| 78 | 87 | ||
| 79 | /** | 88 | /** |
| 80 | * 判断指定状态,是否正处于【已取消】状态 | 89 | * 判断指定状态,是否正处于【已取消】状态 |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/TradeOrderMapper.java
| @@ -13,4 +13,9 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> { | @@ -13,4 +13,9 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> { | ||
| 13 | .eq(TradeOrderDO::getId, id).eq(TradeOrderDO::getStatus, status)); | 13 | .eq(TradeOrderDO::getId, id).eq(TradeOrderDO::getStatus, status)); |
| 14 | } | 14 | } |
| 15 | 15 | ||
| 16 | + default TradeOrderDO selectByIdAndUserId(Long id, Long userId) { | ||
| 17 | + return selectOne(TradeOrderDO::getId, id, | ||
| 18 | + TradeOrderDO::getUserId, userId); | ||
| 19 | + } | ||
| 20 | + | ||
| 16 | } | 21 | } |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderService.java
| @@ -42,13 +42,21 @@ public interface TradeOrderService { | @@ -42,13 +42,21 @@ public interface TradeOrderService { | ||
| 42 | void deliveryOrder(Long userId, TradeOrderDeliveryReqVO deliveryReqVO); | 42 | void deliveryOrder(Long userId, TradeOrderDeliveryReqVO deliveryReqVO); |
| 43 | 43 | ||
| 44 | /** | 44 | /** |
| 45 | + * 【会员】收货交易订单 | ||
| 46 | + * | ||
| 47 | + * @param userId 用户编号 | ||
| 48 | + * @param id 订单编号 | ||
| 49 | + */ | ||
| 50 | + void receiveOrder(Long userId, Long id); | ||
| 51 | + | ||
| 52 | + /** | ||
| 45 | * 获得指定用户,指定的交易订单 | 53 | * 获得指定用户,指定的交易订单 |
| 46 | * | 54 | * |
| 47 | * @param userId 用户编号 | 55 | * @param userId 用户编号 |
| 48 | - * @param orderId 交易订单编号 | 56 | + * @param id 交易订单编号 |
| 49 | * @return 交易订单 | 57 | * @return 交易订单 |
| 50 | */ | 58 | */ |
| 51 | - TradeOrderDO getOrder(Long userId, Long orderId); | 59 | + TradeOrderDO getOrder(Long userId, Long id); |
| 52 | 60 | ||
| 53 | // =================== Order Item =================== | 61 | // =================== Order Item =================== |
| 54 | 62 |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceImpl.java
| @@ -315,6 +315,7 @@ public class TradeOrderServiceImpl implements TradeOrderService { | @@ -315,6 +315,7 @@ public class TradeOrderServiceImpl implements TradeOrderService { | ||
| 315 | return new KeyValue<>(order, payOrder); | 315 | return new KeyValue<>(order, payOrder); |
| 316 | } | 316 | } |
| 317 | 317 | ||
| 318 | + // TODO 芋艿:如果无需发货,需要怎么存储? | ||
| 318 | @Override | 319 | @Override |
| 319 | public void deliveryOrder(Long userId, TradeOrderDeliveryReqVO deliveryReqVO) { | 320 | public void deliveryOrder(Long userId, TradeOrderDeliveryReqVO deliveryReqVO) { |
| 320 | // 校验并获得交易订单(可发货) | 321 | // 校验并获得交易订单(可发货) |
| @@ -365,8 +366,52 @@ public class TradeOrderServiceImpl implements TradeOrderService { | @@ -365,8 +366,52 @@ public class TradeOrderServiceImpl implements TradeOrderService { | ||
| 365 | } | 366 | } |
| 366 | 367 | ||
| 367 | @Override | 368 | @Override |
| 368 | - public TradeOrderDO getOrder(Long userId, Long orderId) { | ||
| 369 | - TradeOrderDO order = tradeOrderMapper.selectById(orderId); | 369 | + @Transactional(rollbackFor = Exception.class) |
| 370 | + public void receiveOrder(Long userId, Long id) { | ||
| 371 | + // 校验并获得交易订单(可收货) | ||
| 372 | + TradeOrderDO order = validateOrderReceivable(userId, id); | ||
| 373 | + | ||
| 374 | + // 更新 TradeOrderDO 状态为已完成 | ||
| 375 | + int updateCount = tradeOrderMapper.updateByIdAndStatus(order.getId(), order.getStatus(), | ||
| 376 | + new TradeOrderDO().setStatus(TradeOrderStatusEnum.COMPLETED.getStatus()) | ||
| 377 | + .setDeliveryStatus(TradeOrderDeliveryStatusEnum.RECEIVED.getStatus()).setReceiveTime(LocalDateTime.now())); | ||
| 378 | + if (updateCount == 0) { | ||
| 379 | + throw exception(ORDER_RECEIVE_FAIL_STATUS_NOT_DELIVERED); | ||
| 380 | + } | ||
| 381 | + | ||
| 382 | + // TODO 芋艿:OrderLog | ||
| 383 | + | ||
| 384 | + // TODO 芋艿:lili 发送订单变化的消息 | ||
| 385 | + | ||
| 386 | + // TODO 芋艿:lili 发送商品被购买完成的数据 | ||
| 387 | + } | ||
| 388 | + | ||
| 389 | + /** | ||
| 390 | + * 校验交易订单满足可售货的条件 | ||
| 391 | + * | ||
| 392 | + * 1. 交易订单待收货 | ||
| 393 | + * | ||
| 394 | + * @param userId 用户编号 | ||
| 395 | + * @param id 交易订单编号 | ||
| 396 | + * @return 交易订单 | ||
| 397 | + */ | ||
| 398 | + private TradeOrderDO validateOrderReceivable(Long userId, Long id) { | ||
| 399 | + // 校验订单是否存在 | ||
| 400 | + TradeOrderDO order = tradeOrderMapper.selectByIdAndUserId(id, userId); | ||
| 401 | + if (order == null) { | ||
| 402 | + throw exception(ORDER_NOT_FOUND); | ||
| 403 | + } | ||
| 404 | + // 校验订单是否是待收货状态 | ||
| 405 | + if (!TradeOrderStatusEnum.isDelivered(order.getStatus()) | ||
| 406 | + || ObjectUtil.notEqual(order.getDeliveryStatus(), TradeOrderDeliveryStatusEnum.DELIVERED.getStatus())) { | ||
| 407 | + throw exception(ORDER_RECEIVE_FAIL_STATUS_NOT_DELIVERED); | ||
| 408 | + } | ||
| 409 | + return order; | ||
| 410 | + } | ||
| 411 | + | ||
| 412 | + @Override | ||
| 413 | + public TradeOrderDO getOrder(Long userId, Long id) { | ||
| 414 | + TradeOrderDO order = tradeOrderMapper.selectById(id); | ||
| 370 | if (order != null | 415 | if (order != null |
| 371 | && ObjectUtil.notEqual(order.getUserId(), userId)) { | 416 | && ObjectUtil.notEqual(order.getUserId(), userId)) { |
| 372 | return null; | 417 | return null; |
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceTest.java
| @@ -295,4 +295,26 @@ public class TradeOrderServiceTest extends BaseDbUnitTest { | @@ -295,4 +295,26 @@ public class TradeOrderServiceTest extends BaseDbUnitTest { | ||
| 295 | assertNotNull(dbOrder.getDeliveryTime()); | 295 | assertNotNull(dbOrder.getDeliveryTime()); |
| 296 | } | 296 | } |
| 297 | 297 | ||
| 298 | + @Test | ||
| 299 | + public void testReceiveOrder() { | ||
| 300 | + // mock 数据(TradeOrder) | ||
| 301 | + TradeOrderDO order = randomPojo(TradeOrderDO.class, o -> { | ||
| 302 | + o.setId(1L).setUserId(10L).setStatus(TradeOrderStatusEnum.DELIVERED.getStatus()); | ||
| 303 | + o.setDeliveryStatus(TradeOrderDeliveryStatusEnum.DELIVERED.getStatus()).setReceiveTime(null); | ||
| 304 | + }); | ||
| 305 | + tradeOrderMapper.insert(order); | ||
| 306 | + // 准备参数 | ||
| 307 | + Long id = 1L; | ||
| 308 | + Long userId = 10L; | ||
| 309 | + // mock 方法(支付单) | ||
| 310 | + | ||
| 311 | + // 调用 | ||
| 312 | + tradeOrderService.receiveOrder(userId, id); | ||
| 313 | + // 断言 | ||
| 314 | + TradeOrderDO dbOrder = tradeOrderMapper.selectById(1L); | ||
| 315 | + assertEquals(dbOrder.getStatus(), TradeOrderStatusEnum.COMPLETED.getStatus()); | ||
| 316 | + assertEquals(dbOrder.getDeliveryStatus(), TradeOrderDeliveryStatusEnum.RECEIVED.getStatus()); | ||
| 317 | + assertNotNull(dbOrder.getReceiveTime()); | ||
| 318 | + } | ||
| 319 | + | ||
| 298 | } | 320 | } |
yudao-module-mall/yudao-module-trade-biz/src/test/resources/sql/create_tables.sql
| @@ -25,7 +25,7 @@ CREATE TABLE IF NOT EXISTS "trade_order" ( | @@ -25,7 +25,7 @@ CREATE TABLE IF NOT EXISTS "trade_order" ( | ||
| 25 | "delivery_template_id" bigint, | 25 | "delivery_template_id" bigint, |
| 26 | "logistics_id" bigint, | 26 | "logistics_id" bigint, |
| 27 | "logistics_no" varchar, | 27 | "logistics_no" varchar, |
| 28 | - "delivery_status" bit NOT NULL, | 28 | + "delivery_status" smallint NOT NULL, |
| 29 | "delivery_time" datetime, | 29 | "delivery_time" datetime, |
| 30 | "receive_time" datetime, | 30 | "receive_time" datetime, |
| 31 | "receiver_name" varchar NOT NULL, | 31 | "receiver_name" varchar NOT NULL, |