From 48f9d35959eeef37166f1e25714c9b2f82e371fb Mon Sep 17 00:00:00 2001 From: zhouhefeng Date: Wed, 30 Apr 2025 15:45:21 +0800 Subject: [PATCH 1/3] commit --- .../controller/ClientGroupController.java | 15 +- .../ActivityItemApplyQueryController.java | 145 ++++++++++++++++++ .../ActivitySignInQueryController.java | 8 +- .../vo/page/ActSignInUserPageForm.java | 2 + .../activity/itemApplyQuery/index.html | 139 +++++++++++++++++ .../activity/signInUserQuery/index.html | 1 - frontend/src/pages/activity/rank/index.vue | 105 +++---------- frontend/src/pages/activity/team/index.vue | 15 +- 8 files changed, 333 insertions(+), 97 deletions(-) create mode 100644 backend/src/main/java/com/budwk/app/module/activity/controller/ActivityItemApplyQueryController.java create mode 100644 backend/src/main/resources/views/platform/activity/itemApplyQuery/index.html diff --git a/backend/src/main/java/com/budwk/app/client/module/activity/controller/ClientGroupController.java b/backend/src/main/java/com/budwk/app/client/module/activity/controller/ClientGroupController.java index 47dd780..fc3b372 100644 --- a/backend/src/main/java/com/budwk/app/client/module/activity/controller/ClientGroupController.java +++ b/backend/src/main/java/com/budwk/app/client/module/activity/controller/ClientGroupController.java @@ -71,6 +71,7 @@ public class ClientGroupController { /** * 查询自己在那个团队 + * * @param activityId * @return */ @@ -79,7 +80,7 @@ public class ClientGroupController { public Result info(Long activityId) { ActGroupUser groupUser = dao.fetch(ActGroupUser.class, Cnd.where(ActGroupUser::getUserId, "=", StpClientUtil.STP.getLoginIdAsLong()) .and(ActGroupUser::getActivityId, "=", activityId)); - if(Lang.isEmpty(groupUser)){ + if (Lang.isEmpty(groupUser)) { return Result.error("您还没加入任何团队"); } Sql sql = Sqls.create("select * from act_group where id=@id").setParam("id", groupUser.getGroupId()); @@ -123,7 +124,7 @@ public class ClientGroupController { @At("/list-team/?") @SaCheckLogin(type = StpClientUtil.TYPE) - public Result listTeam(Long activityId){ + public Result listTeam(Long activityId) { Sql sql = Sqls.create(""" SELECT t1.*, @@ -135,8 +136,16 @@ public class ClientGroupController { t1.activityId = @activityId GROUP BY t1.id - """).setParam("activityId",activityId); + """).setParam("activityId", activityId); List list = clientActivityService.listMap(sql); return Result.success(list); } + + + @At("/list-group-rank/?") + @SaCheckLogin(type = StpClientUtil.TYPE) + public Result listGroupRank(Long activityId) { + List groupList = dao.query(ActGroup.class, Cnd.where(ActGroup::getActivityId, "=", activityId).desc(ActGroup::getTotalScore)); + return Result.success(groupList); + } } diff --git a/backend/src/main/java/com/budwk/app/module/activity/controller/ActivityItemApplyQueryController.java b/backend/src/main/java/com/budwk/app/module/activity/controller/ActivityItemApplyQueryController.java new file mode 100644 index 0000000..54a78ce --- /dev/null +++ b/backend/src/main/java/com/budwk/app/module/activity/controller/ActivityItemApplyQueryController.java @@ -0,0 +1,145 @@ +package com.budwk.app.module.activity.controller; + +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; +import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.result.Result; +import com.budwk.app.module.activity.models.Activity; +import com.budwk.app.module.activity.models.ActivityItem; +import com.budwk.app.module.activity.service.ActivitySignInQueryService; +import com.budwk.app.module.activity.vo.page.ActSignInUserPageForm; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.usermodel.Workbook; +import org.nutz.dao.Cnd; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.dao.util.cri.SqlExpressionGroup; +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 javax.servlet.http.HttpServletResponse; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; + +/** + * @author zhf + * @date 2025/4/30 15:29 + * @description + */ +@IocBean +@At("/platform/activity/itemApplyQuery") +@Slf4j +@Ok("json:full") +public class ActivityItemApplyQueryController { + + @Inject + private ActivitySignInQueryService activitySignInQueryService; + + @At("") + @SaCheckPermission("activity.itemApplyQuery") + @Ok("beetl:/platform/activity/itemApplyQuery/index.html") + public void index() { + } + + @At() + @SaCheckPermission("activity.signInUserQuery") + public Result getActivityOptions(Integer year) { + return Result.success(activitySignInQueryService.dao().query(Activity.class, Cnd.NEW().andEX("YEAR(startTime)", "=", year))); + } + + @At() + @SaCheckPermission("activity.signInUserQuery") + public Result getActivityItemOptions(Long activityId) { + return Result.success(activitySignInQueryService.dao().query(ActivityItem.class, Cnd.where(ActivityItem::getActivityId, "=", activityId))); + } + + + @At() + @SaCheckPermission("activity.signInUserQuery") + public Result pageData(ActSignInUserPageForm pageForm) { + Cnd cnd = Cnd.NEW(); + Sql sql = Sqls.create(""" + SELECT + au.*, + ai.`name` itemName + FROM + act_item_user aiu + LEFT JOIN activity_item ai ON ai.id = aiu.itemId + LEFT JOIN `act_user` au ON aiu.userId = au.userId + $condition + """); + if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { + SqlExpressionGroup group = new SqlExpressionGroup(); + group.or("au.userName", "LIKE", "%" + pageForm.getSearchKeyword() + "%"); + group.or("au.unitName", "LIKE", "%" + pageForm.getSearchKeyword() + "%"); + cnd.and(group); + } + cnd.and("au.activityId", "=", pageForm.getActivityId()); + cnd.andEX("aiu.itemId", "=", pageForm.getItemId()); + cnd.asc("ai.`name`"); + sql.setCondition(cnd); + Pagination pagination = activitySignInQueryService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + return Result.success(pagination); + } + + @At + @Ok("void") + @SaCheckPermission("activity.signInUserQuery") + public void doExport(ActSignInUserPageForm pageForm, HttpServletResponse response) { + try { + Activity activity = activitySignInQueryService.dao().fetch(Activity.class, Cnd.NEW().and("id", "=", pageForm.getActivityId())); + Cnd cnd = Cnd.NEW(); + Sql sql = Sqls.create(""" + SELECT + au.*, + ai.`name` itemName + FROM + act_item_user aiu + LEFT JOIN activity_item ai ON ai.id = aiu.itemId + LEFT JOIN `act_user` au ON aiu.userId = au.userId + $condition + """); + if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { + SqlExpressionGroup group = new SqlExpressionGroup(); + group.or("au.userName", "LIKE", "%" + pageForm.getSearchKeyword() + "%"); + group.or("au.unitName", "LIKE", "%" + pageForm.getSearchKeyword() + "%"); + cnd.and(group); + } + cnd.and("au.activityId", "=", pageForm.getActivityId()); + cnd.andEX("aiu.itemId", "=", pageForm.getItemId()); + cnd.asc("ai.`name`"); + sql.setCondition(cnd); + List nutMaps = activitySignInQueryService.listMap(sql); + List entityList = new ArrayList<>() {{ + add(new ExcelExportEntity("姓名", "userName", 20)); + add(new ExcelExportEntity("性别", "sex", 20)); + add(new ExcelExportEntity("职务", "position", 20)); + add(new ExcelExportEntity("身份证号码", "idCard", 20)); + add(new ExcelExportEntity("联系方式", "mobile", 20)); + add(new ExcelExportEntity("参加单位名称", "unitName", 20)); + add(new ExcelExportEntity("参加项目", "itemName", 20)); + }}; + + response.setContentType("application/octet-stream"); + response.setHeader("Content-Disposition", "attachment;filename=" + new String((activity.getTitle() + "签到数据表.xlsx").getBytes(StandardCharsets.UTF_8), "ISO8859-1")); + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, nutMaps); + workbook.write(response.getOutputStream()); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + + +} diff --git a/backend/src/main/java/com/budwk/app/module/activity/controller/ActivitySignInQueryController.java b/backend/src/main/java/com/budwk/app/module/activity/controller/ActivitySignInQueryController.java index 83d3f3c..5224d63 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/controller/ActivitySignInQueryController.java +++ b/backend/src/main/java/com/budwk/app/module/activity/controller/ActivitySignInQueryController.java @@ -10,6 +10,7 @@ import cn.hutool.core.util.StrUtil; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.result.Result; import com.budwk.app.module.activity.models.Activity; +import com.budwk.app.module.activity.models.ActivityItem; import com.budwk.app.module.activity.service.ActivitySignInQueryService; import com.budwk.app.module.activity.vo.page.ActSignInUserPageForm; import lombok.extern.slf4j.Slf4j; @@ -51,6 +52,12 @@ public class ActivitySignInQueryController { return Result.success(activitySignInQueryService.dao().query(Activity.class, Cnd.NEW().andEX("YEAR(startTime)", "=", year))); } + @At() + @SaCheckPermission("activity.signInUserQuery") + public Result getActivityItemOptions(Long activityId) { + return Result.success(activitySignInQueryService.dao().query(ActivityItem.class, Cnd.where(ActivityItem::getActivityId, "=", activityId))); + } + @At() @SaCheckPermission("activity.signInUserQuery") @@ -107,7 +114,6 @@ public class ActivitySignInQueryController { sql.setCondition(cnd); List nutMaps = activitySignInQueryService.listMap(sql); List entityList = new ArrayList<>() {{ - add(new ExcelExportEntity("报名号", "actUserNo", 20)); add(new ExcelExportEntity("姓名", "userName", 20)); add(new ExcelExportEntity("性别", "sex", 20)); add(new ExcelExportEntity("职务", "position", 20)); diff --git a/backend/src/main/java/com/budwk/app/module/activity/vo/page/ActSignInUserPageForm.java b/backend/src/main/java/com/budwk/app/module/activity/vo/page/ActSignInUserPageForm.java index a87e75d..de7a2a2 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/vo/page/ActSignInUserPageForm.java +++ b/backend/src/main/java/com/budwk/app/module/activity/vo/page/ActSignInUserPageForm.java @@ -15,6 +15,8 @@ public class ActSignInUserPageForm extends PageForm { // 活动ID private Long activityId; + // 项目ID + private Long itemId; // 联系方式 private String phone; diff --git a/backend/src/main/resources/views/platform/activity/itemApplyQuery/index.html b/backend/src/main/resources/views/platform/activity/itemApplyQuery/index.html new file mode 100644 index 0000000..36ecb29 --- /dev/null +++ b/backend/src/main/resources/views/platform/activity/itemApplyQuery/index.html @@ -0,0 +1,139 @@ + + +
+ + + + + + + 导出 + + + + + + + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/backend/src/main/resources/views/platform/activity/signInUserQuery/index.html b/backend/src/main/resources/views/platform/activity/signInUserQuery/index.html index e7a1345..e02fa45 100644 --- a/backend/src/main/resources/views/platform/activity/signInUserQuery/index.html +++ b/backend/src/main/resources/views/platform/activity/signInUserQuery/index.html @@ -55,7 +55,6 @@ layout("/layouts/platform_1.html"){ {{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} - diff --git a/frontend/src/pages/activity/rank/index.vue b/frontend/src/pages/activity/rank/index.vue index 5e9c53d..a8d863c 100644 --- a/frontend/src/pages/activity/rank/index.vue +++ b/frontend/src/pages/activity/rank/index.vue @@ -36,17 +36,17 @@ - + - {{ team.teamName }} + {{ team.groupName }} 我的队伍 @@ -55,7 +55,7 @@ - {{ team.score }} + {{ team.totalScore }} @@ -78,98 +78,25 @@ import { ref, onMounted } from 'vue'; import { Toast } from 'tdesign-mobile-vue'; import { useRequest } from "@/utils/request"; +import {onLoad} from "@dcloudio/uni-app"; // 排行榜数据 const rankList = ref([]); +const activityId = ref([]); const loading = ref(false); const refresherTriggered = ref(false); -const generateMockData = () => { - const teams = [ - { - id: '1', - teamName: '闪电队', - score: 98, - avatar: 'https://tdesign.gtimg.com/mobile/demos/avatar_1.png', - isMyTeam: true - }, - { - id: '2', - teamName: '飞鹰战队', - score: 96, - avatar: 'https://tdesign.gtimg.com/mobile/demos/avatar_2.png', - isMyTeam: false - }, - { - id: '3', - teamName: '猎豹小组', - score: 90, - avatar: 'https://tdesign.gtimg.com/mobile/demos/avatar_3.png', - isMyTeam: false - }, - { - id: '4', - teamName: '雄狮战队', - score: 85, - avatar: 'https://tdesign.gtimg.com/mobile/demos/avatar_4.png', - isMyTeam: false - }, - { - id: '5', - teamName: '飓风俱乐部', - score: 80, - avatar: 'https://tdesign.gtimg.com/mobile/demos/avatar_5.png', - isMyTeam: false - }, - { - id: '6', - teamName: '钢铁战士', - score: 78, - avatar: 'https://tdesign.gtimg.com/mobile/demos/avatar_1.png', - isMyTeam: false - }, - { - id: '7', - teamName: '赤焰战队', - score: 75, - avatar: 'https://tdesign.gtimg.com/mobile/demos/avatar_2.png', - isMyTeam: false - }, - { - id: '8', - teamName: '金龙小组', - score: 68, - avatar: 'https://tdesign.gtimg.com/mobile/demos/avatar_3.png', - isMyTeam: false - }, - { - id: '9', - teamName: '星辰队', - score: 65, - avatar: 'https://tdesign.gtimg.com/mobile/demos/avatar_4.png', - isMyTeam: false - }, - { - id: '10', - teamName: '黑豹战队', - score: 62, - avatar: 'https://tdesign.gtimg.com/mobile/demos/avatar_5.png', - isMyTeam: false - } - ]; - - // 按分数排序 - return teams.sort((a, b) => b.score - a.score); -}; - // 获取排行榜数据 const getRankData = async () => { loading.value = true; - - // 模拟API请求延迟 - await new Promise(resolve => setTimeout(resolve, 1000)); try { - rankList.value = generateMockData(); + const {code,data, msg} = await useRequest().post('/client/group/list-group-rank/' + activityId.value); + if (code === 0) { + rankList.value = data; + } else { + Toast({message: msg, theme: 'error'}); + } + } catch (error) { console.error('获取排行榜数据失败', error); Toast({ message: '获取排行榜数据失败', theme: 'error' }); @@ -193,7 +120,11 @@ const handleRefresh = () => { refresherTriggered.value = true; getRankData(); }; - +onLoad((option) => { + if (option.id) { + activityId.value=option.id + } +}); // 页面加载时获取数据 onMounted(() => { getRankData(); diff --git a/frontend/src/pages/activity/team/index.vue b/frontend/src/pages/activity/team/index.vue index c687df3..745b0f7 100644 --- a/frontend/src/pages/activity/team/index.vue +++ b/frontend/src/pages/activity/team/index.vue @@ -25,16 +25,16 @@
-
{{ team.groupUsers?.length }}
-
成员
+
成员:{{ team.groupUsers?.length }}
+
-
+
-
{{ team.totalRank ? team.totalRank : '--' }}
-
排名
+
排名:{{ team.totalRank ? team.totalRank : '--' }}
+
点击查看排行榜
@@ -240,6 +240,11 @@ const getListAct = async () => { }; +// 点击查看成绩排名 +const queryRank=()=>{ + uni.navigateTo({url: '/pages/activity/rank/index?id=' + pageForm.actId}) +} + // 初始化 onLoad(() => { getListAct(); From e68d0b359d829d7314988fd553757c850efa8d10 Mon Sep 17 00:00:00 2001 From: Paidax Date: Wed, 30 Apr 2025 16:48:04 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E7=BB=84=E9=98=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ActGroupController.java | 88 ++++++++++- .../activity/service/ActGroupService.java | 11 ++ .../service/impl/ActGroupServiceImpl.java | 109 ++++++++++++-- .../module/activity/vo/ActUnGroupUserVo.java | 32 ++++ .../platform/activity/group/groupSetting.js | 3 +- .../views/platform/activity/group/index.html | 139 +++++++++++++++++- .../platform/activity/group/unGroupUser.js | 117 +++++++++++++++ .../views/platform/activity/user/index.html | 2 +- 8 files changed, 477 insertions(+), 24 deletions(-) create mode 100644 backend/src/main/java/com/budwk/app/module/activity/vo/ActUnGroupUserVo.java create mode 100644 backend/src/main/resources/views/platform/activity/group/unGroupUser.js 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 }} + +
+ + + + + + + + + + + + + +
- + + +