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();