From ed5a6de6023e73e7f5b5af86a94aa4f1e43a3fc4 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Sun, 27 Apr 2025 14:19:02 +0800
Subject: [PATCH] feat(mall): 添加活动报名人数减少逻辑

---
 src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java |  111 ++++++++++++++++++++++++-------------------------------
 1 files changed, 48 insertions(+), 63 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java
index 2181d6d..67aa142 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java
@@ -30,7 +30,6 @@
 import cn.hutool.crypto.SecureUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
@@ -71,55 +70,33 @@
         // 检查分页结果是否包含数据
         if(CollUtil.isNotEmpty(happyActivityPage.getRecords())){
             List<ApiActivityInfoVo> records = happyActivityPage.getRecords();
-            // 使用Stream流操作records,获取所有活动的ID
-            List<Long> ids = records.stream().map(ApiActivityInfoVo::getId).collect(Collectors.toList());
-
-            // 查询关注点赞转发记录,筛选出关注活动类型且未删除的关注记录,并按ID升序排序,限制结果数量为3
-            List<HappyFollow> happyFollows = happyFollowMapper.selectList(
-                    new LambdaQueryWrapper<HappyFollow>()
-                            .eq(HappyFollow::getSourceType, StateUpDownEnum.SOURCE_TYPE_ACTIVITY.getCode())
-                            .in(HappyFollow::getSourceId, ids)
-                            .eq(HappyFollow::getDeleteFlag, StateUpDownEnum.DOWN.getCode())
-                            .orderByAsc(HappyFollow::getId)
-                            .last("limit 3")
-            );
-
-            // 检查关注记录是否不为空
-            if(CollUtil.isNotEmpty(happyFollows)){
-                // 使用Stream流操作关注记录,获取所有成员ID的集合
-                Set<Long> memberIds = happyFollows.stream().collect(Collectors.mapping(HappyFollow::getMemberId, Collectors.toSet()));
-
-                // 查询成员信息,获取成员的ID和头像
-                List<MallMember> mallMembers = mallMemberMapper.selectList(
-                        new LambdaQueryWrapper<MallMember>()
-                                .select(MallMember::getId,MallMember::getAvatar)
-                                .in(MallMember::getId, memberIds)
+            // 遍历活动记录,为每个活动添加成员头像信息
+            records.forEach(record -> {
+                // 查询关注点赞转发记录,筛选出关注活动类型且未删除的关注记录,并按ID升序排序,限制结果数量为3
+                List<HappyFollow> happyFollows = happyFollowMapper.selectList(
+                        new LambdaQueryWrapper<HappyFollow>()
+                                .eq(HappyFollow::getSourceType, StateUpDownEnum.SOURCE_TYPE_ACTIVITY.getCode())
+                                .eq(HappyFollow::getSourceId, record.getId())
+                                .eq(HappyFollow::getDeleteFlag, StateUpDownEnum.DOWN.getCode())
+                                .groupBy(HappyFollow::getMemberId)
+                                .orderByAsc(HappyFollow::getId)
+                                .last("limit 3")
                 );
+                // 检查关注记录是否不为空
+                if(CollUtil.isNotEmpty(happyFollows)){
+                    // 使用Stream流操作关注记录,获取所有成员ID的集合
+                    Set<Long> memberIds = happyFollows.stream().collect(Collectors.mapping(HappyFollow::getMemberId, Collectors.toSet()));
 
-                // 使用Stream流操作成员信息,生成一个以成员ID为键,成员信息为值的Map
-                Map<Long, MallMember> memberMap = mallMembers.stream()
-                        .collect(Collectors.toMap(MallMember::getId, member -> member));
-
-                // 使用Stream流操作关注记录,生成一个以活动ID为键,成员ID列表为值的Map
-                Map<Long, List<Long>> followMap = happyFollows.stream()
-                        .collect(Collectors.groupingBy(
-                                HappyFollow::getSourceId,
-                                Collectors.mapping(HappyFollow::getMemberId, Collectors.toList())
-                        ));
-
-                // 遍历活动记录,为每个活动添加成员头像信息
-                records.forEach(record -> {
-                    List<Long> memberIdsForRecord = followMap.get(record.getId());
-                    if (CollUtil.isNotEmpty(memberIdsForRecord)) {
-                        List<String> memberAvatars = memberIdsForRecord.stream()
-                                .map(memberMap::get)
-                                .filter(member -> member != null)
-                                .map(MallMember::getAvatar)
-                                .collect(Collectors.toList());
-                        record.setMemberAvatars(memberAvatars);
-                    }
-                });
-            }
+                    // 查询成员信息,获取成员的ID和头像
+                    List<MallMember> mallMembers = mallMemberMapper.selectList(
+                            new LambdaQueryWrapper<MallMember>()
+                                    .select(MallMember::getAvatar)
+                                    .in(MallMember::getId, memberIds)
+                    );
+                    List<String> memberAvatars = mallMembers.stream().map(MallMember::getAvatar).collect(Collectors.toList());
+                    record.setMemberAvatars(memberAvatars);
+                }
+            });
         }
         // 返回成功响应,包含活动分页数据
         return new FebsResponse().success().data(happyActivityPage);
@@ -512,9 +489,9 @@
             throw new FebsException("活动已结束");
         }
 
-        Integer joinCnt = happyActivity.getJoinCnt();
-        if(joinCnt < numCnt){
-            throw new FebsException("报名额度剩下"+joinCnt+",请减少报名人数");
+        Integer surplusCnt = happyActivity.getSurplusCnt();
+        if(surplusCnt < numCnt){
+            throw new FebsException("报名额度剩下"+surplusCnt+",请减少报名人数");
         }
         //支付总金额
         BigDecimal amount = happyActivity.getPayAmount().multiply(new BigDecimal(dto.getNumCnt())).setScale(2, RoundingMode.DOWN);
@@ -547,7 +524,8 @@
             happyActivityOrderItemMapper.insert(happyActivityOrderItem);
         }
 
-        this.substructJoinCnt(activityId, happyActivityOrder.getNumCnt());
+        this.baseMapper.updateHappyActivitySurplusCnt(activityId, happyActivityOrder.getNumCnt() * (-1));
+
         HashMap<String, Object> stringObjectHashMap = new HashMap<>();
         stringObjectHashMap.put("orderId",happyActivityOrder.getId());
         stringObjectHashMap.put("amount",amount);
@@ -634,17 +612,6 @@
         happyActivityOption.setLikesCnt(happyActivityOption.getLikesCnt() + 1);
         happyActivityOptionMapper.updateById(happyActivityOption);
     }
-
-    @Override
-    public void substructJoinCnt(Long activityId, Integer numCnt) {
-        HappyActivity happyActivity = this.baseMapper.selectById(activityId);
-        if(ObjectUtil.isNotEmpty(happyActivity)){
-            happyActivity.setJoinCnt(happyActivity.getJoinCnt() -numCnt);
-            this.baseMapper.updateById(happyActivity);
-        }
-    }
-
-
 
     // 处理无需支付订单
     private void processNoPayOrder(HappyActivityOrder order, Long orderId) {
@@ -941,6 +908,24 @@
     }
 
     @Override
+    public void overtimeJob() {
+        List<HappyActivityOrder> happyActivityOrders = happyActivityOrderMapper.selectList(
+                new LambdaQueryWrapper<HappyActivityOrder>()
+                        .eq(HappyActivityOrder::getState, StateUpDownEnum.ORDER_STATE_WAIT_PAY.getCode())
+                        .lt(HappyActivityOrder::getCreatedTime, DateUtil.offsetMinute(new Date(), -10))
+        );
+        if(CollUtil.isNotEmpty(happyActivityOrders)){
+            happyActivityOrders.forEach(happyActivityOrder -> {
+
+                Long activityId = happyActivityOrder.getActivityId();
+                Integer numCnt = happyActivityOrder.getNumCnt();
+                this.baseMapper.updateHappyActivitySurplusCnt(activityId,numCnt);
+            });
+
+        }
+    }
+
+    @Override
     public FebsResponse voteActivityHot(Long id) {
 
         ApiVoteActivityHotVo apiVoteActivityHotVo = new ApiVoteActivityHotVo();

--
Gitblit v1.9.1