Commit 7056d89b0c11314a4801342c66d4815f36154e52

Authored by YunaiV
1 parent 66abe4a8

trade:完成交易订单的收货逻辑

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 &quot;trade_order&quot; ( @@ -25,7 +25,7 @@ CREATE TABLE IF NOT EXISTS &quot;trade_order&quot; (
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,