Przeglądaj źródła

广场舞大赛活动

xgb 1 miesiąc temu
rodzic
commit
fba4089c39

+ 4 - 0
fs-service/src/main/java/com/fs/activity/domain/AccWork.java

@@ -96,4 +96,8 @@ public class AccWork  {
     @TableField(exist = false)
     private Map<String, Object> params;
 
+    // 当前作品是否已投票
+    @TableField(exist = false)
+    private Boolean isVoted;
+
 }

+ 3 - 0
fs-service/src/main/java/com/fs/activity/mapper/AccWorkMapper.java

@@ -2,6 +2,7 @@ package com.fs.activity.mapper;
 
 import com.fs.activity.domain.AccWork;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.activity.param.AccWorkRequest;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -63,6 +64,8 @@ public interface AccWorkMapper extends BaseMapper<AccWork> {
     int deleteAccWorkByIds(Long[] ids);
 
     AccWork selectOneByTeamIdAndActivityId(@Param("activityId") Long activityId,@Param("teamId") Long teamId);
+
+    List<AccWork> selectListForApp(AccWorkRequest request);
 }
 
 

+ 33 - 0
fs-service/src/main/java/com/fs/activity/param/AccWorkRequest.java

@@ -0,0 +1,33 @@
+package com.fs.activity.param;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 作品表
+ * @TableName acc_work
+ */
+@Data
+public class AccWorkRequest {
+
+    private Integer pageNum = 1;
+
+    private Integer pageSize = 10;
+
+    private String workName;  // 作品名称关键词
+
+    @NotNull(message = "活动ID不能为空")
+    private Long activityId;  // 活动ID
+
+    private String sortBy = "hot";  // 排序方式:hot-热门 new-最新
+
+    private Long userId;
+
+}

+ 3 - 0
fs-service/src/main/java/com/fs/activity/service/AccWorkService.java

@@ -4,6 +4,7 @@ import com.fs.activity.domain.AccVoteRecord;
 import com.fs.activity.domain.AccWork;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.fs.activity.param.AccVoteRecordRequest;
+import com.fs.activity.param.AccWorkRequest;
 import com.fs.common.core.domain.R;
 
 import java.util.List;
@@ -71,4 +72,6 @@ public interface AccWorkService extends IService<AccWork> {
     R uploadVideo(AccWork accWork);
 
     R castVote(AccVoteRecordRequest accWorkRecord);
+
+    R getWorkList(AccWorkRequest request);
 }

+ 41 - 6
fs-service/src/main/java/com/fs/activity/service/impl/AccWorkServiceImpl.java

@@ -9,6 +9,7 @@ import com.fs.activity.domain.AccWork;
 import com.fs.activity.mapper.AccVoteRecordMapper;
 import com.fs.activity.param.AccVoteRecordRequest;
 import com.fs.activity.param.AccVoteRecordResponse;
+import com.fs.activity.param.AccWorkRequest;
 import com.fs.activity.service.AccActivityService;
 import com.fs.activity.service.AccWorkService;
 import com.fs.activity.mapper.AccWorkMapper;
@@ -17,6 +18,8 @@ import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.exception.ServiceException;
 import com.fs.common.exception.base.BusinessException;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
 import lombok.extern.slf4j.Slf4j;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
@@ -40,13 +43,17 @@ import java.util.concurrent.TimeUnit;
 public class AccWorkServiceImpl extends ServiceImpl<AccWorkMapper, AccWork>
     implements AccWorkService{
 
+    // 今日投票数
     private static final String DAILY_VOTE_LIMIT = "vote:daily:limit";
 
+    // 锁
     private static final String VOTE_LOCK_KEY = "vote:lock:";
 
+    // 作品数量
     private static final String VOTE_COUNT_KEY = "vote:count:";
 
-    private static final String VOTE_RANKING_KEY = "vote:ranking";
+    // 今日是否已经投给该作品
+    private static final String VOTE_WORK_KEY = "vote:work:";
 
 
 
@@ -206,11 +213,10 @@ public class AccWorkServiceImpl extends ServiceImpl<AccWorkMapper, AccWork>
             lockAcquired = lock.tryLock(3, 10, TimeUnit.SECONDS);
             if (lockAcquired) {
 
-                // 5. 检查今日是否已给该作品投票
-                if (accVoteRecordMapper.selectCount(new LambdaQueryWrapper<AccVoteRecord>()
-                        .eq(AccVoteRecord::getUserId, userId)
-                        .eq(AccVoteRecord::getWorkId, workId)
-                        .eq(AccVoteRecord::getVoteDate, today)) > 0) {
+                // 5. 检查今日是否已给该作品投票 (从 Redis 检查)
+                String userVoteKey = VOTE_WORK_KEY + userId + ":" + workId + ":" + todayStr;
+                Boolean hasVoted = redisTemplate.hasKey(userVoteKey);
+                if (hasVoted != null && hasVoted) {
                     throw new ServiceException("今日已给该作品投票");
                 }
 
@@ -224,6 +230,9 @@ public class AccWorkServiceImpl extends ServiceImpl<AccWorkMapper, AccWork>
                     throw new ServiceException("投票失败");
                 }
 
+                // 7. 标记用户今日已投票到 Redis
+                redisTemplate.opsForValue().set(userVoteKey, true, 2, TimeUnit.DAYS);
+
                 // 8. 更新Redis缓存
                 // 8.1 更新作品票数缓存
                 String countKey = VOTE_COUNT_KEY + workId;
@@ -286,6 +295,32 @@ public class AccWorkServiceImpl extends ServiceImpl<AccWorkMapper, AccWork>
         return accVoteRecordMapper.selectCount(new LambdaQueryWrapper<AccVoteRecord>()
                 .eq(AccVoteRecord::getUserId, userId).eq(AccVoteRecord::getVoteDate, todayStr));
     }
+
+
+    /**
+     * @Description: 作品查询
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2026/3/10 16:03
+     */
+    @Override
+    public R getWorkList(AccWorkRequest request) {
+
+        LocalDate today = LocalDate.now();
+        String todayStr = today.format(DateTimeFormatter.ISO_DATE);
+
+        PageHelper.startPage(request.getPageNum(), request.getPageSize());
+        List<AccWork> accWorks=baseMapper.selectListForApp(request);
+        for (AccWork work : accWorks) {
+            String userVoteKey = VOTE_WORK_KEY + request.getUserId() + ":" + work.getId() + ":" + todayStr;
+            Boolean hasVoted = redisTemplate.hasKey(userVoteKey);
+            // 假设 AccWork 有 isVoted 字段
+            work.setIsVoted(hasVoted != null && hasVoted);
+        }
+
+        return R.ok().put("data",new PageInfo<>(accWorks));
+    }
 }
 
 

+ 14 - 0
fs-service/src/main/resources/mapper/activity/AccWorkMapper.xml

@@ -52,6 +52,20 @@
     <select id="selectOneByTeamIdAndActivityId" resultType="com.fs.activity.domain.AccWork">
         <include refid="selectAccWorkVo"/> where team_id = #{teamId} and activity_id = #{activityId}
     </select>
+    <select id="selectListForApp" resultType="com.fs.activity.domain.AccWork">
+        <include refid="selectAccWorkVo"/> where status = 1 and activity_id = #{activityId}
+        <if test="workName != null and workName !=''">
+            and work_name like concat('%', #{workName}, '%')
+        </if>
+        <if test="sortBy != null">
+            <if test="sortBy == 'hot'">
+                order by vote_count desc
+            </if>
+            <if test="sortBy == 'new'">
+                order by created_at desc
+            </if>
+        </if>
+    </select>
 
     <insert id="insertAccWork" parameterType="AccWork" useGeneratedKeys="true" keyProperty="id">
         insert into acc_work

+ 16 - 0
fs-user-app/src/main/java/com/fs/app/controller/app/AccActivityController.java

@@ -4,6 +4,7 @@ import com.fs.activity.domain.AccTeam;
 import com.fs.activity.domain.AccWork;
 import com.fs.activity.param.AccTeamMemberRequest;
 import com.fs.activity.param.AccVoteRecordRequest;
+import com.fs.activity.param.AccWorkRequest;
 import com.fs.activity.service.AccActivityService;
 import com.fs.activity.service.AccTeamMemberService;
 import com.fs.activity.service.AccTeamService;
@@ -163,6 +164,21 @@ public class AccActivityController extends AppBaseController
         return accWorkService.castVote(request);
     }
 
+    /**
+     * @Description: 作品查询
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2026/3/10 16:00
+     */
+    @GetMapping("/getWorkList")
+    @Login
+    public R getWorkList(AccWorkRequest request){
+        request.setUserId(Long.parseLong(getUserId()));
+        return accWorkService.getWorkList(request);
+    }
+
+