xgb 4 dní pred
rodič
commit
22b05c2670
18 zmenil súbory, kde vykonal 916 pridanie a 0 odobranie
  1. 104 0
      fs-admin/src/main/java/com/fs/app/controller/AccActivityController.java
  2. 2 0
      fs-service/src/main/java/com/fs/activity/domain/AccTeamMember.java
  3. 49 0
      fs-service/src/main/java/com/fs/activity/mapper/AccActivityMapper.java
  4. 4 0
      fs-service/src/main/java/com/fs/activity/mapper/AccTeamMapper.java
  5. 42 0
      fs-service/src/main/java/com/fs/activity/param/AccTeamMemberRequest.java
  6. 52 0
      fs-service/src/main/java/com/fs/activity/service/AccActivityService.java
  7. 5 0
      fs-service/src/main/java/com/fs/activity/service/AccTeamMemberService.java
  8. 16 0
      fs-service/src/main/java/com/fs/activity/service/AccTeamService.java
  9. 102 0
      fs-service/src/main/java/com/fs/activity/service/impl/AccActivityServiceImpl.java
  10. 93 0
      fs-service/src/main/java/com/fs/activity/service/impl/AccTeamMemberServiceImpl.java
  11. 167 0
      fs-service/src/main/java/com/fs/activity/service/impl/AccTeamServiceImpl.java
  12. 37 0
      fs-service/src/main/java/com/fs/activity/utils/CodeGenerator.java
  13. 3 0
      fs-service/src/main/java/com/fs/store/param/h5/FsUserPageListParam.java
  14. 2 0
      fs-service/src/main/java/com/fs/store/vo/h5/FsUserPageListVO.java
  15. 90 0
      fs-service/src/main/resources/mapper/activity/AccActivityMapper.xml
  16. 12 0
      fs-service/src/main/resources/mapper/activity/AccTeamMapper.xml
  17. 4 0
      fs-service/src/main/resources/mapper/his/FsUserMapper.xml
  18. 132 0
      fs-user-app/src/main/java/com/fs/app/controller/app/AccActivityController.java

+ 104 - 0
fs-admin/src/main/java/com/fs/app/controller/AccActivityController.java

@@ -0,0 +1,104 @@
+package com.fs.app.controller;
+
+import java.util.List;
+
+import com.fs.activity.service.AccActivityService;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.enums.BusinessType;
+import com.fs.activity.domain.AccActivity;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.common.core.page.TableDataInfo;
+
+/**
+ * 活动Controller
+ *
+ * @author fs
+ * @date 2026-03-05
+ */
+@RestController
+@RequestMapping("/app/activity")
+public class AccActivityController extends BaseController
+{
+    @Autowired
+    private AccActivityService accActivityService;
+
+    /**
+     * 查询活动列表
+     */
+    @PreAuthorize("@ss.hasPermi('activity:activity:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(AccActivity accActivity)
+    {
+        startPage();
+        List<AccActivity> list = accActivityService.selectAccActivityList(accActivity);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出活动列表
+     */
+    @PreAuthorize("@ss.hasPermi('activity:activity:export')")
+    @Log(title = "活动", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(AccActivity accActivity)
+    {
+        List<AccActivity> list = accActivityService.selectAccActivityList(accActivity);
+        ExcelUtil<AccActivity> util = new ExcelUtil<AccActivity>(AccActivity.class);
+        return util.exportExcel(list, "活动数据");
+    }
+
+    /**
+     * 获取活动详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('activity:activity:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(accActivityService.selectAccActivityById(id));
+    }
+
+    /**
+     * 新增活动
+     */
+    @PreAuthorize("@ss.hasPermi('activity:activity:add')")
+    @Log(title = "活动", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody AccActivity accActivity)
+    {
+        return toAjax(accActivityService.insertAccActivity(accActivity));
+    }
+
+    /**
+     * 修改活动
+     */
+    @PreAuthorize("@ss.hasPermi('activity:activity:edit')")
+    @Log(title = "活动", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody AccActivity accActivity)
+    {
+        return toAjax(accActivityService.updateAccActivity(accActivity));
+    }
+
+    /**
+     * 删除活动
+     */
+    @PreAuthorize("@ss.hasPermi('activity:activity:remove')")
+    @Log(title = "活动", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(accActivityService.deleteAccActivityByIds(ids));
+    }
+}

+ 2 - 0
fs-service/src/main/java/com/fs/activity/domain/AccTeamMember.java

@@ -54,6 +54,8 @@ public class AccTeamMember {
      */
     private Date updatedAt;
 
+    private Long activityId;
+
     @Override
     public boolean equals(Object that) {
         if (this == that) {

+ 49 - 0
fs-service/src/main/java/com/fs/activity/mapper/AccActivityMapper.java

@@ -3,6 +3,8 @@ package com.fs.activity.mapper;
 import com.fs.activity.domain.AccActivity;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
+import java.util.List;
+
 /**
 * @author Administrator
 * @description 针对表【acc_activity(活动表)】的数据库操作Mapper
@@ -11,6 +13,53 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 */
 public interface AccActivityMapper extends BaseMapper<AccActivity> {
 
+    /**
+     * 查询活动
+     *
+     * @param id 活动主键
+     * @return 活动
+     */
+    AccActivity selectAccActivityById(Long id);
+
+    /**
+     * 查询活动列表
+     *
+     * @param accActivity 活动
+     * @return 活动集合
+     */
+    List<AccActivity> selectAccActivityList(AccActivity accActivity);
+
+    /**
+     * 新增活动
+     *
+     * @param accActivity 活动
+     * @return 结果
+     */
+    int insertAccActivity(AccActivity accActivity);
+
+    /**
+     * 修改活动
+     *
+     * @param accActivity 活动
+     * @return 结果
+     */
+    int updateAccActivity(AccActivity accActivity);
+
+    /**
+     * 删除活动
+     *
+     * @param id 活动主键
+     * @return 结果
+     */
+    int deleteAccActivityById(Long id);
+
+    /**
+     * 批量删除活动
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteAccActivityByIds(Long[] ids);
 }
 
 

+ 4 - 0
fs-service/src/main/java/com/fs/activity/mapper/AccTeamMapper.java

@@ -2,6 +2,7 @@ package com.fs.activity.mapper;
 
 import com.fs.activity.domain.AccTeam;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
 
 /**
 * @author Administrator
@@ -11,6 +12,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 */
 public interface AccTeamMapper extends BaseMapper<AccTeam> {
 
+    AccTeam isSignUp(@Param("userId") long userId,@Param("activityId") Long activityId);
+
+    AccTeam selectTeamByUserIdAndActivityId(Long userId, Long activityId);
 }
 
 

+ 42 - 0
fs-service/src/main/java/com/fs/activity/param/AccTeamMemberRequest.java

@@ -0,0 +1,42 @@
+package com.fs.activity.param;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+
+@Data
+public class AccTeamMemberRequest {
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 活动ID
+     */
+    private Long activityId;
+
+    /**
+     * 队伍码(唯一)
+     */
+    private String teamCode;
+
+    // 用户名称
+    private String userName;
+
+    // 当前用户登录id
+    private Long userId;
+
+    // 队伍id
+    private Long teamId;
+
+    // 删除用户id
+    private Long deleteUserId;
+
+
+
+}

+ 52 - 0
fs-service/src/main/java/com/fs/activity/service/AccActivityService.java

@@ -2,6 +2,9 @@ package com.fs.activity.service;
 
 import com.fs.activity.domain.AccActivity;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.common.core.domain.R;
+
+import java.util.List;
 
 /**
 * @author Administrator
@@ -10,4 +13,53 @@ import com.baomidou.mybatisplus.extension.service.IService;
 */
 public interface AccActivityService extends IService<AccActivity> {
 
+    /**
+     * 查询活动
+     *
+     * @param id 活动主键
+     * @return 活动
+     */
+    AccActivity selectAccActivityById(Long id);
+
+    /**
+     * 查询活动列表
+     *
+     * @param accActivity 活动
+     * @return 活动集合
+     */
+    List<AccActivity> selectAccActivityList(AccActivity accActivity);
+
+    /**
+     * 新增活动
+     *
+     * @param accActivity 活动
+     * @return 结果
+     */
+    int insertAccActivity(AccActivity accActivity);
+
+    /**
+     * 修改活动
+     *
+     * @param accActivity 活动
+     * @return 结果
+     */
+    int updateAccActivity(AccActivity accActivity);
+
+    /**
+     * 批量删除活动
+     *
+     * @param ids 需要删除的活动主键集合
+     * @return 结果
+     */
+    int deleteAccActivityByIds(Long[] ids);
+
+    /**
+     * 删除活动信息
+     *
+     * @param id 活动主键
+     * @return 结果
+     */
+    int deleteAccActivityById(Long id);
+
+    R checkActivitySignUpStatus(Long activityId);
 }

+ 5 - 0
fs-service/src/main/java/com/fs/activity/service/AccTeamMemberService.java

@@ -2,6 +2,8 @@ package com.fs.activity.service;
 
 import com.fs.activity.domain.AccTeamMember;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.activity.param.AccTeamMemberRequest;
+import com.fs.common.core.domain.R;
 
 /**
 * @author Administrator
@@ -10,4 +12,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 */
 public interface AccTeamMemberService extends IService<AccTeamMember> {
 
+    R getUserTeamMember(Long activityId, Long teamId);
+
+    R deleteTeamMember(AccTeamMemberRequest accTeam);
 }

+ 16 - 0
fs-service/src/main/java/com/fs/activity/service/AccTeamService.java

@@ -2,6 +2,8 @@ package com.fs.activity.service;
 
 import com.fs.activity.domain.AccTeam;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.activity.param.AccTeamMemberRequest;
+import com.fs.common.core.domain.R;
 
 /**
 * @author Administrator
@@ -10,4 +12,18 @@ import com.baomidou.mybatisplus.extension.service.IService;
 */
 public interface AccTeamService extends IService<AccTeam> {
 
+    /**
+     * @Description: 查询用户是否报名
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2026/3/6 10:10
+     */
+    Boolean isSignUp(Long userId, Long activityId);
+
+    R signUpLeader(AccTeam accTeam);
+
+    R signUp(AccTeamMemberRequest accTeam);
+
+    R getUserTeam(Long userId,Long activityId);
 }

+ 102 - 0
fs-service/src/main/java/com/fs/activity/service/impl/AccActivityServiceImpl.java

@@ -4,8 +4,11 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.activity.domain.AccActivity;
 import com.fs.activity.service.AccActivityService;
 import com.fs.activity.mapper.AccActivityMapper;
+import com.fs.common.core.domain.R;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
 * @author Administrator
 * @description 针对表【acc_activity(活动表)】的数据库操作Service实现
@@ -15,6 +18,105 @@ import org.springframework.stereotype.Service;
 public class AccActivityServiceImpl extends ServiceImpl<AccActivityMapper, AccActivity>
     implements AccActivityService{
 
+    /**
+     * 查询活动
+     *
+     * @param id 活动主键
+     * @return 活动
+     */
+    @Override
+    public AccActivity selectAccActivityById(Long id)
+    {
+        return baseMapper.selectAccActivityById(id);
+    }
+
+    /**
+     * 查询活动列表
+     *
+     * @param accActivity 活动
+     * @return 活动
+     */
+    @Override
+    public List<AccActivity> selectAccActivityList(AccActivity accActivity)
+    {
+        return baseMapper.selectAccActivityList(accActivity);
+    }
+
+    /**
+     * 新增活动
+     *
+     * @param accActivity 活动
+     * @return 结果
+     */
+    @Override
+    public int insertAccActivity(AccActivity accActivity)
+    {
+        return baseMapper.insertAccActivity(accActivity);
+    }
+
+    /**
+     * 修改活动
+     *
+     * @param accActivity 活动
+     * @return 结果
+     */
+    @Override
+    public int updateAccActivity(AccActivity accActivity)
+    {
+        return baseMapper.updateAccActivity(accActivity);
+    }
+
+    /**
+     * 批量删除活动
+     *
+     * @param ids 需要删除的活动主键
+     * @return 结果
+     */
+    @Override
+    public int deleteAccActivityByIds(Long[] ids)
+    {
+        return baseMapper.deleteAccActivityByIds(ids);
+    }
+
+    /**
+     * 删除活动信息
+     *
+     * @param id 活动主键
+     * @return 结果
+     */
+    @Override
+    public int deleteAccActivityById(Long id)
+    {
+        return baseMapper.deleteAccActivityById(id);
+    }
+
+    /**
+     * @Description: 检测活动状态
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2026/3/6 10:49
+     */
+    @Override
+    public R checkActivitySignUpStatus(Long activityId){
+        AccActivity accActivity = baseMapper.selectAccActivityById(activityId);
+        if(accActivity==null){
+            return R.error("活动不存在");
+        }
+        if(accActivity.getStatus()!=1){
+            return R.error("活动未进行");
+        }
+        // 检测活动时间
+        if(accActivity.getActivityStartTime().getTime()>System.currentTimeMillis()){
+            return R.error("活动未开始报名");
+        }
+        if(accActivity.getActivityEndTime().getTime()<System.currentTimeMillis()){
+            return R.error("活动报名已结束");
+        }
+        return R.ok();
+    }
+
+
 }
 
 

+ 93 - 0
fs-service/src/main/java/com/fs/activity/service/impl/AccTeamMemberServiceImpl.java

@@ -1,10 +1,21 @@
 package com.fs.activity.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.activity.domain.AccTeam;
 import com.fs.activity.domain.AccTeamMember;
+import com.fs.activity.mapper.AccTeamMapper;
+import com.fs.activity.param.AccTeamMemberRequest;
+import com.fs.activity.service.AccActivityService;
 import com.fs.activity.service.AccTeamMemberService;
 import com.fs.activity.mapper.AccTeamMemberMapper;
+import com.fs.activity.service.AccTeamService;
+import com.fs.common.core.domain.R;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
 
 /**
 * @author Administrator
@@ -15,6 +26,88 @@ import org.springframework.stereotype.Service;
 public class AccTeamMemberServiceImpl extends ServiceImpl<AccTeamMemberMapper, AccTeamMember>
     implements AccTeamMemberService{
 
+    @Autowired
+    private AccActivityService accActivityService;
+
+    @Autowired
+    private AccTeamMapper accTeamMapper;
+
+    @Override
+    public R getUserTeamMember(Long activityId, Long teamId) {
+        List<AccTeamMember> member=baseMapper.selectList(new LambdaQueryWrapper<AccTeamMember>()
+                .eq(AccTeamMember::getActivityId, activityId)
+                .eq(AccTeamMember::getTeamId, teamId));
+        return R.ok().put("data",member);
+    }
+
+    /**
+     * @Description: 删除队伍成员
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2026/3/6 16:21
+     */
+    @Override
+    @Transactional
+    public R deleteTeamMember(AccTeamMemberRequest accTeam) {
+
+        R r=accActivityService.checkActivitySignUpStatus(accTeam.getActivityId());
+        if(!r.get("code").equals(200)){
+            return r;
+        }
+
+        // 获取队伍信息
+        AccTeam team=accTeamMapper.selectOne(
+                new LambdaQueryWrapper<AccTeam>().eq(AccTeam::getId, accTeam.getTeamId())
+                        .eq(AccTeam::getActivityId, accTeam.getActivityId()));
+        if(team==null){
+            return R.error("无此队伍");
+        }
+
+        // 删除队伍
+        if(accTeam.getDeleteUserId().equals(team.getLeaderId())){
+            if(!team.getLeaderId().equals(accTeam.getUserId())){
+                return R.error("无此权限");
+            }
+
+            // 删除队伍
+            int i=accTeamMapper.delete(new LambdaQueryWrapper<AccTeam>()
+                    .eq(AccTeam::getActivityId, accTeam.getActivityId())
+                    .eq(AccTeam::getId, accTeam.getTeamId()));
+            if(i<1){
+                return R.error("无此队伍");
+            }
+
+            // 删除成员
+            int j=baseMapper.delete(new LambdaQueryWrapper<AccTeamMember>()
+                     .eq(AccTeamMember::getActivityId, accTeam.getActivityId())
+                    .eq(AccTeamMember::getTeamId, accTeam.getTeamId()));
+            if (j<1){
+                return R.error("无此成员");
+            }
+        }else {// 删除成员
+            // 普通成员只能删除自己
+            if(!team.getLeaderId().equals(accTeam.getUserId()) && !accTeam.getUserId().equals(accTeam.getDeleteUserId())){
+                return R.error("无此权限");
+            }
+
+            int i=baseMapper.delete(new LambdaQueryWrapper<AccTeamMember>()
+                    .eq(AccTeamMember::getActivityId, accTeam.getActivityId())
+                    .eq(AccTeamMember::getTeamId, accTeam.getTeamId())
+                    .eq(AccTeamMember::getUserId, accTeam.getDeleteUserId()));
+            if(i<1){
+                return R.error("无此成员");
+            }
+
+            AccTeam update=new AccTeam();
+            update.setId(team.getId());
+            update.setMemberCount(team.getMemberCount()-1);
+            if(accTeamMapper.updateById(update)<1) {
+                throw new RuntimeException("更新失败");
+            }
+        }
+        return R.ok();
+    }
 }
 
 

+ 167 - 0
fs-service/src/main/java/com/fs/activity/service/impl/AccTeamServiceImpl.java

@@ -1,10 +1,20 @@
 package com.fs.activity.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.activity.domain.AccActivity;
 import com.fs.activity.domain.AccTeam;
+import com.fs.activity.domain.AccTeamMember;
+import com.fs.activity.mapper.AccTeamMemberMapper;
+import com.fs.activity.param.AccTeamMemberRequest;
+import com.fs.activity.service.AccActivityService;
 import com.fs.activity.service.AccTeamService;
 import com.fs.activity.mapper.AccTeamMapper;
+import com.fs.activity.utils.CodeGenerator;
+import com.fs.common.core.domain.R;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
 * @author Administrator
@@ -15,6 +25,163 @@ import org.springframework.stereotype.Service;
 public class AccTeamServiceImpl extends ServiceImpl<AccTeamMapper, AccTeam>
     implements AccTeamService{
 
+    @Autowired
+    private AccActivityService accActivityService;
+
+    @Autowired
+    private AccTeamMemberMapper accTeamMemberMapper;
+
+    private final static Integer TEAM_MAX_MEMBER_COUNT = 26;
+
+    /**
+     * @Description: 查询用户是否报名
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2026/3/6 10:10
+     */
+    @Override
+    public Boolean isSignUp(Long userId, Long activityId) {
+        R r=accActivityService.checkActivitySignUpStatus(activityId);
+        if(!r.get("code").equals(200)){
+            return false;
+        }
+
+        AccTeam accTeam   = baseMapper.isSignUp(userId, activityId);
+        return accTeam!=null;
+    }
+
+    /**
+     * @Description: 活动报名
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2026/3/6 10:38
+     */
+
+    @Override
+    @Transactional
+    public R signUpLeader(AccTeam accTeam) {
+
+        accTeam.setTeamCode(CodeGenerator.generateTeamCode(accTeam.getActivityId()));
+        R r=accActivityService.checkActivitySignUpStatus(accTeam.getActivityId());
+        if(!r.get("code").equals(200)){
+            return r;
+        }
+
+        accTeam.setMemberCount(1);
+        if(baseMapper.insert(accTeam)<=0){
+            return R.error("创建领队失败");
+        }
+
+        AccTeamMember accTeamMember = new AccTeamMember();
+        accTeamMember.setTeamId(accTeam.getId());
+        accTeamMember.setUserId(accTeam.getLeaderId());
+        accTeamMember.setUserName(accTeam.getLeaderName());
+        accTeamMember.setActivityId(accTeam.getActivityId());
+        if(accTeamMemberMapper.insert(accTeamMember)<=0){
+            throw new RuntimeException("创建队员失败");
+        }
+        return R.ok();
+    }
+
+    /**
+     * @Description: 普通队员报名
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2026/3/6 14:23
+     */
+    @Override
+    @Transactional
+    public R signUp(AccTeamMemberRequest accTeam) {
+        R r=accActivityService.checkActivitySignUpStatus(accTeam.getActivityId());
+        if(!r.get("code").equals(200)){
+            return r;
+        }
+
+        // 获取领队信息 更具队伍码
+        AccTeam team=baseMapper.selectOne(new LambdaQueryWrapper<AccTeam>()
+                .eq(AccTeam::getTeamCode, accTeam.getTeamCode()));
+        if(team==null){
+            return R.error("团队不存在");
+        }
+
+        // 校验队员人数
+        if(team.getMemberCount()>=TEAM_MAX_MEMBER_COUNT){
+            return R.error("该队伍已满");
+        }
+
+        // 查询是否加入队伍
+        AccTeamMember member=accTeamMemberMapper.selectOne(new LambdaQueryWrapper<AccTeamMember>()
+                .eq(AccTeamMember::getActivityId, team.getActivityId())
+                .eq(AccTeamMember::getUserId, accTeam.getUserId()));
+        if(member==null){
+
+
+            // 登记队伍表
+            AccTeamMember accTeamMember = new AccTeamMember();
+            accTeamMember.setTeamId(team.getId());
+            accTeamMember.setUserId(accTeam.getUserId());
+            accTeamMember.setUserName(accTeam.getUserName());
+            accTeamMember.setActivityId(accTeam.getActivityId());
+            if (accTeamMemberMapper.insert(accTeamMember)<1){
+                return R.error("创建队员失败");
+            }
+
+            // 更新队伍信息
+            AccTeam update=new AccTeam();
+            update.setId(team.getId());
+            update.setMemberCount(team.getMemberCount()+1);
+            if(baseMapper.updateById(update)<1){
+                throw new RuntimeException("更新队伍信息失败");
+            }
+        }else {
+            if(member.getStatus()==1){
+                return R.error("您已有队伍,请先退出队伍再加入");
+            }else {
+                AccTeamMember accTeamMember = new AccTeamMember();
+                accTeamMember.setTeamId(team.getId());
+                accTeamMember.setUserId(accTeam.getUserId());
+                accTeamMember.setUserName(accTeam.getUserName());
+                accTeamMember.setActivityId(accTeam.getActivityId());
+                accTeamMember.setStatus(1);
+                if (accTeamMemberMapper.updateById(accTeamMember)<1){
+                    return R.error("创建队员失败");
+                }
+                // 更新队伍信息
+                AccTeam update=new AccTeam();
+                update.setId(team.getId());
+                update.setMemberCount(team.getMemberCount()+1);
+                if(baseMapper.updateById(update)<1){
+                    throw new RuntimeException("更新队伍信息失败");
+                }
+            }
+        }
+        return R.ok();
+    }
+
+    /**
+     * @Description: 获取队伍信息
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2026/3/6 14:50
+     */
+    @Override
+    public R getUserTeam(Long userId,Long activityId) {
+        AccActivity accActivity=accActivityService.selectAccActivityById(activityId);
+        if(accActivity==null){
+            return R.error("活动不存在");
+        }
+
+        AccTeam team=baseMapper.selectTeamByUserIdAndActivityId(userId,activityId);
+        if (team== null){
+            return R.error().put("msg","您没有加入任何队伍");
+        }
+
+        return R.ok().put("team",team);
+    }
 }
 
 

+ 37 - 0
fs-service/src/main/java/com/fs/activity/utils/CodeGenerator.java

@@ -0,0 +1,37 @@
+package com.fs.activity.utils;
+
+import com.fs.common.utils.DateUtils;
+
+import java.util.Random;
+
+public class CodeGenerator {
+
+    private static final String TEAM_CODE_PREFIX = "zk";
+    private static final Random RANDOM = new Random();
+
+
+
+    /**
+     * 生成队伍码(格式:zk + 活动 ID(补零到 4 位) + yyMMddHHmmss + 2 位随机数)
+     * 示例:zk0001234525030415304556 (活动 ID=12345)
+     *
+     * @param activityId 活动 ID
+     * @return 队伍码
+     */
+    public static String generateTeamCode(Long activityId) {
+        String timeStr = DateUtils.dateTimeNow().substring(2);
+        int randomNum = RANDOM.nextInt(90) + 10;
+        String activityIdStr = String.format("%04d", activityId);
+
+        return String.format("%s%s%s%02d",
+                TEAM_CODE_PREFIX,
+                activityIdStr,
+                timeStr,
+                randomNum);
+    }
+
+    public static void main(String[] args) {
+        System.out.println(generateTeamCode(1L));
+    }
+
+}

+ 3 - 0
fs-service/src/main/java/com/fs/store/param/h5/FsUserPageListParam.java

@@ -96,6 +96,9 @@ public class FsUserPageListParam implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date sTime;
 
+    // 0-不是 1-是
+    private Integer isAppUser;
+
 
 }
 

+ 2 - 0
fs-service/src/main/java/com/fs/store/vo/h5/FsUserPageListVO.java

@@ -109,4 +109,6 @@ public class FsUserPageListVO {
     // 项目会员 主键
     private Long id;
 
+    private Integer isAppUser;
+
 }

+ 90 - 0
fs-service/src/main/resources/mapper/activity/AccActivityMapper.xml

@@ -27,4 +27,94 @@
         activity_start_time,activity_end_time,location,rules,awards,
         status,created_by,created_at,updated_at
     </sql>
+
+    <sql id="selectAccActivityVo">
+        select id, title, cover_url, description, registration_start_time, registration_end_time, activity_start_time, activity_end_time, location, rules, awards, status, created_by, created_at, updated_at from acc_activity
+    </sql>
+
+    <select id="selectAccActivityList" parameterType="AccActivity" resultMap="BaseResultMap">
+        <include refid="selectAccActivityVo"/>
+        <where>
+            <if test="title != null  and title != ''"> and title like concat('%', #{title}, '%')</if>
+            <if test="registrationStartTime != null "> and registration_start_time &gt;= #{registrationStartTime}</if>
+            <if test="registrationEndTime != null "> and registration_end_time &lt;= #{registrationEndTime}</if>
+            <if test="activityStartTime != null "> and activity_start_time &gt;= #{activityStartTime}</if>
+            <if test="activityEndTime != null "> and activity_end_time &lt;= #{activityEndTime}</if>
+            <if test="status != null "> and status = #{status}</if>
+            <if test="createdBy != null "> and created_by = #{createdBy}</if>
+        </where>
+    </select>
+
+    <select id="selectAccActivityById" parameterType="Long" resultMap="BaseResultMap">
+        <include refid="selectAccActivityVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertAccActivity" parameterType="AccActivity" useGeneratedKeys="true" keyProperty="id">
+        insert into acc_activity
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="title != null and title != ''">title,</if>
+            <if test="coverUrl != null">cover_url,</if>
+            <if test="description != null">description,</if>
+            <if test="registrationStartTime != null">registration_start_time,</if>
+            <if test="registrationEndTime != null">registration_end_time,</if>
+            <if test="activityStartTime != null">activity_start_time,</if>
+            <if test="activityEndTime != null">activity_end_time,</if>
+            <if test="location != null">location,</if>
+            <if test="rules != null">rules,</if>
+            <if test="awards != null">awards,</if>
+            <if test="status != null">status,</if>
+            <if test="createdBy != null">created_by,</if>
+            <if test="createdAt != null">created_at,</if>
+            <if test="updatedAt != null">updated_at,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="title != null and title != ''">#{title},</if>
+            <if test="coverUrl != null">#{coverUrl},</if>
+            <if test="description != null">#{description},</if>
+            <if test="registrationStartTime != null">#{registrationStartTime},</if>
+            <if test="registrationEndTime != null">#{registrationEndTime},</if>
+            <if test="activityStartTime != null">#{activityStartTime},</if>
+            <if test="activityEndTime != null">#{activityEndTime},</if>
+            <if test="location != null">#{location},</if>
+            <if test="rules != null">#{rules},</if>
+            <if test="awards != null">#{awards},</if>
+            <if test="status != null">#{status},</if>
+            <if test="createdBy != null">#{createdBy},</if>
+            <if test="createdAt != null">#{createdAt},</if>
+            <if test="updatedAt != null">#{updatedAt},</if>
+        </trim>
+    </insert>
+
+    <update id="updateAccActivity" parameterType="AccActivity">
+        update acc_activity
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="title != null and title != ''">title = #{title},</if>
+            <if test="coverUrl != null">cover_url = #{coverUrl},</if>
+            <if test="description != null">description = #{description},</if>
+            <if test="registrationStartTime != null">registration_start_time = #{registrationStartTime},</if>
+            <if test="registrationEndTime != null">registration_end_time = #{registrationEndTime},</if>
+            <if test="activityStartTime != null">activity_start_time = #{activityStartTime},</if>
+            <if test="activityEndTime != null">activity_end_time = #{activityEndTime},</if>
+            <if test="location != null">location = #{location},</if>
+            <if test="rules != null">rules = #{rules},</if>
+            <if test="awards != null">awards = #{awards},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="createdBy != null">created_by = #{createdBy},</if>
+            <if test="createdAt != null">created_at = #{createdAt},</if>
+            <if test="updatedAt != null">updated_at = #{updatedAt},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteAccActivityById" parameterType="Long">
+        delete from acc_activity where id = #{id}
+    </delete>
+
+    <delete id="deleteAccActivityByIds" parameterType="String">
+        delete from acc_activity where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
 </mapper>

+ 12 - 0
fs-service/src/main/resources/mapper/activity/AccTeamMapper.xml

@@ -26,4 +26,16 @@
         leader_name,leader_phone,member_count,status,audit_remark,
         audit_time,created_at,updated_at
     </sql>
+
+    <select id="isSignUp" resultType="com.fs.activity.domain.AccTeam">
+            select t.* from acc_team t
+            inner join acc_team_member m on t.id = m.team_id
+            where m.user_id = #{userId} and t.activity_id = #{activityId}
+    </select>
+
+    <select id="selectTeamByUserIdAndActivityId" resultType="com.fs.activity.domain.AccTeam">
+        select t.* from acc_team t
+        inner join acc_team_member m on t.id = m.team_id
+        where m.user_id = #{userId} and m.activity_id = #{activityId}
+    </select>
 </mapper>

+ 4 - 0
fs-service/src/main/resources/mapper/his/FsUserMapper.xml

@@ -233,6 +233,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         fs_user.avatar,
         fs_user.nick_name as nickname,
         fs_user.phone,
+        case when fs_user.app_open_id is null then 0 else 1 end as isAppUser,
         fs_user_course_count.id,
         fs_user_course_count.watch_course_count,
 --         fs_course_watch_log.watch_course_count,
@@ -262,6 +263,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         LEFT JOIN company_tag ON company_tag.tag_id = upt.tag_id
         LEFT JOIN company_user ON company_user.user_id = fs_user_company_user.company_user_id
         where fs_user.is_del = 0
+        <if test="isAppUser != null">
+            and fs_user.app_open_id is not null
+        </if>
         <if test="userId != null and userId!= 0 ">
             and fs_user_company_user.company_user_id = #{userId}
         </if>

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

@@ -0,0 +1,132 @@
+package com.fs.app.controller.app;
+
+import com.fs.activity.domain.AccTeam;
+import com.fs.activity.param.AccTeamMemberRequest;
+import com.fs.activity.service.AccActivityService;
+import com.fs.activity.service.AccTeamMemberService;
+import com.fs.activity.service.AccTeamService;
+import com.fs.activity.service.impl.AccTeamMemberServiceImpl;
+import com.fs.app.annotation.Login;
+import com.fs.app.controller.AppBaseController;
+import com.fs.common.core.domain.R;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 活动Controller
+ *
+ * @author fs
+ * @date 2026-03-05
+ */
+@RestController
+@RequestMapping("/app/activity")
+public class AccActivityController extends AppBaseController
+{
+    @Autowired
+    private AccActivityService accActivityService;
+
+    @Autowired
+    private AccTeamService accTeamService;
+    @Autowired
+    private AccTeamMemberService accTeamMemberService;
+
+    // 活动报名列表
+
+    /**
+     * @Description: 查询用户是否报名
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2026/3/6 10:03
+     */
+    @Login
+    @GetMapping("/isSignUp")
+    public Boolean isSignUp(Long activityId){
+        return accTeamService.isSignUp(Long.parseLong(getUserId()),activityId);
+    }
+
+    /**
+     * @Description: 获取活动信息
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2026/3/6 15:18
+     */
+    @GetMapping("/getActivityInfo")
+    public R getActivityInfo(Long activityId){
+        return R.ok().put("data",accActivityService.selectAccActivityById(activityId));
+    }
+
+
+    /**
+     * @Description: 活动报名 领队
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2026/3/6 10:03
+     */
+    @Login
+    @PostMapping("/signUpLeader")
+    public R signUpLeader(@RequestBody AccTeam accTeam){
+        return accTeamService.signUpLeader(accTeam);
+    }
+
+    /**
+     * @Description: 活动报名 队员
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2026/3/6 10:03
+     */
+    @Login
+    @PostMapping("/signUpUser")
+    public R signUp(@RequestBody AccTeamMemberRequest accTeam){
+        accTeam.setUserId(Long.parseLong(getUserId()));
+        return accTeamService.signUp(accTeam);
+    }
+
+
+    /**
+     * @Description: 获取用户报名的队伍信息
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2026/3/6 10:03
+     */
+    @Login
+    @GetMapping("/getUserTeam")
+    public R getUserTeam(Long activityId){
+        return accTeamService.getUserTeam(Long.parseLong(getUserId()),activityId);
+    }
+
+    /**
+     * @Description: 获取用户报名的队伍成员信息
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2026/3/6 10:03
+     */
+    @GetMapping("/getUserTeamMember")
+    public R getUserTeamMember(Long activityId,Long teamId){
+        return accTeamMemberService.getUserTeamMember(activityId,teamId);
+    }
+
+
+
+    /**
+     * @Description: 删除队员和队伍
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2026/3/6 14:48
+     */
+    @Login
+    @PostMapping("/deleteTeamMember")
+    public R deleteTeamMember(@RequestBody AccTeamMemberRequest accTeam){
+        accTeam.setUserId(Long.parseLong(getUserId()));
+        return accTeamMemberService.deleteTeamMember(accTeam);
+    }
+
+
+
+}