Przeglądaj źródła

卡密订单自动发货

cup 2 lat temu
rodzic
commit
1f36386d0e

+ 12 - 0
mp-admin/src/test/java/com/qs/mp/task/MyTest.java

@@ -10,12 +10,15 @@ import cn.hutool.crypto.symmetric.DES;
 import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
 import cn.hutool.crypto.symmetric.SymmetricCrypto;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qs.mp.admin.domain.Coupon;
 import com.qs.mp.admin.domain.CouponTicket;
+import com.qs.mp.admin.domain.GoodsCard;
 import com.qs.mp.admin.domain.Marketing;
 import com.qs.mp.admin.service.ICouponChannelService;
 import com.qs.mp.admin.service.ICouponService;
 import com.qs.mp.admin.service.ICouponTicketService;
+import com.qs.mp.admin.service.IGoodsCardService;
 import com.qs.mp.common.core.redis.DistributedLocker;
 import com.qs.mp.common.core.redis.RedisCache;
 import com.qs.mp.common.enums.UserTypeEnum;
@@ -84,6 +87,8 @@ public class MyTest {
     private ICouponTicketService couponTicketService;
 
 
+    @Autowired
+    private IGoodsCardService goodsCardService;
 
     public static void main(String[] args) {
         WebhookService.sendAlertDing("mayday,mayday,上上下下,左右左右,BABA");
@@ -94,6 +99,13 @@ public class MyTest {
     }
 
 
+    @Test
+    void test13() {
+        List<GoodsCard> goodsCardList = goodsCardService.list(new QueryWrapper<GoodsCard>()
+            .eq("is_use", 1));
+        goodsCardList.forEach(System.out::println);
+    }
+
     @Test
     void test12() {
         Coupon coupon = couponService.getById(56);

+ 6 - 0
mp-quartz/src/main/java/com/qs/mp/quartz/task/AsyncConsumeTask.java

@@ -78,6 +78,12 @@ public class AsyncConsumeTask {
         } else if (AsyncTaskTypeEnum.TICKET_GENERATE.getValue().equals(asyncTask.getType())) {
             // 盲票创建后相关任务处理
             asyncTaskService.ticketGenerate(asyncTask);
+        } else if (AsyncTaskTypeEnum.CARD_ORDER_DELIVER.getValue().equals(asyncTask.getType())) {
+            // 卡密订单发货任务
+            asyncTaskService.cardOrderDeliver(asyncTask);
+        } else {
+            // 都没匹配到则忽略不处理任务
+            return;
         }
 
         // 更新异步任务状态

+ 6 - 0
mp-service/src/main/java/com/qs/mp/framework/service/IAsyncTaskService.java

@@ -39,4 +39,10 @@ public interface IAsyncTaskService extends IService<AsyncTask> {
      * @param asyncTask
      */
     void ticketGenerate(AsyncTask asyncTask);
+
+    /**
+     * 卡密订单发货任务
+     * @param asyncTask
+     */
+    void cardOrderDeliver(AsyncTask asyncTask);
 }

+ 99 - 0
mp-service/src/main/java/com/qs/mp/framework/service/impl/AsyncTaskServiceImpl.java

@@ -1,10 +1,14 @@
 package com.qs.mp.framework.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.qs.mp.admin.domain.GoodsCard;
 import com.qs.mp.admin.domain.Ticket;
 import com.qs.mp.admin.domain.TicketBox;
 import com.qs.mp.admin.domain.TicketPackage;
+import com.qs.mp.admin.service.IGoodsCardService;
 import com.qs.mp.admin.service.ITicketBoxService;
 import com.qs.mp.admin.service.ITicketPackageService;
 import com.qs.mp.admin.service.ITicketService;
@@ -13,15 +17,25 @@ import com.qs.mp.channel.service.IChannelOrderService;
 import com.qs.mp.channel.service.IChannelUserRelService;
 import com.qs.mp.common.enums.*;
 import com.qs.mp.common.exception.ServiceException;
+import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.framework.domain.AsyncTask;
 import com.qs.mp.framework.mapper.AsyncTaskMapper;
 import com.qs.mp.framework.service.IAsyncTaskService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qs.mp.user.domain.UserDeliverOrder;
+import com.qs.mp.user.domain.UserDeliverOrderItem;
+import com.qs.mp.user.domain.UserDeliverOrderItemCard;
 import com.qs.mp.user.domain.UserTicketOrder;
 import com.qs.mp.user.domain.UserTicketOrderItem;
+import com.qs.mp.user.service.IUserDeliverOrderItemCardService;
+import com.qs.mp.user.service.IUserDeliverOrderItemService;
+import com.qs.mp.user.service.IUserDeliverOrderService;
 import com.qs.mp.user.service.IUserTicketOrderItemService;
 import com.qs.mp.user.service.IUserTicketOrderService;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.stream.Collectors;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -68,6 +82,19 @@ public class AsyncTaskServiceImpl extends ServiceImpl<AsyncTaskMapper, AsyncTask
     @Autowired
     private IChannelUserRelService channelUserRelService;
 
+
+    @Autowired
+    private IUserDeliverOrderService userDeliverOrderService;
+
+    @Autowired
+    private IUserDeliverOrderItemService userDeliverOrderItemService;
+
+    @Autowired
+    private IGoodsCardService goodsCardService;
+
+    @Autowired
+    private IUserDeliverOrderItemCardService userDeliverOrderItemCardService;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean insertAsyncTask(AsyncTaskTypeEnum taskType, String bizId) {
@@ -150,4 +177,76 @@ public class AsyncTaskServiceImpl extends ServiceImpl<AsyncTaskMapper, AsyncTask
         }
         ticketBoxService.generateTicket(boxId);
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void cardOrderDeliver(AsyncTask asyncTask) {
+        String orderId = asyncTask.getBizId();
+        LogUtil.error(logger, "收到卡密订单自动发货任务。orderId=" + orderId);
+        UserDeliverOrder userDeliverOrder = userDeliverOrderService.getById(orderId);
+        // 如果是普通订单或者订单不为待发货则不处理
+        if (DeliverOrderTypeEnum.ORDINARY.getValue().equals(userDeliverOrder.getType())
+            || !DeliverOrderStatusEnum.NOT_DELIVER.equals(userDeliverOrder.getStatus())) {
+            LogUtil.error(logger, "收到卡密订单自动发货任务,订单类型不为卡密订单或者订单状态不为待发货,忽略任务。orderId=" + orderId);
+            return;
+        }
+
+        // 获取订单详情
+        List<UserDeliverOrderItem> userDeliverOrderItemList = userDeliverOrderItemService.list(
+            new LambdaQueryWrapper<UserDeliverOrderItem>().eq(UserDeliverOrderItem::getOrderId, orderId));
+        if (CollectionUtils.isEmpty(userDeliverOrderItemList)) {
+            LogUtil.error(logger, "订单明细为空。orderId=" + orderId);
+            throw new ServiceException("订单明细为空");
+        }
+
+        // 分配卡密
+        List<UserDeliverOrderItemCard> userDeliverOrderItemCardList = new ArrayList<>();
+        for (UserDeliverOrderItem userDeliverOrderItem : userDeliverOrderItemList) {
+            List<GoodsCard> goodsCardList = goodsCardService.list(new QueryWrapper<GoodsCard>()
+                .eq("goods", userDeliverOrderItem.getGoodsId())
+                .eq("is_use", 0)
+                .orderByAsc("rand()")
+                .last("limit " + userDeliverOrderItem.getGoodsNum()));
+            if (CollectionUtils.isEmpty(goodsCardList) || goodsCardList.size() < userDeliverOrderItem.getGoodsNum()) {
+                LogUtil.error(logger,"卡密不足,无法发货。orderId:{0},itemId:{1},goodsId:{2}",userDeliverOrderItem.getOrderId(),
+                    userDeliverOrderItem.getItemId(), userDeliverOrderItem.getGoodsId());
+                throw new ServiceException("卡密不足,无法发货。goodsId=" + userDeliverOrderItem.getGoodsId());
+            }
+
+            for (GoodsCard goodsCard : goodsCardList) {
+                boolean rtn = goodsCardService.update(new LambdaUpdateWrapper<GoodsCard>()
+                    .set(GoodsCard::getIsUse, 1)
+                    .eq(GoodsCard::getId, goodsCard)
+                    .eq(GoodsCard::getIsUse, 0)
+                );
+                if (!rtn) {
+                    LogUtil.error(logger, "卡密分配失败。orderId={0},itemId={1},goodsId={2}",userDeliverOrderItem.getOrderId(),
+                        userDeliverOrderItem.getItemId(), userDeliverOrderItem.getGoodsId());
+                    throw new ServiceException("卡密分配并发失败,稍后重试,goodsId=" + userDeliverOrderItem.getGoodsId());
+                }
+                UserDeliverOrderItemCard userDeliverOrderItemCard = new UserDeliverOrderItemCard();
+                userDeliverOrderItemCard.setItemId(userDeliverOrderItem.getItemId());
+                userDeliverOrderItemCard.setCardId(goodsCard.getId());
+                userDeliverOrderItemCardList.add(userDeliverOrderItemCard);
+            }
+        }
+
+        boolean rtn = userDeliverOrderItemCardService.saveBatch(userDeliverOrderItemCardList);
+        if (!rtn) {
+            throw new ServiceException("分配卡密保存失败");
+        }
+
+        // 更新订单信息
+        boolean res = userDeliverOrderService.update(new LambdaUpdateWrapper<UserDeliverOrder>()
+            .set(UserDeliverOrder::getStatus, DeliverOrderStatusEnum.FINISHED)
+            .set(UserDeliverOrder::getDeliveryTime, new Date())
+            .set(UserDeliverOrder::getConfirmTime, new Date())
+            .eq(UserDeliverOrder::getOrderId, orderId)
+            .eq(UserDeliverOrder::getStatus, DeliverOrderStatusEnum.NOT_DELIVER)
+        );
+        if (!res) {
+            LogUtil.error(logger, "卡密商品发货更新订单信息失败,orderId: {0}", orderId);
+            throw new ServiceException("卡密商品发货更新订单信息失败");
+        }
+    }
 }