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/resources/mapper/modules/HappyActivityOptionMapper.xml | 5 +
src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java | 111 ++++++++++++++++---------------------
src/main/java/cc/mrbird/febs/mall/service/impl/AdminHappyActivityServiceImpl.java | 2
src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java | 17 +++++
src/main/java/cc/mrbird/febs/mall/service/HappyActivityService.java | 4
src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityMapper.java | 2
6 files changed, 74 insertions(+), 67 deletions(-)
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityMapper.java
index 112e20a..1fc8969 100644
--- a/src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityMapper.java
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityMapper.java
@@ -22,6 +22,8 @@
void updateHappyActivityOptionLikeCnt(@Param("id")Long sourceOptionId);
+ void updateHappyActivitySurplusCnt(@Param("id")Long activityId, @Param("cnt")Integer cnt);
+
Page<ApiActivityOptionListVo> getVoteOptionInPage(Page<ApiActivityOptionListVo> page, @Param("record")ApiVoteOptionInPageDto dto);
Page<HappyActivityOrder> selectOrderInPage(Page<HappyActivityOrder> page, @Param("record")AdminHappyActivityOrderDto dto);
diff --git a/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java b/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java
index 755df81..0dbf31c 100644
--- a/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java
+++ b/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java
@@ -2,9 +2,10 @@
import cc.mrbird.febs.common.enumerates.AgentLevelEnum;
import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum;
+import cc.mrbird.febs.common.enumerates.OrderStatusEnum;
+import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.common.utils.MallUtils;
-import cc.mrbird.febs.mall.entity.MallMember;
-import cc.mrbird.febs.mall.entity.MallMoneyFlow;
+import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.mapper.MallMemberMapper;
import cc.mrbird.febs.mall.mapper.MallMoneyFlowMapper;
import cc.mrbird.febs.mall.service.HappyActivityService;
@@ -15,6 +16,7 @@
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
@@ -58,4 +60,15 @@
}
+
+
+ /**
+ * 订单失效
+ * 五分钟运行一次
+ */
+ @Scheduled(cron = "0 0/5 * * * ? ")
+ public void overtimeJob() {
+ happyActivityService.overtimeJob();
+ }
+
}
diff --git a/src/main/java/cc/mrbird/febs/mall/service/HappyActivityService.java b/src/main/java/cc/mrbird/febs/mall/service/HappyActivityService.java
index 52c4c38..528a4be 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/HappyActivityService.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/HappyActivityService.java
@@ -53,8 +53,6 @@
void addLikeCnt(Long sourceOptionId);
- void substructJoinCnt(Long activityId,Integer cnt);
-
FebsResponse orderList(ApiActivityOrderListDto dto);
FebsResponse orderInfo(Long id);
@@ -68,4 +66,6 @@
FebsResponse checkOrder(ApiCheckOrderDto dto);
void checkActivityItem(Long orderId);
+
+ void overtimeJob();
}
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminHappyActivityServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminHappyActivityServiceImpl.java
index 2d30850..33780fd 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminHappyActivityServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminHappyActivityServiceImpl.java
@@ -169,6 +169,8 @@
HappyActivity happyActivity = new HappyActivity();
BeanUtil.copyProperties(dto, happyActivity);
happyActivity.setCode(code);
+ happyActivity.setExpectCnt(dto.getJoinCnt());
+ happyActivity.setSurplusCnt(dto.getJoinCnt());
this.baseMapper.insert(happyActivity);
return new FebsResponse().success().message("操作成功");
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();
diff --git a/src/main/resources/mapper/modules/HappyActivityOptionMapper.xml b/src/main/resources/mapper/modules/HappyActivityOptionMapper.xml
index a4f9cf7..cb27b7f 100644
--- a/src/main/resources/mapper/modules/HappyActivityOptionMapper.xml
+++ b/src/main/resources/mapper/modules/HappyActivityOptionMapper.xml
@@ -55,6 +55,11 @@
update happy_activity_option set likes_cnt = likes_cnt + 1 where id = #{id}
</update>
+
+ <update id="updateHappyActivitySurplusCnt" >
+ update happy_activity set surplus_cnt = likes_cnt + #{cnt} where id = #{id}
+ </update>
+
<select id="getVoteOptionInPage" resultType="cc.mrbird.febs.mall.vo.ApiActivityOptionListVo">
select
a.id as id,
--
Gitblit v1.9.1