diff --git a/backend/src/main/java/com/budwk/app/module/activity/controller/ActGroupController.java b/backend/src/main/java/com/budwk/app/module/activity/controller/ActGroupController.java index 72fd33f..1ba707c 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/controller/ActGroupController.java +++ b/backend/src/main/java/com/budwk/app/module/activity/controller/ActGroupController.java @@ -1,24 +1,31 @@ package com.budwk.app.module.activity.controller; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.StrUtil; import com.budwk.app.base.page.PageForm; import com.budwk.app.base.result.Result; import com.budwk.app.module.activity.models.ActGroup; -import com.budwk.app.module.activity.models.ActUser; +import com.budwk.app.module.activity.models.ActGroupUser; +import com.budwk.app.module.activity.models.ActItemGroupScore; import com.budwk.app.module.activity.service.ActGroupService; import com.budwk.app.module.activity.service.ActUserService; import com.budwk.app.module.activity.vo.ActGroupVo; +import com.budwk.app.module.activity.vo.ActUnGroupUserVo; import com.budwk.app.web.commons.slog.annotation.SLog; import lombok.extern.slf4j.Slf4j; +import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; +import org.nutz.dao.util.cri.SqlExpressionGroup; +import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.util.NutMap; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; import java.util.ArrayList; import java.util.List; @@ -52,8 +59,37 @@ public class ActGroupController { @At @SaCheckPermission("activity.group") - public Result pageData(PageForm pageForm, String activityId){ - return null; + public Result pageData(PageForm pageForm, String activityId, String groupName){ + Sql sql = Sqls.create(""" + SELECT + ag.*, + COUNT(agu.userId) AS groupNum, + SUM(CASE WHEN u.sex = '男' THEN 1 ELSE 0 END) AS manNum, + SUM(CASE WHEN u.sex = '女' THEN 1 ELSE 0 END) AS womanNum, + MAX(CASE WHEN agu.isLeader = 1 THEN u.userName END) AS leaderName, + MAX(CASE WHEN agu.isLeader = 1 THEN u.phone END) AS leaderPhone + FROM + act_group ag + LEFT JOIN act_group_user agu ON agu.groupId = ag.id + LEFT JOIN act_user u ON u.userId = agu.userId + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.and("ag.activityId", "=", activityId); + if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { + SqlExpressionGroup seg = new SqlExpressionGroup(); + seg.orLike("u.userName", pageForm.getSearchKeyword()); + seg.orLike("u.phone", pageForm.getSearchKeyword()); + cnd.and(seg); + } + if (StrUtil.isNotBlank(groupName)) { + cnd.and("ag,groupName", "like", "%" + groupName + "%"); + } + cnd.asc("ag.sort"); + cnd.groupBy("ag.id"); + sql.setCondition(cnd); + List nutMaps = actGroupService.listMap(sql); + return Result.success().addData(nutMaps); } @@ -85,6 +121,27 @@ public class ActGroupController { } + @At + @Aop(TransAop.READ_COMMITTED) + @SaCheckPermission("activity.group") + @SLog(tag = "活动分组", msg = "删除分组") + public Result doRemove(String id) { + // 删除活动分组及分组的相关表格 + dao.clear(ActGroup.class, Cnd.where(ActGroup::getId, "=", id)); + dao.clear(ActGroupUser.class, Cnd.where(ActGroupUser::getGroupId, "=", id)); + dao.clear(ActItemGroupScore.class, Cnd.where(ActItemGroupScore::getGroupId, "=", id)); + return Result.success(); + } + + + @At + @SaCheckPermission("activity.group") + public Result queryGroupList(String activityId){ + List query = dao.query(ActGroup.class, Cnd.where(ActGroup::getActivityId, "=", activityId)); + return Result.success().addData(query); + } + + @At @SaCheckPermission("activity.group") @SLog(tag = "活动分组", msg = "随机分组") @@ -93,4 +150,29 @@ public class ActGroupController { actGroupService.groupSetting(actGroupVo); return Result.success(); } + + + @At + @SaCheckPermission("activity.group") + public Result queryUnGroupUser(String activityId){ + Sql sql = Sqls.create(""" + SELECT + u.* + FROM + act_un_group_user augu + LEFT JOIN act_user u ON u.userId = augu.userId + WHERE augu.activityId = @activityId + """).setParam("activityId", activityId); + List list = actUserService.listMap(sql); + return Result.success(list); + } + + + @At + @SaCheckPermission("activity.group") + @SLog(tag = "活动分组", msg = "设置未分组人员") + public Result unGroupUserSetting(ActUnGroupUserVo actUnGroupUserVo){ + actGroupService.unGroupUserSetting(actUnGroupUserVo); + return Result.success(); + } } diff --git a/backend/src/main/java/com/budwk/app/module/activity/service/ActGroupService.java b/backend/src/main/java/com/budwk/app/module/activity/service/ActGroupService.java index 2ae2559..729ee31 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/service/ActGroupService.java +++ b/backend/src/main/java/com/budwk/app/module/activity/service/ActGroupService.java @@ -3,6 +3,7 @@ package com.budwk.app.module.activity.service; import com.budwk.app.base.service.BaseService; import com.budwk.app.module.activity.models.ActGroup; import com.budwk.app.module.activity.vo.ActGroupVo; +import com.budwk.app.module.activity.vo.ActUnGroupUserVo; /** * @ClassName ActGroupService @@ -14,5 +15,15 @@ import com.budwk.app.module.activity.vo.ActGroupVo; public interface ActGroupService extends BaseService { + /** + * 活动分组 + * @param groupVo + */ void groupSetting(ActGroupVo groupVo); + + /** + * 设置未分组人员 + * @param unGroupUserVo + */ + void unGroupUserSetting(ActUnGroupUserVo unGroupUserVo); } diff --git a/backend/src/main/java/com/budwk/app/module/activity/service/impl/ActGroupServiceImpl.java b/backend/src/main/java/com/budwk/app/module/activity/service/impl/ActGroupServiceImpl.java index 85bf43c..05f7a10 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/service/impl/ActGroupServiceImpl.java +++ b/backend/src/main/java/com/budwk/app/module/activity/service/impl/ActGroupServiceImpl.java @@ -1,22 +1,19 @@ package com.budwk.app.module.activity.service.impl; import com.budwk.app.base.service.impl.BaseServiceImpl; -import com.budwk.app.module.activity.models.ActGroup; -import com.budwk.app.module.activity.models.ActGroupUser; -import com.budwk.app.module.activity.models.ActUnGroupUser; -import com.budwk.app.module.activity.models.ActUser; +import com.budwk.app.module.activity.models.*; import com.budwk.app.module.activity.service.ActGroupService; import com.budwk.app.module.activity.vo.ActGroupVo; +import com.budwk.app.module.activity.vo.ActUnGroupUserVo; import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.IocBean; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -42,6 +39,7 @@ public class ActGroupServiceImpl extends BaseServiceImpl implements Ac dao().clear(ActGroup.class, Cnd.where(ActGroup::getActivityId, "=", groupVo.getActivityId())); dao().clear(ActGroupUser.class, Cnd.where(ActGroupUser::getActivityId, "=", groupVo.getActivityId())); dao().clear(ActUnGroupUser.class, Cnd.where(ActUnGroupUser::getActivityId, "=", groupVo.getActivityId())); + dao().clear(ActItemGroupScore.class, Cnd.where(ActItemGroupScore::getActivityId, "=", groupVo.getActivityId())); // 查询报名了并且已经完成签到的人员 List signUpUserList = dao().query(ActUser.class, Cnd.where(ActUser::getActivityId, "=", groupVo.getActivityId()) @@ -52,7 +50,10 @@ public class ActGroupServiceImpl extends BaseServiceImpl implements Ac int result = Math.floorDiv(size, oneGroupLimitUserNum); // 初始化分组 - List> groups = Collections.nCopies(result, new ArrayList<>()); + List> groups = new ArrayList<>(); + for (int i = 0; i < result; i++) { + groups.add(new ArrayList<>()); + } // 分离男女用户 Map> genderMap = signUpUserList.stream() @@ -90,7 +91,6 @@ public class ActGroupServiceImpl extends BaseServiceImpl implements Ac } } - // 收集未分配的用户 unassignedUsers.addAll(males.subList(maleIndex, males.size())); unassignedUsers.addAll(females.subList(femaleIndex, females.size())); @@ -99,11 +99,12 @@ public class ActGroupServiceImpl extends BaseServiceImpl implements Ac .mapToObj(index -> { ActGroup actGroup = new ActGroup(); actGroup.setActivityId(groupVo.getActivityId()); - actGroup.setGroupName("第" + (index + 1) + "组"); + actGroup.setGroupName("第" + (index + 1) + "队"); + actGroup.setSort(index + 1); List userList = groups.get(index).stream().map(v -> { ActGroupUser user = new ActGroupUser(); - user.setUserId(v.getId()); + user.setUserId(v.getUserId()); user.setActivityId(groupVo.getActivityId()); return user; }).collect(Collectors.toList()); @@ -113,10 +114,25 @@ public class ActGroupServiceImpl extends BaseServiceImpl implements Ac }).toList(); + // 所有项目 + List actItemList = dao().query(ActivityItem.class, Cnd.where(ActivityItem::getActivityId, "=", groupVo.getActivityId())); + // 往项目得分表里面插记录 + List itemGroupScoreList = new ArrayList<>(); + for (ActGroup group : groupList) { dao().insertWith(group, "groupUsers"); - } + // 构建小组项目得分表 + List groupScoreList = actItemList.stream().map(item -> { + ActItemGroupScore itemGroupScore = new ActItemGroupScore(); + itemGroupScore.setActivityId(groupVo.getActivityId()); + itemGroupScore.setItemId(item.getId()); + itemGroupScore.setGroupId(group.getId()); + return itemGroupScore; + }).toList(); + itemGroupScoreList.addAll(groupScoreList); + } + dao().insert(itemGroupScoreList); // 添加未能正确分组的人员 List userList = unassignedUsers.stream().map(v -> { @@ -127,4 +143,71 @@ public class ActGroupServiceImpl extends BaseServiceImpl implements Ac }).toList(); dao().insert(userList); } + + + @Override + @Aop(TransAop.READ_COMMITTED) + public void unGroupUserSetting(ActUnGroupUserVo unGroupUserVo) { + // 查询还没有分组的人员 + List query = dao().query(ActUnGroupUser.class, Cnd.where(ActUnGroupUser::getActivityId, "=", unGroupUserVo.getActivityId())); + Set userIds = query.stream().map(ActUnGroupUser::getUserId).collect(Collectors.toSet()); + // 删除这些人员的分组信息 + dao().clear(ActGroupUser.class, Cnd.where(ActGroupUser::getActivityId, "=", unGroupUserVo.getActivityId()).and(ActGroupUser::getUserId, "in", userIds)); + + if (unGroupUserVo.getIsSeparateGroup() != null && unGroupUserVo.getIsSeparateGroup()) { + // 构建分组用户 + List userList = query.stream().map(v -> { + ActGroupUser user = new ActGroupUser(); + user.setActivityId(unGroupUserVo.getActivityId()); + user.setUserId(v.getUserId()); + if (v.getUserId().equals(unGroupUserVo.getLeaderId())) { + user.setIsLeader(true); + } + return user; + }).toList(); + + // 查询出这个活动下最大的排序 + ActGroup sort = dao().fetch(ActGroup.class, Cnd.NEW().desc("sort")); + + // 单独分组构建 + ActGroup actGroup = new ActGroup(); + actGroup.setActivityId(unGroupUserVo.getActivityId()); + actGroup.setGroupName(unGroupUserVo.getGroupName()); + actGroup.setSort(sort.getSort() + 1); + actGroup.setGroupUsers(userList); + dao().insertWith(actGroup, "groupUsers"); + + // 同时还要往小组得分记录表中查活动项目的数据 + List itemList = dao().query(ActivityItem.class, Cnd.where(ActivityItem::getActivityId, "=", unGroupUserVo.getActivityId())); + // 构建小组项目得分表 + List scoreList = itemList.stream().map(v -> { + ActItemGroupScore itemGroupScore = new ActItemGroupScore(); + itemGroupScore.setActivityId(unGroupUserVo.getActivityId()); + itemGroupScore.setItemId(v.getId()); + itemGroupScore.setGroupId(actGroup.getId()); + return itemGroupScore; + }).toList(); + dao().insert(scoreList); + } else { + // 不单独分组,分配到其他队伍 + List unGroupUser = unGroupUserVo.getUnGroupUser(); + Map map = unGroupUser.stream().collect(Collectors.toMap(ActGroupUser::getUserId, v -> v)); + + List userList = query.stream().map(v -> { + // 要保证传递过来的数据中,不在数据表中存储的这些人员不插入 + ActGroupUser groupUser = map.get(v.getUserId()); + if (groupUser != null) { + groupUser.setUserId(v.getUserId()); + groupUser.setActivityId(unGroupUserVo.getActivityId()); + groupUser.setGroupId(groupUser.getGroupId()); + return groupUser; + } else { + return null; + } + }).filter(Objects::nonNull).toList(); + dao().insert(userList); + } + // 分完之后,删除这个活动下的未分组人员 + dao().clear(ActUnGroupUser.class, Cnd.where(ActUnGroupUser::getActivityId, "=", unGroupUserVo.getActivityId())); + } } diff --git a/backend/src/main/java/com/budwk/app/module/activity/vo/ActUnGroupUserVo.java b/backend/src/main/java/com/budwk/app/module/activity/vo/ActUnGroupUserVo.java new file mode 100644 index 0000000..58c3058 --- /dev/null +++ b/backend/src/main/java/com/budwk/app/module/activity/vo/ActUnGroupUserVo.java @@ -0,0 +1,32 @@ +package com.budwk.app.module.activity.vo; + +import com.budwk.app.module.activity.models.ActGroupUser; +import lombok.Data; + +import java.util.List; + +/** + * @version 1.0 + * @Author zzr + * @name:ActUnGroupUserVo + * @Date 2025/4/30 15:01 + * @注释 :未分组人员 + */ +@Data +public class ActUnGroupUserVo { + + // 活动id + private Long activityId; + + // 是否单独分组 + private Boolean isSeparateGroup; + + // 分组名称 + private String groupName; + + // 领队id + private Long leaderId; + + // 未分组人员 + private List unGroupUser; +} diff --git a/backend/src/main/resources/views/platform/activity/group/groupSetting.js b/backend/src/main/resources/views/platform/activity/group/groupSetting.js index 7d80338..58e7a8f 100644 --- a/backend/src/main/resources/views/platform/activity/group/groupSetting.js +++ b/backend/src/main/resources/views/platform/activity/group/groupSetting.js @@ -35,7 +35,6 @@ const GROUP_SETTING = { - 设-1则标识不限制 @@ -44,6 +43,7 @@ const GROUP_SETTING = { placeholder="请输入女用户限制人数"> + 设置-1,系统会将自动分配,尽可能的保持每队男女运动员数量一致 @@ -92,6 +92,7 @@ const GROUP_SETTING = { this.groupingDialog = false this.$refs.formRef.resetFields() this.$message.success(resp.msg) + this.$emit('success') } else { this.$message.error('操作失败') } diff --git a/backend/src/main/resources/views/platform/activity/group/index.html b/backend/src/main/resources/views/platform/activity/group/index.html index 0f0fa01..c5af97b 100644 --- a/backend/src/main/resources/views/platform/activity/group/index.html +++ b/backend/src/main/resources/views/platform/activity/group/index.html @@ -1,6 +1,17 @@ +
+
+
队伍名称
+
+ +
+
+
+
运动员信息
+
+ +
+
+
+ 搜索 +
- - 开始分组 + + 开始分组 +
+ + 未分组人员 + {{ unGroupUser.length }} + +
+ + + + + + + + + + + + + +
- + + +