소스 검색

用户积分查询接口

wangzhijun 14 시간 전
부모
커밋
4e6d975d24
15개의 변경된 파일261개의 추가작업 그리고 39개의 파일을 삭제
  1. 18 4
      nightFragrance-admin/src/main/java/com/ylx/web/controller/point/PointActivityController.java
  2. 19 3
      nightFragrance-admin/src/main/java/com/ylx/web/controller/point/UserPointController.java
  3. 2 2
      nightFragrance-massage/src/main/java/com/ylx/point/domain/PointSignReward.java
  4. 1 1
      nightFragrance-massage/src/main/java/com/ylx/point/domain/PointUserSignStatus.java
  5. 2 2
      nightFragrance-massage/src/main/java/com/ylx/point/domain/dto/PointSignRewardDTO.java
  6. 5 0
      nightFragrance-massage/src/main/java/com/ylx/point/domain/dto/UserPointActivityPageDTO.java
  7. 0 1
      nightFragrance-massage/src/main/java/com/ylx/point/domain/dto/UserPointPageDTO.java
  8. 24 0
      nightFragrance-massage/src/main/java/com/ylx/point/domain/vo/SignDayVo.java
  9. 7 10
      nightFragrance-massage/src/main/java/com/ylx/point/mapper/PointUserSignLogMapper.java
  10. 4 0
      nightFragrance-massage/src/main/java/com/ylx/point/service/IPointActivityService.java
  11. 1 0
      nightFragrance-massage/src/main/java/com/ylx/point/service/IPointUserSignLogService.java
  12. 167 9
      nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointActivityServiceImpl.java
  13. 1 0
      nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointUserLogServiceImpl.java
  14. 9 7
      nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointUserSignLogServiceImpl.java
  15. 1 0
      nightFragrance-massage/src/main/resources/mapper/point/PointActivityMapper.xml

+ 18 - 4
nightFragrance-admin/src/main/java/com/ylx/web/controller/point/PointActivityController.java

@@ -9,10 +9,7 @@ import com.ylx.common.enums.BusinessType;
 import com.ylx.point.domain.dto.PointActivityDTO;
 import com.ylx.point.domain.dto.PointActivityPageDTO;
 import com.ylx.point.domain.dto.PointActivityValidityDTO;
-import com.ylx.point.domain.vo.PointActivityDetailsVo;
-import com.ylx.point.domain.vo.PointActivityPageVo;
-import com.ylx.point.domain.vo.PointActivityStatVo;
-import com.ylx.point.domain.vo.PointActivityValidityVo;
+import com.ylx.point.domain.vo.*;
 import com.ylx.point.service.IPointActivityService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -118,4 +115,21 @@ public class PointActivityController extends BaseController {
         return R.ok(list);
     }
 
+
+    @PreAuthorize("@ss.hasPermi('point:activity:query')")
+    @ApiOperation("获取签到面板数据")
+    @GetMapping(value = "/sign/info")
+    public R<List<SignDayVo>> getSignInfo(@RequestParam String cityName) {
+        List<SignDayVo> list = this.pointActivityService.getSignInfo(cityName);
+        return R.ok(list);
+    }
+
+    @PreAuthorize("@ss.hasPermi('point:activity:add')")
+    @ApiOperation("用户签到接口")
+    @PostMapping(value = "/sign")
+    public R sign() {
+        this.pointActivityService.sign();
+        return R.ok();
+    }
+
 }

+ 19 - 3
nightFragrance-admin/src/main/java/com/ylx/web/controller/point/UserPointController.java

@@ -2,7 +2,10 @@ package com.ylx.web.controller.point;
 
 import com.ylx.common.core.controller.BaseController;
 import com.ylx.common.core.domain.R;
+import com.ylx.common.core.domain.model.WxLoginUser;
 import com.ylx.common.core.page.TableDataInfo;
+import com.ylx.massage.domain.TWxUser;
+import com.ylx.massage.service.TWxUserService;
 import com.ylx.point.domain.dto.UserPointActivityPageDTO;
 import com.ylx.point.domain.dto.UserPointPageDTO;
 import com.ylx.point.domain.vo.PointActivityPageVo;
@@ -31,18 +34,31 @@ public class UserPointController extends BaseController {
     private IPointUserLogService pointUserLogService;
     @Resource
     private IPointActivityService pointActivityService;
+    @Resource
+    private TWxUserService wxUserService;
 
     @PreAuthorize("@ss.hasPermi('user:point:query')")
     @ApiOperation("获取当前用户的积分信息")
     @GetMapping
     public R<UserPointInfoVO> getUserPointInfo() {
-        UserPointInfoVO vo = this.pointUserLogService.getUserPointInfo();
+        WxLoginUser wxLoginUser = getWxLoginUser();
+
+        TWxUser user = wxUserService.getByOpenId(wxLoginUser.getCOpenid());
+        if (user == null) {
+            throw new RuntimeException("用户不存在");
+        }
+
+        String userId = user.getId();
+
+//        UserPointInfoVO vo = this.pointUserLogService.getUserPointInfo();
+
+        UserPointInfoVO vo = new UserPointInfoVO();
         return R.ok(vo);
     }
 
     @PreAuthorize("@ss.hasPermi('user:point:query')")
     @ApiOperation("获取当前用户的积分信息分页数据")
-    @GetMapping("/page")
+    @PostMapping("/page")
     public TableDataInfo page(@Validated @RequestBody UserPointPageDTO dto) {
         startPage();
         List<UserPointLogVO> list = pointUserLogService.getUserPointLogList(dto);
@@ -51,7 +67,7 @@ public class UserPointController extends BaseController {
 
     @PreAuthorize("@ss.hasPermi('user:point:query')")
     @ApiOperation("获取当前用户活动任务分页数据")
-    @GetMapping("/activity/page")
+    @PostMapping("/activity/page")
     public TableDataInfo activityPage(@Validated @RequestBody UserPointActivityPageDTO dto) {
         startPage();
         List<UserPointActivityVo> list = pointActivityService.getUserPointActivityList(dto);

+ 2 - 2
nightFragrance-massage/src/main/java/com/ylx/point/domain/PointSignReward.java

@@ -33,13 +33,13 @@ public class PointSignReward extends BaseEntity {
      * 连续签到天数(3/5/7/10等)
      */
     @Excel(name = "连续签到天数(3/5/7/10等)")
-    private Long continueDays;
+    private Integer continueDays;
 
     /**
      * 对应奖励积分
      */
     @Excel(name = "对应奖励积分")
-    private Long rewardPoints;
+    private Integer rewardPoints;
 
     /**
      * 前端展示排序

+ 1 - 1
nightFragrance-massage/src/main/java/com/ylx/point/domain/PointUserSignStatus.java

@@ -47,7 +47,7 @@ public class PointUserSignStatus extends BaseEntity {
      * 当前连续天数
      */
     @Excel(name = "当前连续天数")
-    private Long currentContinuousDays;
+    private Integer currentContinuousDays;
 
     /**
      * 历史最高连续天数 (可选,用于成就系统)

+ 2 - 2
nightFragrance-massage/src/main/java/com/ylx/point/domain/dto/PointSignRewardDTO.java

@@ -9,9 +9,9 @@ import lombok.Data;
 public class PointSignRewardDTO {
 
     @ApiModelProperty("连续签到天数(3/5/7/10等)")
-    private Long continueDays;
+    private Integer continueDays;
 
     @ApiModelProperty("对应奖励积分")
-    private Long rewardPoints;
+    private Integer rewardPoints;
 
 }

+ 5 - 0
nightFragrance-massage/src/main/java/com/ylx/point/domain/dto/UserPointActivityPageDTO.java

@@ -15,6 +15,11 @@ public class UserPointActivityPageDTO extends BaseEntity {
     @NotNull(message = "活动类型不能为空")
     private Integer type;
 
+    @ApiModelProperty(name = "当前所在城市名称")
+    private String cityName;
+
+    @ApiModelProperty(name = "当前所在城市名称", hidden = true)
+    private String cityCode;
 
     @ApiModelProperty(name = "用户ID", hidden = true)
     private String userId;

+ 0 - 1
nightFragrance-massage/src/main/java/com/ylx/point/domain/dto/UserPointPageDTO.java

@@ -15,7 +15,6 @@ public class UserPointPageDTO extends BaseEntity {
     @NotNull(message = "操作类型不能为空")
     private Integer opType;
 
-
     @ApiModelProperty(name = "用户ID", hidden = true)
     private String userId;
 }

+ 24 - 0
nightFragrance-massage/src/main/java/com/ylx/point/domain/vo/SignDayVo.java

@@ -0,0 +1,24 @@
+package com.ylx.point.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+
+@Data
+@ApiModel("签到活动详情vo")
+public class SignDayVo {
+
+    @JsonFormat(pattern = "MM-dd", timezone = "GMT+8")
+    @ApiModelProperty("显示日期")
+    private LocalDate date;
+
+    @ApiModelProperty("对应奖励积分")
+    private Integer points;
+
+    @ApiModelProperty("状态:0:未签, 1:已签")
+    private Integer status;
+
+}

+ 7 - 10
nightFragrance-massage/src/main/java/com/ylx/point/mapper/PointUserSignLogMapper.java

@@ -2,6 +2,8 @@ package com.ylx.point.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ylx.point.domain.PointUserSignLog;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 
 import java.util.List;
 
@@ -13,15 +15,10 @@ import java.util.List;
  */
 public interface PointUserSignLogMapper extends BaseMapper<PointUserSignLog> {
 
-    public PointUserSignLog selectPointUserSignLogById(String id);
 
-    public List<PointUserSignLog> selectPointUserSignLogList(PointUserSignLog pointUserSignLog);
-
-    public int insertPointUserSignLog(PointUserSignLog pointUserSignLog);
-
-    public int updatePointUserSignLog(PointUserSignLog pointUserSignLog);
-
-    public int deletePointUserSignLogById(String id);
-
-    public int deletePointUserSignLogByIds(String[] ids);
+    @Select("SELECT COUNT(*) FROM point_user_sign_log " +
+            "WHERE user_id = #{userId} " +
+            "AND task_id = #{taskId} " +
+            "AND sign_date = CURDATE()")
+    int countTodaySign(@Param("userId") String userId, @Param("taskId") Long taskId);
 }

+ 4 - 0
nightFragrance-massage/src/main/java/com/ylx/point/service/IPointActivityService.java

@@ -37,4 +37,8 @@ public interface IPointActivityService extends IService<PointActivity> {
     List<UserPointActivityVo> getUserPointActivityList(UserPointActivityPageDTO dto);
 
     List<UserPointActivityVo> activityList();
+
+    List<SignDayVo> getSignInfo(String cityName);
+
+    void sign();
 }

+ 1 - 0
nightFragrance-massage/src/main/java/com/ylx/point/service/IPointUserSignLogService.java

@@ -11,4 +11,5 @@ import com.ylx.point.domain.PointUserSignLog;
  */
 public interface IPointUserSignLogService extends IService<PointUserSignLog> {
 
+    int countTodaySign(String userId, Long taskId);
 }

+ 167 - 9
nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointActivityServiceImpl.java

@@ -4,7 +4,8 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollectionUtil;
 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 com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ylx.common.core.domain.model.WxLoginUser;
 import com.ylx.common.exception.base.BaseException;
@@ -20,7 +21,6 @@ import com.ylx.point.enums.PointActivityTypeEnum;
 import com.ylx.point.mapper.PointActivityMapper;
 import com.ylx.point.service.*;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -29,6 +29,7 @@ import java.time.DateTimeException;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -44,18 +45,22 @@ import java.util.stream.Collectors;
 public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, PointActivity> implements IPointActivityService {
     @Resource
     private PointActivityMapper pointActivityMapper;
-    @Autowired
+    @Resource
     private IPointActivityTaskService pointActivityTaskService;
-    @Autowired
+    @Resource
     private IPointSignTaskService pointSignTaskService;
-    @Autowired
+    @Resource
     private IPointSignRewardService pointSignRewardService;
-    @Autowired
+    @Resource
     private IPointUserActivityTaskCompletionService pointUserActivityTaskCompletionService;
-    @Autowired
+    @Resource
     private IPointActivityExpirePolicyService pointActivityExpirePolicyService;
     @Resource
     private TWxUserService wxUserService;
+    @Resource
+    private IPointUserSignLogService pointUserSignLogService;
+    @Resource
+    private IPointUserSignStatusService pointUserSignStatusService;
 
     private static final int BATCH_SIZE = 1000;
 
@@ -239,6 +244,7 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
 
         String userId = user.getId();
         dto.setUserId(userId);
+        // TODO 根据cityName换cityCode
         return pointActivityMapper.selectTaskWithProgress(dto);
     }
 
@@ -291,6 +297,134 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
 
     }
 
+    @Override
+    public List<SignDayVo> getSignInfo(String cityName) {
+
+        WxLoginUser wxLoginUser = SecurityUtils.getWxLoginUser();
+        TWxUser user = wxUserService.getByOpenId(wxLoginUser.getCOpenid());
+        if (user == null) {
+            throw new RuntimeException("用户不存在");
+        }
+
+        String userId = user.getId();
+        // TODO 根据cityName换cityCode
+        String cityCode = "110000";
+        // 动态获取启用任务
+        PointSignTask task = getEnabledTask(cityCode);
+        Long taskId = task.getId();
+
+        List<SignDayVo> voList = new ArrayList<>();
+        LocalDate today = LocalDate.now();
+
+        // 奖励配置
+        LambdaQueryWrapper<PointSignReward> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(PointSignReward::getSignTaskId, taskId);
+        queryWrapper.orderByAsc(PointSignReward::getContinueDays);
+        queryWrapper.last("LIMIT 7");
+        List<PointSignReward> rewardList = this.pointSignRewardService.list(queryWrapper);
+
+        // 今日是否已签
+        boolean signedToday = pointUserSignLogService.countTodaySign(userId, taskId) > 0;
+
+        // 用户签到状态
+        LambdaQueryWrapper<PointUserSignStatus> statusQueryWrapper = new LambdaQueryWrapper<>();
+        statusQueryWrapper.eq(PointUserSignStatus::getUserId, userId);
+        statusQueryWrapper.eq(PointUserSignStatus::getActivityId, taskId);
+        PointUserSignStatus status = pointUserSignStatusService.getOne(statusQueryWrapper);
+        int continuousDays = ObjectUtil.isNull(status) ? 0 : status.getCurrentContinuousDays();
+
+        // 组装7天展示
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd");
+        for (int i = 0; i < 7; i++) {
+            LocalDate date = today.minusDays(i);
+            SignDayVo vo = new SignDayVo();
+            vo.setDate(date);
+
+            // 奖励匹配
+//            PointSignReward reward = rewardList.stream()
+//                    .filter(r -> r.getContinueDays() == (i + 1))
+//                    .findFirst()
+//                    .orElse(null);
+//            vo.setPoints(reward == null ? 0 : reward.getRewardPoints());
+
+            // 状态 0未签 1已签 2今日可签
+            if (i == 0) {
+                vo.setStatus(signedToday ? 1 : 2);
+            } else {
+                vo.setStatus((i + 1) <= continuousDays ? 1 : 0);
+            }
+            voList.add(vo);
+        }
+        return voList;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void sign() {
+//        // 1. 检查今天是否已签
+//        int count = pointUserSignLogService.countTodaySign(userId, DEFAULT_TASK_ID);
+//        if (count > 0) {
+//            throw new RuntimeException("今天已经签到过了");
+//        }
+//
+//        // 2. 锁定用户签到状态行 (悲观锁,防止并发重复签到)
+//        PointUserSignStatus status = statusMapper.selectByUserAndTaskForUpdate(userId, DEFAULT_TASK_ID);
+//
+//        int newContinuousDays = 1; // 默认第一天
+//
+//        if (status != null) {
+//            // 3. 判断是否断签
+//            // 逻辑:如果上次签到时间不是昨天,且断签规则是"重置",则重置天数
+//            boolean isBreak = !status.getLastSignTime().toLocalDate().equals(LocalDate.now().minusDays(1));
+//
+//            PointSignTask task = taskMapper.selectById(DEFAULT_TASK_ID);
+//            if (isBreak && task.getBreakRule() == 0) {
+//                newContinuousDays = 1;
+//            } else {
+//                newContinuousDays = status.getCurrentContinuousDays() + 1;
+//            }
+//
+//            // 更新状态表
+//            status.setCurrentContinuousDays(newContinuousDays);
+//            status.setLastSignTime(LocalDateTime.now());
+//            statusMapper.updateById(status);
+//        } else {
+//            // 第一次签到,插入状态
+//            PointUserSignStatus newStatus = new PointUserSignStatus();
+//            newStatus.setUserId(userId);
+//            newStatus.setTaskId(DEFAULT_TASK_ID);
+//            newStatus.setCurrentContinuousDays(1);
+//            newStatus.setLastSignTime(LocalDateTime.now());
+//            statusMapper.insert(newStatus);
+//        }
+//
+//        // 4. 计算奖励
+//        PointSignReward reward = rewardMapper.selectOne(
+//                new QueryWrapper<PointSignReward>()
+//                        .eq("task_id", DEFAULT_TASK_ID)
+//                        .eq("day", newContinuousDays)
+//        );
+//
+//        // 如果当前天数没有配置具体奖励,取最近的一个配置或者默认值
+//        if (reward == null) {
+//            // 这里可以写兜底逻辑,比如取最大天数的奖励
+//            reward = rewardMapper.selectOne(new QueryWrapper<PointSignReward>().eq("task_id", DEFAULT_TASK_ID).orderByDesc("day").last("limit 1"));
+//        }
+//
+//        int points = (reward == null) ? 1 : reward.getPoints();
+//
+//        // 5. 写入日志
+//        PointUserSignLog log = new PointUserSignLog();
+//        log.setUserId(userId);
+//        log.setTaskId(DEFAULT_TASK_ID);
+//        log.setPoints(points);
+//        log.setCreateTime(LocalDateTime.now());
+//        logMapper.insert(log);
+//
+//        // 6. 增加用户总积分 (调用账户服务)
+//        pointAccountService.addPoints(userId, points);
+    }
+
     /**
      * 判断任务是否未完成
      */
@@ -364,7 +498,7 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
         PointActivityDTO.ActivityTimeConfig timeConfig = dto.getTimeConfig();
         entity.setStartTime(DateUtil.beginOfDay(timeConfig.getStartTime()));
         entity.setEndTime(processEndTime(timeConfig.getEndTime()));
-        entity.setIsPermanent(timeConfig.getIsPermanent()? 1 : 0);
+        entity.setIsPermanent(timeConfig.getIsPermanent() ? 1 : 0);
 
         // 处理状态
         if (PointActivityStatusEnum.PUBLISHED.getCode().equals(dto.getStatus())) {
@@ -482,7 +616,7 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
         if (timeConfig != null) {
             entity.setStartTime(DateUtil.beginOfDay(timeConfig.getStartTime()));
             entity.setEndTime(processEndTime(timeConfig.getEndTime()));
-            entity.setIsPermanent(timeConfig.getIsPermanent()? 1 : 0);
+            entity.setIsPermanent(timeConfig.getIsPermanent() ? 1 : 0);
         }
 
         // 处理状态
@@ -730,5 +864,29 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
         }
     }
 
+    private PointSignTask getEnabledTask(String cityCode) {
+        // 1. 根据城市查询当前生效的活动
+        PointActivity activity = pointActivityMapper.selectOne(
+                new QueryWrapper<PointActivity>()
+                        .eq("cityCode", cityCode)
+                        .eq("status", 1)  // 活动启用
+                        .last("LIMIT 1")
+        );
+        if (ObjectUtil.isNull(activity)) {
+            throw new RuntimeException("当前城市未配置签到活动");
+        }
+
+        // 2. 根据活动绑定的 taskId 查询签到任务
+        LambdaQueryWrapper<PointSignTask> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(PointSignTask::getActivityId, activity.getId());
+        queryWrapper.eq(PointSignTask::getIsDeleted, 1);
+        List<PointSignTask> list = pointSignTaskService.list(queryWrapper);
+        PointSignTask task = new PointSignTask();
+        ;
+        if (CollectionUtil.isNotEmpty(list)) {
+            task = CollectionUtil.getLast(list);
+        }
+        return task;
+    }
 
 }

+ 1 - 0
nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointUserLogServiceImpl.java

@@ -2,6 +2,7 @@ package com.ylx.point.service.impl;
 
 import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ylx.common.core.domain.R;
 import com.ylx.common.core.domain.model.WxLoginUser;
 import com.ylx.common.utils.SecurityUtils;
 import com.ylx.massage.domain.TWxUser;

+ 9 - 7
nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointUserSignLogServiceImpl.java

@@ -1,14 +1,12 @@
 package com.ylx.point.service.impl;
 
-import java.util.List;
-
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ylx.common.utils.DateUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import com.ylx.point.mapper.PointUserSignLogMapper;
 import com.ylx.point.domain.PointUserSignLog;
+import com.ylx.point.mapper.PointUserSignLogMapper;
 import com.ylx.point.service.IPointUserSignLogService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
 
 /**
  * 用户签到记录Service业务层处理
@@ -18,7 +16,11 @@ import com.ylx.point.service.IPointUserSignLogService;
  */
 @Service
 public class PointUserSignLogServiceImpl extends ServiceImpl<PointUserSignLogMapper, PointUserSignLog> implements IPointUserSignLogService {
-    @Autowired
+    @Resource
     private PointUserSignLogMapper pointUserSignLogMapper;
 
+    @Override
+    public int countTodaySign(String userId, Long taskId) {
+        return pointUserSignLogMapper.countTodaySign(userId, taskId);
+    }
 }

+ 1 - 0
nightFragrance-massage/src/main/resources/mapper/point/PointActivityMapper.xml

@@ -107,6 +107,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         JOIN point_activity a ON t.activity_id = a.id
         WHERE t.is_deleted = 0 AND t.status = 0
           AND a.activity_type = #{type}
+          AND a.city_code = #{cityCode}
           AND a.status = 1
         ORDER BY t.sort_order ASC
         <!-- 数据范围过滤 -->