From 9f115c546c4ce91990fc79175c02f75907646cc8 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Thu, 24 Apr 2025 17:06:20 +0800
Subject: [PATCH] fix(votesActivity): 修复活动状态显示逻辑

---
 src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java |  307 ++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 264 insertions(+), 43 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 773d5c5..5188d8b 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
@@ -7,12 +7,17 @@
 import cc.mrbird.febs.common.utils.MallUtils;
 import cc.mrbird.febs.common.utils.ShareCodeUtil;
 import cc.mrbird.febs.mall.dto.*;
+import cc.mrbird.febs.mall.dto.activity.ApiActivityOrderListDto;
+import cc.mrbird.febs.mall.dto.activity.ApiVoteOptionInPageDto;
 import cc.mrbird.febs.mall.entity.*;
 import cc.mrbird.febs.mall.mapper.*;
 import cc.mrbird.febs.mall.service.HappyActivityService;
 import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
 import cc.mrbird.febs.mall.vo.*;
 import cc.mrbird.febs.mall.dto.ApiOperateDoDto;
+import cc.mrbird.febs.mall.vo.activity.ApiActivityOrderInfoVo;
+import cc.mrbird.febs.mall.vo.activity.ApiActivityOrderListVo;
+import cc.mrbird.febs.mall.vo.activity.ApiVoteActivityHotVo;
 import cc.mrbird.febs.pay.model.BrandWCPayRequestData;
 import cc.mrbird.febs.pay.service.IXcxPayService;
 import cn.hutool.core.bean.BeanUtil;
@@ -24,6 +29,7 @@
 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;
@@ -34,6 +40,7 @@
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -50,6 +57,7 @@
     private final HappyActivityOrderItemMapper happyActivityOrderItemMapper;
     private final IXcxPayService iXcxPayService;
     private final IApiMallMemberWalletService iApiMallMemberWalletService;
+    private final HappyActivityCategoryMapper happyActivityCategoryMapper;
 
     @Override
     public FebsResponse activityList(ApiActivityInfoDto dto) {
@@ -123,7 +131,6 @@
         HappyActivity happyActivity = this.baseMapper.selectOne(
                 new LambdaQueryWrapper<HappyActivity>()
                         .eq(HappyActivity::getId, dto.getId())
-                        .eq(HappyActivity::getType, dto.getType())
                         .eq(HappyActivity::getDeleteFlag, StateUpDownEnum.DOWN.getCode())
                         .ne(HappyActivity::getState, StateUpDownEnum.ACTIVITY_STATE_NOT_START.getCode())
         );
@@ -134,37 +141,11 @@
     }
 
     @Override
-    public FebsResponse voteOptionList(Long id) {
-        ArrayList<ApiActivityOptionListVo> apiActivityOptionListVos = new ArrayList<>();
-
-
-        HappyActivity happyActivity = this.baseMapper.selectById(id);
-        if(StateUpDownEnum.ACTIVITY_TYPE_VOTE.getCode() != happyActivity.getType()){
-            throw new FebsException("投票活动才可获取投票选项");
-        }
-
-        List<HappyActivityOption> happyActivityOptions = happyActivityOptionMapper.selectList(
-                new LambdaQueryWrapper<HappyActivityOption>()
-                        .select(
-                                HappyActivityOption::getId,
-                                HappyActivityOption::getOptionName,
-                                HappyActivityOption::getRank,
-                                HappyActivityOption::getLikesCnt,
-                                HappyActivityOption::getImage
-                        )
-                .eq(HappyActivityOption::getActivityId,id)
-                .eq(HappyActivityOption::getState,StateUpDownEnum.VOTE_OPTION_STATE_AUDIT_SUCCESS.getCode())
-                .eq(HappyActivityOption::getDeleteFlag,StateUpDownEnum.DOWN.getCode())
-                .orderByAsc(HappyActivityOption::getRank)
-        );
-        if(CollUtil.isNotEmpty(happyActivityOptions)){
-            happyActivityOptions.forEach(option -> {
-                ApiActivityOptionListVo apiActivityOptionListVo = new ApiActivityOptionListVo();
-                BeanUtil.copyProperties(option, apiActivityOptionListVo);
-                apiActivityOptionListVos.add(apiActivityOptionListVo);
-            });
-        }
-        return new FebsResponse().success().data(apiActivityOptionListVos);
+    public FebsResponse voteOptionInPage(ApiVoteOptionInPageDto dto) {
+        // 创建分页对象,传入当前页和每页大小
+        Page<ApiActivityOptionListVo> page = new Page<>(dto.getPageNow(), dto.getPageSize());
+        Page<ApiActivityOptionListVo> voteRecordInPage = this.baseMapper.getVoteOptionInPage(page, dto);
+        return new FebsResponse().success().data(voteRecordInPage);
     }
 
     @Override
@@ -250,9 +231,15 @@
         if(StateUpDownEnum.ACTIVITY_TYPE_VOTE.getCode() != happyActivity.getType()){
             throw new FebsException("当前活动无法投票");
         }
+        if (StateUpDownEnum.ACTIVITY_STATE_NOT_START.getCode() == happyActivity.getState()) {
+            throw new FebsException("活动尚未开始");
+        }
+        if (StateUpDownEnum.ACTIVITY_STATE_END.getCode() == happyActivity.getState()) {
+            throw new FebsException("活动已结束");
+        }
 
         HappyActivityOption happyActivityOption = happyActivityOptionMapper.selectById(sourceOptionId);
-        if (happyActivityOption == null) {
+        if (null == happyActivityOption) {
             throw new FebsException("投票对象不存在");
         }
         if (StateUpDownEnum.VOTE_OPTION_STATE_AUDIT_SUCCESS.getCode() != happyActivityOption.getState()) {
@@ -268,17 +255,17 @@
                         .gt(HappyFollow::getCreatedTime, DateUtil.beginOfDay(new Date()))
         );
         if (CollUtil.isNotEmpty(happyFollows) && happyFollows.size() >= happyActivity.getVoteCnt()){
-            throw new FebsException("今日已经投票");
+            throw new FebsException("今日已经投完票");
         }
+        this.baseMapper.updateHappyActivityOptionLikeCnt(sourceOptionId);
         this.operateDoVote(memberId, sourceType, sourceId, sourceOptionId, type);
-        this.addLikeCnt(sourceOptionId);
         return new FebsResponse().success();
     }
 
     @Override
     public FebsResponse voteRecordInPage(ApiVoteRecordInPageDto dto) {
         // 创建分页对象,传入当前页和每页大小
-        Page<ApiActivityInfoVo> page = new Page<>(dto.getPageNow(), dto.getPageSize());
+        Page<ApiVoteRecordInPageVo> page = new Page<>(dto.getPageNow(), dto.getPageSize());
         Page<ApiVoteRecordInPageVo> voteRecordInPage = this.baseMapper.getVoteRecordInPage(page, dto);
 
         List<ApiVoteRecordInPageVo> records = voteRecordInPage.getRecords();
@@ -309,12 +296,54 @@
     @Override
     public FebsResponse operateRegister(ApiOperateRegisterActivityDto dto) {
         Long memberId = LoginUserUtil.getLoginUser().getId();
-        return null;
+
+        HappyActivity happyActivity = this.baseMapper.selectById(dto.getActivityId());
+
+        if (StateUpDownEnum.ACTIVITY_STATE_END.getCode() == happyActivity.getState()) {
+            throw new FebsException("活动已结束");
+        }
+        if (StateUpDownEnum.DOWN.getCode() == happyActivity.getAddState()) {
+            throw new FebsException("活动尚未开启报名");
+        }
+        //判断用户是否重复报名
+        Integer registerCnt = happyActivityOptionMapper.selectCount(
+                new LambdaQueryWrapper<HappyActivityOption>()
+                        .eq(HappyActivityOption::getMemberId, memberId)
+                        .eq(HappyActivityOption::getActivityId, dto.getActivityId())
+                        .ne(HappyActivityOption::getState, StateUpDownEnum.VOTE_OPTION_STATE_AUDIT_REFUSE.getCode())
+                        .eq(HappyActivityOption::getDeleteFlag, StateUpDownEnum.DOWN.getCode())
+        );
+        if (registerCnt > 0) {
+            throw new FebsException("您已经报名过了");
+        }
+
+        Integer optionCnt = happyActivityOptionMapper.selectCount(
+                new LambdaQueryWrapper<HappyActivityOption>()
+                        .eq(HappyActivityOption::getActivityId, dto.getActivityId())
+                        .eq(HappyActivityOption::getDeleteFlag, StateUpDownEnum.DOWN.getCode())
+        );
+
+        HappyActivityOption happyActivityOption = new HappyActivityOption();
+        BeanUtil.copyProperties(dto, happyActivityOption);
+        happyActivityOption.setOrderCnt(optionCnt + 1);
+        happyActivityOption.setMemberId(memberId);
+        happyActivityOption.setOptionName(dto.getRealName());
+        happyActivityOptionMapper.insert(happyActivityOption);
+        return new FebsResponse().success().message("报名成功");
     }
 
     @Override
     public FebsResponse addConnect(ApiOperateRegisterUserDto dto) {
         Long memberId = LoginUserUtil.getLoginUser().getId();
+
+        List<HappyActivityConnect> happyActivityConnects = happyActivityConnectMapper.selectList(
+                new LambdaQueryWrapper<HappyActivityConnect>()
+                        .eq(HappyActivityConnect::getMemberId, memberId)
+                        .eq(HappyActivityConnect::getName, dto.getName())
+        );
+        if(CollUtil.isNotEmpty(happyActivityConnects)){
+            throw new FebsException("已经添加过该联系人");
+        }
 
         HappyActivityConnect happyActivityConnect = new HappyActivityConnect();
         happyActivityConnect.setMemberId(memberId);
@@ -471,7 +500,7 @@
                 BrandWCPayRequestData brandWCPayRequestData = iXcxPayService.startPaymentActivity(happyActivityOrder);
                 wxResultStr = JSONUtil.toJsonStr(brandWCPayRequestData);
                 payResultStr = brandWCPayRequestData.getPrepay_id();
-                updateOrderState(happyActivityOrder, payType, StateUpDownEnum.PAY_STATE_NOT_PAY.getCode());
+                updateOrderState(happyActivityOrder, payType, StateUpDownEnum.PAY_STATE_NOT_PAY.getCode(),StateUpDownEnum.ORDER_STATE_WAIT_PAY.getCode());
             } else if (StateUpDownEnum.PAY_METHOD_BALANCE.getCode() == payType ||
                        StateUpDownEnum.PAY_METHOD_INTEGRAL.getCode() == payType) {
                 // 处理余额或积分支付逻辑,验证交易密码并完成支付
@@ -517,22 +546,25 @@
         }
     }
 
-    // 处理未支付订单
+
+
+    // 处理无需支付订单
     private void processNoPayOrder(HappyActivityOrder order, Long orderId) {
-        updateOrderState(order, StateUpDownEnum.PAY_METHOD_NO_PAY.getCode(), StateUpDownEnum.PAY_STATE_PAY_SUCCESS.getCode());
+        updateOrderState(order, StateUpDownEnum.PAY_METHOD_NO_PAY.getCode(), StateUpDownEnum.PAY_STATE_PAY_SUCCESS.getCode(),StateUpDownEnum.ORDER_STATE_WAIT_USE.getCode());
         generateOrderItemCodes(orderId);
     }
 
-    // 处理已支付订单
+    // 处理余额和积分支付的订单
     private void processPaidOrder(HappyActivityOrder order, Long orderId, Integer payType) {
-        updateOrderState(order, payType, StateUpDownEnum.PAY_STATE_PAY_SUCCESS.getCode());
+        updateOrderState(order, payType, StateUpDownEnum.PAY_STATE_PAY_SUCCESS.getCode(),StateUpDownEnum.ORDER_STATE_WAIT_USE.getCode());
         generateOrderItemCodes(orderId);
     }
 
     // 更新订单状态
-    private void updateOrderState(HappyActivityOrder order, Integer payType, Integer payState) {
+    private void updateOrderState(HappyActivityOrder order, Integer payType, Integer payState, Integer state) {
         order.setPayState(payState);
         order.setPayType(payType);
+        order.setState(state);
         if (payState == StateUpDownEnum.PAY_STATE_PAY_SUCCESS.getCode()) {
             order.setPayTime(new Date());
         }
@@ -576,6 +608,195 @@
         return happyActivityOrder.getOrderNo();
     }
 
+    @Override
+    public FebsResponse orderList(ApiActivityOrderListDto dto) {
+
+        // 获取当前登录用户的ID
+        Long memberId = LoginUserUtil.getLoginUser().getId();
+
+        ArrayList<ApiActivityOrderListVo> apiActivityOrderListVos = new ArrayList<>();
+
+        LambdaQueryWrapper<HappyActivityOrder> happyActivityOrderLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        happyActivityOrderLambdaQueryWrapper.eq(HappyActivityOrder::getMemberId, memberId);
+        if(ObjectUtil.isNotEmpty(dto.getState())){
+            happyActivityOrderLambdaQueryWrapper.eq(HappyActivityOrder::getState, dto.getState());
+        }
+        happyActivityOrderLambdaQueryWrapper.eq(HappyActivityOrder::getDeleteFlag, StateUpDownEnum.DOWN.getCode());
+        happyActivityOrderLambdaQueryWrapper.orderByDesc(HappyActivityOrder::getCreatedTime);
+        Page<HappyActivityOrder> page = new Page<>(dto.getPageNum(), dto.getPageSize());
+        Page<HappyActivityOrder> voteActivityPage = happyActivityOrderMapper.selectPage(page, happyActivityOrderLambdaQueryWrapper);
+
+        List<HappyActivityOrder> records = voteActivityPage.getRecords();
+        if(CollUtil.isNotEmpty(records)){
+            Set<Long> activityIds = records.stream().map(HappyActivityOrder::getActivityId).collect(Collectors.toSet());
+            List<HappyActivity> happyActivities = this.baseMapper.selectList(
+                    new LambdaQueryWrapper<HappyActivity>()
+                            .select(
+                                    HappyActivity::getCategoryId,
+                                    HappyActivity::getName,
+                                    HappyActivity::getStartTime,
+                                    HappyActivity::getEndTime,
+                                    HappyActivity::getAddress)
+                            .in(HappyActivity::getId, activityIds)
+            );
+            Map<Long, HappyActivity> activityMap = happyActivities.stream().collect(Collectors.toMap(HappyActivity::getId, Function.identity()));
+
+            Set<Long> categoryIds = happyActivities.stream().map(HappyActivity::getCategoryId).collect(Collectors.toSet());
+            //stream流操作categoryIds得到一个Map<categoryId,HappyActivityCategory>的map对象
+            List<HappyActivityCategory> happyActivityCategories = happyActivityCategoryMapper.selectList(
+                    new LambdaQueryWrapper<HappyActivityCategory>()
+                            .select(
+                                    HappyActivityCategory::getId,
+                                    HappyActivityCategory::getName)
+                            .in(HappyActivityCategory::getId,categoryIds)
+            );
+            Map<Long, HappyActivityCategory> categoryMap = happyActivityCategories.stream().collect(Collectors.toMap(HappyActivityCategory::getId, Function.identity()));
+
+            for(HappyActivityOrder happyActivityOrder : records){
+                ApiActivityOrderListVo apiActivityOrderListVo = new ApiActivityOrderListVo();
+                BeanUtil.copyProperties(happyActivityOrder, apiActivityOrderListVo);
+
+                apiActivityOrderListVo.setActivityName(activityMap.get(happyActivityOrder.getActivityId()).getName());
+                apiActivityOrderListVo.setStartTime(activityMap.get(happyActivityOrder.getActivityId()).getStartTime());
+                apiActivityOrderListVo.setEndTime(activityMap.get(happyActivityOrder.getActivityId()).getEndTime());
+                apiActivityOrderListVo.setAddress(activityMap.get(happyActivityOrder.getActivityId()).getAddress());
+                apiActivityOrderListVo.setCategoryName(categoryMap.get(activityMap.get(happyActivityOrder.getActivityId()).getCategoryId()).getName());
+
+                apiActivityOrderListVos.add(apiActivityOrderListVo);
+            }
+        }
+
+        return new FebsResponse().success().data(apiActivityOrderListVos);
+    }
+
+    @Override
+    public FebsResponse orderInfo(Long id) {
+        // 获取当前登录用户的ID
+        Long memberId = LoginUserUtil.getLoginUser().getId();
+        ArrayList<ApiActivityOrderInfoVo> apiActivityOrderInfoVos = new ArrayList<>();
+
+        HappyActivityOrder happyActivityOrder = happyActivityOrderMapper.selectById(id);
+
+        HappyActivity happyActivity = this.baseMapper.selectById(happyActivityOrder.getActivityId());
+
+        List<HappyActivityOrderItem> happyActivityOrderItems = happyActivityOrderItemMapper.selectList(
+                new LambdaQueryWrapper<HappyActivityOrderItem>()
+                        .eq(HappyActivityOrderItem::getOrderId, happyActivityOrder.getActivityId())
+                .eq(HappyActivityOrderItem::getMemberId, memberId)
+        );
+        if(CollUtil.isNotEmpty(happyActivityOrderItems)){
+            for(HappyActivityOrderItem happyActivityOrderItem : happyActivityOrderItems){
+                ApiActivityOrderInfoVo apiActivityOrderInfoVo = new ApiActivityOrderInfoVo();
+                BeanUtil.copyProperties(happyActivityOrderItem, apiActivityOrderInfoVo);
+
+                apiActivityOrderInfoVo.setOrderState(happyActivityOrder.getState());
+
+                apiActivityOrderInfoVo.setActivityName(happyActivity.getName());
+                apiActivityOrderInfoVo.setActivityStartTime(happyActivity.getStartTime());
+                apiActivityOrderInfoVo.setActivityEndTime(happyActivity.getEndTime());
+                apiActivityOrderInfoVo.setActivityAddress(happyActivity.getAddress());
+
+                apiActivityOrderInfoVos.add(apiActivityOrderInfoVo);
+            }
+        }
+
+
+        return new FebsResponse().success().data(apiActivityOrderInfoVos);
+    }
+
+    @Override
+    public FebsResponse orderDelete(Long id) {
+        // 获取当前登录用户的ID
+        Long memberId = LoginUserUtil.getLoginUser().getId();
+
+        List<HappyActivityOrder> happyActivityOrders = happyActivityOrderMapper.selectList(
+                new LambdaQueryWrapper<HappyActivityOrder>()
+                        .eq(HappyActivityOrder::getId, id)
+                        .eq(HappyActivityOrder::getMemberId, memberId)
+        );
+        if(CollUtil.isNotEmpty(happyActivityOrders)){
+            happyActivityOrders.forEach(happyActivityOrder -> {
+                happyActivityOrder.setDeleteFlag(StateUpDownEnum.UP.getCode());
+                happyActivityOrderMapper.updateById(happyActivityOrder);
+            });
+        }
+        return new FebsResponse().success();
+    }
+
+    @Override
+    public void activityEnd() {
+        Date date = new Date();
+        List<HappyActivity> happyActivities = this.baseMapper.selectList(
+                new LambdaQueryWrapper<HappyActivity>()
+                        .eq(HappyActivity::getState, StateUpDownEnum.ACTIVITY_STATE_ENROLLING.getCode())
+                        .le(HappyActivity::getEndTime, date)
+        );
+        if(CollUtil.isEmpty(happyActivities)){
+            return;
+        }
+        happyActivities.forEach(happyActivity -> {
+            happyActivity.setState(StateUpDownEnum.ACTIVITY_STATE_END.getCode());
+            this.baseMapper.updateById(happyActivity);
+        });
+    }
+
+    /**
+     * 当活动即将开始时自动更新活动状态
+     * 此方法旨在查询所有即将开始的活动,并将它们的状态更新为报名进行中
+     */
+    @Override
+    public void activityStart() {
+        // 获取当前日期和时间
+        DateTime date = DateUtil.date();
+
+        // 查询所有状态为未开始且当前时间在活动开始时间结束时间之间的活动
+        List<HappyActivity> happyActivities = this.baseMapper.selectList(
+                new LambdaQueryWrapper<HappyActivity>()
+                        .eq(HappyActivity::getState, StateUpDownEnum.ACTIVITY_STATE_NOT_START.getCode())
+                        .le(HappyActivity::getStartTime, date)
+                        .ge(HappyActivity::getEndTime, date)
+        );
+
+        // 如果没有找到任何符合条件的活动,则直接返回
+        if(CollUtil.isEmpty(happyActivities)){
+            return;
+        }
+
+        // 遍历每个符合条件的活动,将其状态更新为报名进行中,并保存更新
+        happyActivities.forEach(happyActivity -> {
+            happyActivity.setState(StateUpDownEnum.ACTIVITY_STATE_ENROLLING.getCode());
+            this.baseMapper.updateById(happyActivity);
+        });
+    }
+
+    @Override
+    public FebsResponse voteActivityHot(Long id) {
+
+        ApiVoteActivityHotVo apiVoteActivityHotVo = new ApiVoteActivityHotVo();
+        HappyActivity happyActivity = this.baseMapper.selectById(id);
+        apiVoteActivityHotVo.setStartTime(happyActivity.getStartTime());
+        apiVoteActivityHotVo.setEndTime(happyActivity.getEndTime());
+
+        Integer optionCnt = happyActivityOptionMapper.selectCount(
+                new LambdaQueryWrapper<HappyActivityOption>()
+                        .eq(HappyActivityOption::getActivityId, id)
+                        .eq(HappyActivityOption::getDeleteFlag, StateUpDownEnum.DOWN.getCode())
+                        .eq(HappyActivityOption::getState, StateUpDownEnum.VOTE_OPTION_STATE_AUDIT_SUCCESS.getCode())
+        );
+        apiVoteActivityHotVo.setOptionCnt(optionCnt);
+
+        Integer followVoteCnt = happyFollowMapper.selectCount(
+                new LambdaQueryWrapper<HappyFollow>()
+                        .eq(HappyFollow::getSourceType, StateUpDownEnum.SOURCE_TYPE_ACTIVITY.getCode())
+                        .eq(HappyFollow::getSourceId, id)
+                        .eq(HappyFollow::getType, StateUpDownEnum.VOTE.getCode())
+                        .eq(HappyFollow::getDeleteFlag, StateUpDownEnum.DOWN.getCode())
+        );
+        apiVoteActivityHotVo.setFollowVoteCnt(followVoteCnt);
+
+        return new FebsResponse().success().data(apiVoteActivityHotVo);
+    }
+
 
     public static void main(String[] args) {
         Date date = new Date();

--
Gitblit v1.9.1