Переглянути джерело

定时任务-更新拼团活动状态为已结束

Chris-zy 1 рік тому
батько
коміт
7ecd3ae421

+ 37 - 1
mp-quartz/src/main/java/com/qs/mp/quartz/task/GroupBuyingTask.java

@@ -9,6 +9,7 @@ import com.qs.mp.admin.domain.Marketing;
 import com.qs.mp.admin.domain.MarketingMsg;
 import com.qs.mp.admin.domain.vo.GroupBuying;
 import com.qs.mp.admin.service.IGroupBuyingMsgService;
+import com.qs.mp.admin.service.IGroupBuyingService;
 import com.qs.mp.admin.service.IMarketingMsgService;
 import com.qs.mp.admin.service.IMarketingService;
 import com.qs.mp.common.core.redis.DistributedLocker;
@@ -59,7 +60,8 @@ public class GroupBuyingTask {
     @Autowired
     private IGroupBuyingMsgService groupBuyingMsgService;
 
-
+    @Autowired
+    private IGroupBuyingService groupBuyingService;
 
 
     /**
@@ -120,5 +122,39 @@ public class GroupBuyingTask {
     }
 
 
+    /**
+     * 活动时间到期更新状态定时
+     */
+    public void updateGroupBuyingStatus() {
+
+        //查询活动结束时间小于当前时间且状态为上架中的活动
+        Date now = DateUtils.getNowDate();
+        List<GroupBuying> groupBuyingList = groupBuyingService.list(new LambdaQueryWrapper<GroupBuying>()
+                .eq(GroupBuying::getIsPutaway, 0)
+                .le(GroupBuying::getEndTime, now));
+
+        if (CollectionUtils.isEmpty(groupBuyingList)) {
+            return;
+        }
+
+        for (GroupBuying groupBuying : groupBuyingList) {
+            String lockKey = RedisLockKey.build(RedisLockKey.UPDATE_GROUP_BUYING_STATUS, groupBuying.getId());
+            // 加锁,自动续期
+            if (!distributedLocker.tryLock(lockKey,0,-1,TimeUnit.SECONDS)) {
+                continue;
+            }
+            try {
+                // 修改状态
+                groupBuyingService.endGroupBuying(groupBuying);
+            } catch (Exception e) {
+                LogUtil.error(logger, e, "拼团活动结束异常。groupBuyingId:{0}", groupBuying.getId());
+            } finally {
+                // 释放锁
+                distributedLocker.unlock(lockKey);
+            }
+        }
+
+    }
+
 
 }

+ 1 - 1
mp-service/src/main/java/com/qs/mp/admin/domain/vo/GroupBuyingGroup.java

@@ -37,7 +37,7 @@ public class GroupBuyingGroup implements Serializable {
 
     @ApiModelProperty("参团用户ID")
     @TableField("partin_ids")
-    private Integer partinIds;
+    private String partinIds;
 
     @ApiModelProperty("成团状态,0:进行中,1:已完成,2:已结束")
     @TableField("group_status")

+ 1 - 1
mp-service/src/main/java/com/qs/mp/admin/service/IGroupBuyingService.java

@@ -41,7 +41,7 @@ public interface IGroupBuyingService extends IService<GroupBuying> {
      */
     List<GroupBuying> listGroupBuying(GroupBuyingQueryParam groupBuyingQueryParam);
 
-
+    void endGroupBuying(GroupBuying groupBuying);
 
 
     /**

+ 66 - 5
mp-service/src/main/java/com/qs/mp/admin/service/impl/GroupBuyingServiceImpl.java

@@ -8,6 +8,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qs.mp.admin.domain.*;
 import com.qs.mp.admin.domain.param.*;
 import com.qs.mp.admin.domain.vo.GroupBuying;
+import com.qs.mp.admin.domain.vo.GroupBuyingGroup;
+import com.qs.mp.admin.domain.vo.GroupBuyingOrder;
 import com.qs.mp.admin.mapper.GroupBuyingMapper;
 import com.qs.mp.admin.service.*;
 import com.qs.mp.common.constant.Constants;
@@ -19,16 +21,14 @@ import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.common.utils.bean.BeanUtils;
 import com.qs.mp.framework.redis.RedisKey;
 import com.qs.mp.framework.service.IWxSubscribeMessage;
+import com.qs.mp.pay.service.IWalletService;
 import com.qs.mp.system.domain.SysUser;
 import com.qs.mp.system.service.ISysUserService;
 import com.qs.mp.system.service.id.BizIdGenerator;
 import com.qs.mp.user.domain.MarketingHitPrize;
 import com.qs.mp.user.domain.MarketingUserCode;
 import com.qs.mp.user.domain.param.MarketingHelpParam;
-import com.qs.mp.user.service.IMarketingHitPrizeService;
-import com.qs.mp.user.service.IMarketingUserCodeService;
-import com.qs.mp.user.service.IUserCoinService;
-import com.qs.mp.user.service.IUserPrizeStorageService;
+import com.qs.mp.user.service.*;
 import com.qs.mp.utils.MarketingUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -116,7 +116,9 @@ public class GroupBuyingServiceImpl extends ServiceImpl<GroupBuyingMapper, Group
 
 
 
-
+    //拼团活动
+    @Autowired
+    private IGroupBuyingService groupBuyingService;
 
     //拼团活动奖项
     @Autowired
@@ -126,6 +128,16 @@ public class GroupBuyingServiceImpl extends ServiceImpl<GroupBuyingMapper, Group
     @Autowired
     private IGroupBuyingAwardsPrizeService groupBuyingAwardsPrizeService;
 
+    @Autowired
+    private IGroupBuyingGroupService groupBuyingGroupService;
+
+    @Autowired
+    private IGroupBuyingOrderService groupBuyingOrderService;
+
+    @Autowired
+    private IWalletService walletService;
+
+
     /**
      * 复制拼团活动
      * @param groupBuyingId
@@ -336,6 +348,55 @@ public class GroupBuyingServiceImpl extends ServiceImpl<GroupBuyingMapper, Group
     }
 
 
+    /**
+     * 修改拼团活动状态
+     * @param groupBuying
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void endGroupBuying(GroupBuying groupBuying) {
+        //更新活动状态
+        boolean rtn = groupBuyingService.update(new LambdaUpdateWrapper<GroupBuying>()
+                .set(GroupBuying::getIsPutaway, 2)
+                .eq(GroupBuying::getId, groupBuying.getId())
+                .eq(GroupBuying::getIsPutaway, 0));
+
+        if (rtn){
+            //查询尚未成团的团
+            List<GroupBuyingGroup> list = groupBuyingGroupService.list(new LambdaQueryWrapper<GroupBuyingGroup>()
+                    .eq(GroupBuyingGroup::getGroupbuyingId, groupBuying.getId())
+                    .eq(GroupBuyingGroup::getGroupStatus, 3));
+
+            if (Objects.isNull(list) || list.size() == 0){
+                return;
+            }
+
+            //获取团成团ID
+            for (GroupBuyingGroup groupBuyingGroup : list){
+                String partinIds = groupBuyingGroup.getPartinIds();
+                String[] split = partinIds.split(",");
+
+                for (int i = 0; i < split.length; i++){
+                    GroupBuyingOrder groupBuyingOrder = groupBuyingOrderService.getOne(new LambdaQueryWrapper<GroupBuyingOrder>()
+                            .eq(GroupBuyingOrder::getGroupbuyingId, groupBuyingGroup.getGroupbuyingId())
+                            .eq(GroupBuyingOrder::getGroupId, groupBuyingGroup.getId())
+                            .eq(GroupBuyingOrder::getUserId, split[i]));
+
+                    boolean refund = walletService.refund(groupBuyingOrder.getOrderId(), groupBuyingOrder.getPayAmt(), "拼团退款");
+                    if (refund){
+                        //更新拼团订单状态
+                        groupBuyingOrderService.update(new LambdaUpdateWrapper<GroupBuyingOrder>()
+                                .set(GroupBuyingOrder::getStatus, -1)
+                                .eq(GroupBuyingOrder::getOrderId, groupBuyingOrder.getOrderId()));
+                    }
+                }
+
+            }
+
+        }
+
+    }
+
 
 
 

+ 2 - 1
mp-service/src/main/java/com/qs/mp/framework/redis/RedisLockKey.java

@@ -23,7 +23,8 @@ public enum RedisLockKey {
 
     USER_CD_KEY_EXCHANGE_LOCK("user_cd_key_exchange_lock_{0}", "兑换码兑换锁"),
 
-    USER_RED_PKG_DRAW_LOCK("user_red_pkg_draw_lock_{0}","红包提现锁")
+    USER_RED_PKG_DRAW_LOCK("user_red_pkg_draw_lock_{0}","红包提现锁"),
+    UPDATE_GROUP_BUYING_STATUS("update_group_buying_status_{0}","更新拼团活动状态")
     ;