From 593d76a26703d33087dbe12b2c7f63588034cc42 Mon Sep 17 00:00:00 2001 From: zhouhefeng Date: Fri, 31 Oct 2025 11:04:51 +0800 Subject: [PATCH] commit --- .../family/models/FamilyActivity.java | 10 + .../fellowship/models/FellowshipActivity.java | 10 + .../ActivityStatisticsController.java | 243 ++++++++++++++++++ .../models/TrainSignUpActivity.java | 10 + .../models/Activity_works_collection.java | 10 + .../activity/culture/common/applyActivity.js | 2 +- .../activity/fellowship/manage/basicForm.js | 133 +++++++--- .../zhgh/activity/statistics/index.html | 167 ++++++++++++ .../activity/trainSignUp/manage/basicForm.js | 46 +++- .../workscollection/manage/index.html | 50 +++- 10 files changed, 646 insertions(+), 35 deletions(-) create mode 100644 src/main/java/com/budwk/app/zhgh/activity/statistics/ActivityStatisticsController.java create mode 100644 src/main/resources/views/platform/zhgh/activity/statistics/index.html diff --git a/src/main/java/com/budwk/app/zhgh/activity/family/models/FamilyActivity.java b/src/main/java/com/budwk/app/zhgh/activity/family/models/FamilyActivity.java index baf4c40c..017b7240 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/family/models/FamilyActivity.java +++ b/src/main/java/com/budwk/app/zhgh/activity/family/models/FamilyActivity.java @@ -132,6 +132,16 @@ public class FamilyActivity extends BaseModel implements Serializable, SysHomeCo @ColDefine(type = ColType.VARCHAR, width = 50) private String onlyKey; + @Column + @Comment("主办单位") + @ColDefine(type = ColType.MYSQL_JSON) + private List hostUnitIds; + + @Column + @Comment("承办单位") + @ColDefine(type = ColType.MYSQL_JSON) + private List undertakeUnitIds; + @Override public Sys_home_activity covertToSysHomeActivity() { Sys_home_activity sysHomeActivity = new Sys_home_activity(); diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipActivity.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipActivity.java index 9dfaa16a..e007311b 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipActivity.java +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipActivity.java @@ -114,6 +114,16 @@ public class FellowshipActivity extends BaseModel implements Serializable, SysHo @ColDefine(type = ColType.VARCHAR, width = 20) private String trainType; + @Column + @Comment("主办单位") + @ColDefine(type = ColType.MYSQL_JSON) + private List hostUnitIds; + + @Column + @Comment("承办单位") + @ColDefine(type = ColType.MYSQL_JSON) + private List undertakeUnitIds; + @Override public Sys_home_activity covertToSysHomeActivity() { Sys_home_activity sysHomeActivity = new Sys_home_activity(); diff --git a/src/main/java/com/budwk/app/zhgh/activity/statistics/ActivityStatisticsController.java b/src/main/java/com/budwk/app/zhgh/activity/statistics/ActivityStatisticsController.java new file mode 100644 index 00000000..87a7724b --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/statistics/ActivityStatisticsController.java @@ -0,0 +1,243 @@ +package com.budwk.app.zhgh.activity.statistics; + +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.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.result.Result; +import com.budwk.app.base.utils.CommonDownloadUtil; +import com.budwk.app.sys.models.Sys_unit; +import com.budwk.app.zhgh.activity.culture.models.ActivityTissue; +import com.budwk.app.zhgh.activity.family.models.FamilyActivity; +import com.budwk.app.zhgh.activity.fellowship.models.FellowshipActivity; +import com.budwk.app.zhgh.activity.sports.models.ActivitySchool; +import com.budwk.app.zhgh.activity.trainSignUp.models.TrainSignUpActivity; +import com.budwk.app.zhgh.activity.workscollection.models.Activity_works_collection; +import com.budwk.app.zhgh.club.model.SysClub; +import io.swagger.annotations.ApiOperation; +import org.apache.poi.ss.usermodel.Workbook; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.util.cri.Static; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; +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.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author zhf + * @date 2025/10/30 14:32 + * @description 系统活动统计 + */ +@IocBean +@Ok("json:full") +@At("/platform/activity/statistics") +public class ActivityStatisticsController { + + + @Inject + private Dao dao; + + @At("") + @Ok("beetl:platform/zhgh/activity/statistics/index.html") + @SaCheckPermission("activity.statistics") + public void index() { + } + + @At + @SaCheckPermission("activity.statistics") + @ApiOperation("每个活动统计图") + public Result getChartData(Integer year, String undertakeUnitId, String hostUnitId) { + List activityTypeList = this.getData(year, undertakeUnitId, hostUnitId); + return Result.success(activityTypeList); + } + + + @At + @Ok("void") + @SaCheckPermission("activity.statistics") + @ApiOperation("导出全部的活动") + public void doExport(Integer year, String undertakeUnitId, String hostUnitId, HttpServletResponse response) { + List activityTypeList = this.getData(year, undertakeUnitId, hostUnitId); + + + List unitList = dao.query(Sys_unit.class, Cnd.NEW()); + List clubList = dao.query(SysClub.class, Cnd.NEW()); + + clubList.forEach(club -> { + Sys_unit unit = new Sys_unit(); + unit.setId(club.getId()); + unit.setName(club.getClubName()); + unitList.add(unit); + }); + + + List activityList = new ArrayList<>(); + for (NutMap nutMap : activityTypeList) { + List asList = nutMap.getAsList("activityList", NutMap.class); + + if (nutMap.getString("activityType").equals("sports")) { + if (Lang.isNotEmpty(asList)) { + for (NutMap map : asList) { + map.setv("activityName", map.getString("name")); + map.setv("activityTypeName", nutMap.getString("activityTypeName")); + List hostUnitIds = map.getAsList("unitSponsor", String.class); + List undertakeUnitIds = map.getAsList("undertakeUnit", String.class); + String hostUnitNames = getUnitNames(hostUnitIds, unitList); + String undertakeUnitNames = getUnitNames(undertakeUnitIds, unitList); + map.setv("hostUnitNames", hostUnitNames); + map.setv("undertakeUnitNames", undertakeUnitNames); + } + } + } else { + if (Lang.isNotEmpty(asList)) { + for (NutMap map : asList) { + map.setv("activityTypeName", nutMap.getString("activityTypeName")); + List hostUnitIds = map.getAsList("hostUnitIds", String.class); + List undertakeUnitIds = map.getAsList("undertakeUnitIds", String.class); + if (Lang.isNotEmpty(hostUnitIds)) { + String hostUnitNames = getUnitNames(hostUnitIds, unitList); + map.setv("hostUnitNames", hostUnitNames); + } + if (Lang.isNotEmpty(undertakeUnitIds)) { + String undertakeUnitNames = getUnitNames(undertakeUnitIds, unitList); + map.setv("undertakeUnitNames", undertakeUnitNames); + } + + if (nutMap.getString("activityType").equals("culture")) { + map.setv("activityName", map.getString("name")); + } else if (nutMap.getString("activityType").equals("trainSignUp")) { + map.setv("startTime", DateUtil.format(map.getTime("activityStartTime"), "yyyy-MM-dd")); + map.setv("endTime", DateUtil.format(map.getTime("activityEndTime"), "yyyy-MM-dd")); + }else if (nutMap.getString("activityType").equals("worksCollection")){ + map.setv("activityName", map.getString("name")); + map.setv("startTime", DateUtil.format(map.getTime("startDateTime"), "yyyy-MM-dd")); + map.setv("endTime", DateUtil.format(map.getTime("endDateTime"), "yyyy-MM-dd")); + }else if (nutMap.getString("activityType").equals("family")){ + map.setv("startTime", DateUtil.format(map.getTime("activityStartTime"), "yyyy-MM-dd")); + map.setv("endTime", DateUtil.format(map.getTime("activityEndTime"), "yyyy-MM-dd")); + }else if (nutMap.getString("activityType").equals("fellowship")){ + map.setv("startTime", DateUtil.format(map.getTime("activityStartTime"), "yyyy-MM-dd")); + map.setv("endTime", DateUtil.format(map.getTime("activityEndTime"), "yyyy-MM-dd")); + } + } + } + } + if (Lang.isNotEmpty(asList)) { + activityList.addAll(asList); + } + } + try { + + List entityList = new ArrayList<>(); + ExcelExportEntity no = new ExcelExportEntity("序号", "no", 10); + no.setFormat("isAddIndex"); + entityList.add(no); + entityList.add(new ExcelExportEntity("活动类型", "activityTypeName", 20)); + entityList.add(new ExcelExportEntity("活动名称", "activityName", 40)); + entityList.add(new ExcelExportEntity("活动开始时间", "startTime", 40)); + entityList.add(new ExcelExportEntity("活动结束时间", "endTime", 40)); + entityList.add(new ExcelExportEntity("主办单位", "hostUnitNames", 40)); + entityList.add(new ExcelExportEntity("承办单位", "undertakeUnitNames", 40)); + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, activityList); + CommonDownloadUtil.download("活动汇总.xlsx", workbook, response); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + + public List getData(Integer year, String undertakeUnitId, String hostUnitId) { + List activityTypeList = new ArrayList<>(); + activityTypeList.add(NutMap.NEW().setv("activityType", "sports").setv("activityTypeName", "体育活动")); + activityTypeList.add(NutMap.NEW().setv("activityType", "culture").setv("activityTypeName", "文化活动")); + activityTypeList.add(NutMap.NEW().setv("activityType", "trainSignUp").setv("activityTypeName", "品牌活动")); + activityTypeList.add(NutMap.NEW().setv("activityType", "worksCollection").setv("activityTypeName", "作品征集")); + activityTypeList.add(NutMap.NEW().setv("activityType", "family").setv("activityTypeName", "亲子活动")); + activityTypeList.add(NutMap.NEW().setv("activityType", "fellowship").setv("activityTypeName", "单身联谊")); + + for (NutMap map : activityTypeList) { + Cnd cnd = Cnd.NEW(); + if (map.getString("activityType").equals("sports")) { + cnd.andEX("YEAR(startTime)", "=", year); + if (StrUtil.isNotBlank(undertakeUnitId)) { + cnd.and(new Static("JSON_CONTAINS(undertakeUnit, JSON_ARRAY('%s'))".formatted(undertakeUnitId))); + } + if (StrUtil.isNotBlank(hostUnitId)) { + cnd.and(new Static("JSON_CONTAINS(unitSponsor, JSON_ARRAY('%s'))".formatted(hostUnitId))); + } + cnd.asc("startTime"); + List activityList = dao.query(ActivitySchool.class, cnd); + map.setv("count", activityList.size()); + map.setv("activityList", activityList); + } else { + if (StrUtil.isNotBlank(undertakeUnitId)) { + cnd.and(new Static("JSON_CONTAINS(undertakeUnitIds, JSON_ARRAY('%s'))".formatted(undertakeUnitId))); + } + if (StrUtil.isNotBlank(hostUnitId)) { + cnd.and(new Static("JSON_CONTAINS(hostUnitIds, JSON_ARRAY('%s'))".formatted(hostUnitId))); + } + if (map.getString("activityType").equals("culture")) { + cnd.andEX("YEAR(startTime)", "=", year); + cnd.asc("startTime"); + List activityList = dao.query(ActivityTissue.class, cnd); + map.setv("count", activityList.size()); + map.setv("activityList", activityList); + + } else if (map.getString("activityType").equals("trainSignUp")) { + cnd.andEX("year", "=", year); + cnd.asc("activitySignUpStartTime"); + List activityList = dao.query(TrainSignUpActivity.class, cnd); + map.setv("count", activityList.size()); + map.setv("activityList", activityList); + + } else if (map.getString("activityType").equals("worksCollection")) { + cnd.andEX("YEAR(startDateTime)", "=", year); + cnd.asc("startDateTime"); + List activityList = dao.query(Activity_works_collection.class, cnd); + map.setv("count", activityList.size()); + map.setv("activityList", activityList); + + } else if (map.getString("activityType").equals("family")) { + cnd.andEX("year", "=", year); + cnd.asc("activitySignUpStartTime"); + List activityList = dao.query(FamilyActivity.class, cnd); + map.setv("count", activityList.size()); + map.setv("activityList", activityList); + + } else if (map.getString("activityType").equals("fellowship")) { + cnd.andEX("year", "=", year); + cnd.asc("activitySignUpStartTime"); + List activityList = dao.query(FellowshipActivity.class, cnd); + map.setv("count", activityList.size()); + map.setv("activityList", activityList); + } + } + } + return activityTypeList; + } + + + private String getUnitNames(List unitIds, List units) { + String unitNames = units.stream() + .filter(unit -> unitIds.contains(unit.getId())) // 筛选 id 为 '111' 或 '222' 的对象 + .map(unit -> unit.getName()) // 获取 name 属性 + .collect(Collectors.joining(",")); // 用逗号连接,你可以根据需要更改分隔符 + return unitNames; + } + + +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/models/TrainSignUpActivity.java b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/models/TrainSignUpActivity.java index 536c1d49..c96e1b25 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/models/TrainSignUpActivity.java +++ b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/models/TrainSignUpActivity.java @@ -100,6 +100,16 @@ public class TrainSignUpActivity extends BaseModel implements Serializable, SysH @ColDefine(type = ColType.VARCHAR, width = 40) private String activityGroupName; + @Column + @Comment("主办单位") + @ColDefine(type = ColType.MYSQL_JSON) + private List hostUnitIds; + + @Column + @Comment("承办单位") + @ColDefine(type = ColType.MYSQL_JSON) + private List undertakeUnitIds; + /** * 所有的培训班 */ diff --git a/src/main/java/com/budwk/app/zhgh/activity/workscollection/models/Activity_works_collection.java b/src/main/java/com/budwk/app/zhgh/activity/workscollection/models/Activity_works_collection.java index 3bc0f3f6..28d85ca0 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/workscollection/models/Activity_works_collection.java +++ b/src/main/java/com/budwk/app/zhgh/activity/workscollection/models/Activity_works_collection.java @@ -107,6 +107,16 @@ public class Activity_works_collection extends BaseModel { @Default(value = "1") private Boolean isSubmit; + @Column + @Comment("主办单位") + @ColDefine(type = ColType.MYSQL_JSON) + private List hostUnitIds; + + @Column + @Comment("承办单位") + @ColDefine(type = ColType.MYSQL_JSON) + private List undertakeUnitIds; + @Many(field = "activityId") private List subjectTypes; diff --git a/src/main/resources/views/platform/zhgh/activity/culture/common/applyActivity.js b/src/main/resources/views/platform/zhgh/activity/culture/common/applyActivity.js index afff3ae0..bee48a3d 100644 --- a/src/main/resources/views/platform/zhgh/activity/culture/common/applyActivity.js +++ b/src/main/resources/views/platform/zhgh/activity/culture/common/applyActivity.js @@ -181,7 +181,7 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = { - - + + - - + + @@ -39,7 +43,8 @@ const basicForm = { - + - + - +
@@ -89,23 +95,58 @@ const basicForm = {
- 设置 + + 设置 +
- - - + + + + + + + + + + + + + + + + + + +
- + - +
-
+
{{trainType + '信息(温馨提示:如不需要人数限制,下方人数框填写0或者不填)'}}
添加{{ trainType }} @@ -158,14 +200,17 @@ const basicForm = { @@ -206,20 +251,23 @@ const basicForm = { @@ -231,14 +279,19 @@ const basicForm = { @@ -250,16 +303,20 @@ const basicForm = { 按活动限制
-
注:无限制指对报名的个数不做任何限制
+
+ 注:无限制指对报名的个数不做任何限制 +
- 设置报名限制 + 设置报名限制 + 注:按类型限制指对每个类型下的个数进行限制
- + 注:按活动限制指只能报{{formData.limitNum}}个,不与类型关联
@@ -292,12 +349,12 @@ const basicForm = { - - +
@@ -331,6 +388,9 @@ const basicForm = { }, campusList: [], courseTypeList: [], + + unitOptions: [], + clubOptions: [], } }, components: { @@ -537,6 +597,8 @@ const basicForm = { } cloneData.typeLimits = JSON.stringify(this.formData.typeLimits) cloneData.courseList = JSON.stringify(cloneData.courseList) + cloneData.undertakeUnitIds = JSON.stringify(cloneData.undertakeUnitIds) + cloneData.hostUnitIds = JSON.stringify(cloneData.hostUnitIds) const confirm = await this.$confirm("您确定要" + type + "吗?", "提示", { confirmButtonText: "确定", cancelButtonText: "取消", @@ -566,11 +628,22 @@ const basicForm = { } } }, + async getClubsByRole() { + const resp = await this.$axios.post("/platform/club/examine/apply/getClubsByRole") + return resp.data + }, async initData(row) { this.activityGroupList = await this.getActivityGroup() this.historicalActList = await this.getHistoricalActList() this.courseTypeList = await this.getAllType() await this.init(row) + + this.clubOptions = await this.getClubsByRole() + this.clubOptions.map((v) => { + v.name = v.clubName + }) + const units = await this.$businessTool.listUnit() + this.unitOptions = this.clubOptions.concat(units) }, }, watch: { diff --git a/src/main/resources/views/platform/zhgh/activity/statistics/index.html b/src/main/resources/views/platform/zhgh/activity/statistics/index.html new file mode 100644 index 00000000..19383e35 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/statistics/index.html @@ -0,0 +1,167 @@ + + +
+ + + +
+ + + + + + diff --git a/src/main/resources/views/platform/zhgh/activity/trainSignUp/manage/basicForm.js b/src/main/resources/views/platform/zhgh/activity/trainSignUp/manage/basicForm.js index 85e90918..27bda27e 100644 --- a/src/main/resources/views/platform/zhgh/activity/trainSignUp/manage/basicForm.js +++ b/src/main/resources/views/platform/zhgh/activity/trainSignUp/manage/basicForm.js @@ -67,7 +67,7 @@ const basicForm = { - +
@@ -101,6 +101,34 @@ const basicForm = { + + + + + + + + + + + + + + + + @@ -331,6 +359,9 @@ const basicForm = { }, campusList: [], courseTypeList: [], + + unitOptions: [], + clubOptions: [], } }, components: { @@ -537,6 +568,8 @@ const basicForm = { } cloneData.typeLimits = JSON.stringify(this.formData.typeLimits) cloneData.courseList = JSON.stringify(cloneData.courseList) + cloneData.undertakeUnitIds = JSON.stringify(cloneData.undertakeUnitIds) + cloneData.hostUnitIds = JSON.stringify(cloneData.hostUnitIds) const confirm = await this.$confirm("您确定要" + type + "吗?", "提示", { confirmButtonText: "确定", cancelButtonText: "取消", @@ -566,11 +599,22 @@ const basicForm = { } } }, + async getClubsByRole() { + const resp = await this.$axios.post("/platform/club/examine/apply/getClubsByRole") + return resp.data + }, async initData(row) { this.activityGroupList = await this.getActivityGroup() this.historicalActList = await this.getHistoricalActList() this.courseTypeList = await this.getAllType() await this.init(row) + + this.clubOptions = await this.getClubsByRole() + this.clubOptions.map((v) => { + v.name = v.clubName + }) + const units = await this.$businessTool.listUnit() + this.unitOptions = this.clubOptions.concat(units) }, }, watch: { diff --git a/src/main/resources/views/platform/zhgh/activity/workscollection/manage/index.html b/src/main/resources/views/platform/zhgh/activity/workscollection/manage/index.html index c540f210..d344888c 100644 --- a/src/main/resources/views/platform/zhgh/activity/workscollection/manage/index.html +++ b/src/main/resources/views/platform/zhgh/activity/workscollection/manage/index.html @@ -170,6 +170,37 @@ layout("/layouts/platform.html"){
+ + + + + + + + + + + + + + + + + + + @@ -328,7 +359,10 @@ layout("/layouts/platform.html"){ colorList: ["#081776", "#31cab1", "#e54242", "#ff8939", "#ffb712", "#1dc47b", "#4495f7", "#ff5e8b", "#5d6e7f"], pageForm: { activityTime: [] - } + }, + + unitOptions: [], + clubOptions: [], } }, components: { @@ -499,12 +533,22 @@ layout("/layouts/platform.html"){ loading.close() }) }) - } - + }, + async getClubsByRole() { + const resp = await this.$axios.post("/platform/club/examine/apply/getClubsByRole") + return resp.data + }, }, async created() { this.activityGroupList = await this.getActivityGroup() this.pageData() + + this.clubOptions = await this.getClubsByRole() + this.clubOptions.map((v) => { + v.name = v.clubName + }) + const units = await this.$businessTool.listUnit() + this.unitOptions = this.clubOptions.concat(units) } })