From 7c34e41f7e20a520662a145f935899dae44447ae Mon Sep 17 00:00:00 2001 From: zhangrui Date: Mon, 7 Sep 2026 10:04:35 +0800 Subject: [PATCH] changes --- .idea/.gitignore | 10 + .idea/UniappTool.xml | 10 + .idea/compiler.xml | 18 + .idea/encodings.xml | 7 + .idea/git_toolbox_prj.xml | 15 + .idea/hmc_gbhd.iml | 9 + .idea/inspectionProfiles/Project_Default.xml | 68 ++ .idea/jarRepositories.xml | 30 + .idea/misc.xml | 14 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + backend/pom.xml | 2 +- .../auth/service/ClientAuthService.java | 8 +- .../auth/service/ClientAuthServiceImpl.java | 36 +- .../client/auth/vo/ClientRegisterBody.java | 3 + .../controller/ClientActivityController.java | 72 +- .../service/ClientActivityService.java | 24 + .../impl/ClientActivityServiceImpl.java | 228 +++++- .../controller/ActScoreEnterController.java | 6 +- .../controller/ActScoreEntryController.java | 6 +- .../controller/ActUserController.java | 25 +- .../ActWonderfulMomentController.java | 17 +- .../ActivityItemApplyQueryController.java | 5 +- .../controller/ActivityManageController.java | 78 +- .../ActivitySignInQueryController.java | 23 +- .../enums/RegistrationFieldDefinition.java | 68 ++ .../activity/models/ActRegistrationField.java | 52 ++ .../app/module/activity/models/ActUser.java | 10 + .../activity/models/ActWonderfulMoment.java | 4 + .../app/module/activity/models/Activity.java | 6 + .../module/activity/models/ActivityItem.java | 10 + .../service/ActWonderfulMomentService.java | 26 + .../service/ActivityManageService.java | 38 + .../ActivityRegistrationFieldService.java | 96 +++ .../service/impl/ActUserServiceImpl.java | 10 +- .../impl/ActWonderfulMomentServiceImpl.java | 44 ++ .../impl/ActivityManageServiceImpl.java | 173 +++++ .../ActivityRegistrationFieldServiceImpl.java | 574 ++++++++++++++ .../sys/services/impl/SysUserServiceImpl.java | 2 +- .../open/OpenCommonController.java | 15 + .../open/file/UploadController.java | 13 +- backend/src/main/resources/application.yaml | 4 +- .../components/plugins/imageUpload/index.vue | 4 +- .../views/platform/activity/manage/index.html | 57 +- .../platform/activity/manage/itemForm.js | 160 +++- .../manage/registrationFieldSetting.js | 233 ++++++ .../activity/signInUserQuery/index.html | 72 +- .../views/platform/activity/user/index.html | 144 +++- .../activity/wonderfulMoment/addOrUpdate.js | 17 + .../activity/wonderfulMoment/index.html | 17 +- .../src/test/java/com/budwk/app/Test1.java | 13 + frontend/src/pages.json | 4 +- frontend/src/pages/activity/list/index.vue | 21 +- .../activity/registration-form/index.vue | 707 ++++++++++++++---- .../pages/activity/wonderfulMoment/index.vue | 3 +- frontend/src/pages/index/index.vue | 49 +- frontend/src/pages/login/index.vue | 115 +-- frontend/src/pages/login/register.vue | 78 +- frontend/src/pages/profile/act.vue | 10 +- frontend/src/static/img/index4.png | Bin 137135 -> 129928 bytes frontend/src/utils/config.js | 5 +- frontend/src/utils/popupHistory.js | 100 +++ frontend/vite.config.js | 4 +- 63 files changed, 3392 insertions(+), 294 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/UniappTool.xml create mode 100644 .idea/compiler.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/git_toolbox_prj.xml create mode 100644 .idea/hmc_gbhd.iml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 backend/src/main/java/com/budwk/app/module/activity/enums/RegistrationFieldDefinition.java create mode 100644 backend/src/main/java/com/budwk/app/module/activity/models/ActRegistrationField.java create mode 100644 backend/src/main/java/com/budwk/app/module/activity/service/ActivityRegistrationFieldService.java create mode 100644 backend/src/main/java/com/budwk/app/module/activity/service/impl/ActivityRegistrationFieldServiceImpl.java create mode 100644 backend/src/main/resources/views/platform/activity/manage/registrationFieldSetting.js create mode 100644 frontend/src/utils/popupHistory.js diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..7bc07ec --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Environment-dependent path to Maven home directory +/mavenHomeManager.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/UniappTool.xml b/.idea/UniappTool.xml new file mode 100644 index 0000000..f7328e8 --- /dev/null +++ b/.idea/UniappTool.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..fe58613 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..0738741 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/git_toolbox_prj.xml b/.idea/git_toolbox_prj.xml new file mode 100644 index 0000000..02b915b --- /dev/null +++ b/.idea/git_toolbox_prj.xml @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/hmc_gbhd.iml b/.idea/hmc_gbhd.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/.idea/hmc_gbhd.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..ee9f695 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,68 @@ + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..cb1a291 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..eb061bc --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..62ed8cb --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/backend/pom.xml b/backend/pom.xml index fcf92e0..63ed7b3 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -23,7 +23,7 @@ 2.5.1 4.1.1 4.0.11 - 1.18.18 + 1.18.22 UTF-8 diff --git a/backend/src/main/java/com/budwk/app/client/auth/service/ClientAuthService.java b/backend/src/main/java/com/budwk/app/client/auth/service/ClientAuthService.java index 67ac60a..8c65450 100644 --- a/backend/src/main/java/com/budwk/app/client/auth/service/ClientAuthService.java +++ b/backend/src/main/java/com/budwk/app/client/auth/service/ClientAuthService.java @@ -13,9 +13,11 @@ public interface ClientAuthService { String doLogin(ClientLoginBody loginBody); /** - * 注册 - * @param registerBody 注册信息 - * @return token + * 注册手机端用户,并在所选单位尚无简称时完成首次简称登记。 + * + * @param registerBody 注册信息;userName为姓名、phone为手机号、sex为性别、unitId为单位ID、 + * unitAliasName为单位简称、smsCode为短信验证码 + * @return 注册成功后的客户端登录token字符串 */ String doRegister(ClientRegisterBody registerBody); } diff --git a/backend/src/main/java/com/budwk/app/client/auth/service/ClientAuthServiceImpl.java b/backend/src/main/java/com/budwk/app/client/auth/service/ClientAuthServiceImpl.java index 0254325..b3e1863 100644 --- a/backend/src/main/java/com/budwk/app/client/auth/service/ClientAuthServiceImpl.java +++ b/backend/src/main/java/com/budwk/app/client/auth/service/ClientAuthServiceImpl.java @@ -8,10 +8,15 @@ import com.budwk.app.base.utils.PwdUtil; import com.budwk.app.client.auth.vo.ClientLoginBody; import com.budwk.app.client.auth.models.Client_user; import com.budwk.app.client.auth.vo.ClientRegisterBody; +import com.budwk.app.sys.models.Sys_unit; +import com.budwk.app.sys.services.SysUnitService; import com.budwk.app.web.commons.auth.satoken.StpClientUtil; import com.budwk.app.web.commons.auth.service.ValidateService; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.dao.Chain; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; +import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.Strings; @@ -25,6 +30,8 @@ public class ClientAuthServiceImpl implements ClientAuthService { private Dao dao; @Inject private ValidateService validateService; + @Inject + private SysUnitService sysUnitService; @Override public String doLogin(ClientLoginBody loginBody) { @@ -45,7 +52,8 @@ public class ClientAuthServiceImpl implements ClientAuthService { } if (loginBody.getLoginMethod().equals("sms")) { - validateService.checkSMSCode(loginBody.getPhone(), loginBody.getSmsCode()); + // 测试阶段允许已注册手机号直接登录;恢复正式登录时必须重新启用短信验证码校验。 +// validateService.checkSMSCode(loginBody.getPhone(), loginBody.getSmsCode()); } if (loginBody.getLoginMethod().equals("password")) { @@ -61,14 +69,40 @@ public class ClientAuthServiceImpl implements ClientAuthService { } @Override + @Aop(TransAop.READ_COMMITTED) public String doRegister(ClientRegisterBody registerBody) { int count = dao.count(Client_user.class, Cnd.where(Client_user::getPhone, "=", registerBody.getPhone())); if (count > 0) { throw new BaseException("手机号码已注册,请直接登录"); } + // unitId必须对应启用且未删除的单位;unitAliasName为首次登记的单位公共简称。 + Sys_unit unit = sysUnitService.fetch(Cnd.where(Sys_unit::getId, "=", registerBody.getUnitId()) + .and(Sys_unit::getIsEnable, "=", true) + .and(Sys_unit::getDelFlag, "=", false)); + if (unit == null) { + throw new BaseException("请选择有效单位"); + } + String unitAliasName = Strings.sNull(registerBody.getUnitAliasName()).trim(); + if (Strings.isBlank(unitAliasName)) { + throw new BaseException("请输入单位简称"); + } + if (unitAliasName.length() > 100) { + throw new BaseException("单位简称长度不能超过100个字符"); + } + validateService.checkSMSCode(registerBody.getPhone(), registerBody.getSmsCode()); + // 只允许首次登记简称;并发注册时通过数据库条件保证已有简称不会被后续请求覆盖。 + if (Strings.isBlank(unit.getAliasName())) { + Cnd aliasEmptyCnd = Cnd.where(Sys_unit::getId, "=", unit.getId()) + .and(Cnd.exps("aliasName", "is", null).or("aliasName", "=", "")); + int updatedRows = sysUnitService.update(Chain.make("aliasName", unitAliasName), aliasEmptyCnd); + if (updatedRows > 0) { + sysUnitService.clearCache(); + } + } + Client_user user = BeanUtil.copyProperties(registerBody, Client_user.class); // int gender = IdcardUtil.getGenderByIdCard(user.getIdCard()); // user.setSex(gender==1?"男":"女"); diff --git a/backend/src/main/java/com/budwk/app/client/auth/vo/ClientRegisterBody.java b/backend/src/main/java/com/budwk/app/client/auth/vo/ClientRegisterBody.java index 1ef13f9..4e552b8 100644 --- a/backend/src/main/java/com/budwk/app/client/auth/vo/ClientRegisterBody.java +++ b/backend/src/main/java/com/budwk/app/client/auth/vo/ClientRegisterBody.java @@ -20,5 +20,8 @@ public class ClientRegisterBody { private String unitId; + /** 注册时填写的单位简称,仅在所选单位尚未设置简称时写入单位资料。 */ + private String unitAliasName; + private String smsCode; } diff --git a/backend/src/main/java/com/budwk/app/client/module/activity/controller/ClientActivityController.java b/backend/src/main/java/com/budwk/app/client/module/activity/controller/ClientActivityController.java index 8880542..898dd2f 100644 --- a/backend/src/main/java/com/budwk/app/client/module/activity/controller/ClientActivityController.java +++ b/backend/src/main/java/com/budwk/app/client/module/activity/controller/ClientActivityController.java @@ -8,8 +8,10 @@ import com.budwk.app.client.module.activity.service.ClientActivityService; import com.budwk.app.client.module.activity.vo.ClientActivitySignVO; import com.budwk.app.module.activity.models.ActUser; import com.budwk.app.module.activity.models.Activity; +import com.budwk.app.module.activity.service.ActivityRegistrationFieldService; import com.budwk.app.web.commons.auth.satoken.StpClientUtil; import lombok.Synchronized; +import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; import org.nutz.dao.FieldFilter; @@ -19,6 +21,7 @@ import org.nutz.dao.util.Daos; import org.nutz.dao.util.cri.SqlExpressionGroup; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.ioc.aop.Aop; import org.nutz.lang.util.NutMap; import org.nutz.mvc.adaptor.JsonAdaptor; import org.nutz.mvc.annotation.AdaptBy; @@ -38,6 +41,8 @@ public class ClientActivityController { @Inject private ClientActivityService clientActivityService; @Inject + private ActivityRegistrationFieldService activityRegistrationFieldService; + @Inject private Dao dao; @At @@ -61,6 +66,8 @@ public class ClientActivityController { """); Cnd cnd = Cnd.NEW(); cnd.and(Cnd.likeEX("t1.title", pageForm.getSearchKeyword())); + // 客户端活动列表只展示后台已开启的活动。 + cnd.and("t1.isOpen", "=", true); sql.setCondition(cnd); Pagination pagination = clientActivityService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); return Result.success(pagination); @@ -70,7 +77,13 @@ public class ClientActivityController { @GET @SaCheckLogin(type = StpClientUtil.TYPE) public Result get(Long id) { - Activity activity = clientActivityService.fetch(id); + // 详情接口必须再次校验开启状态,避免通过历史链接访问已关闭活动。 + Activity activity = clientActivityService.fetch(Cnd.where(Activity::getId, "=", id) + .and(Activity::getIsOpen, "=", true) + .and(Activity::getDelFlag, "=", false)); + if (activity == null) { + return Result.error("活动不存在或已关闭"); + } clientActivityService.fetchLinks(activity, "items"); return Result.success(activity); } @@ -83,6 +96,7 @@ public class ClientActivityController { @AdaptBy(type = JsonAdaptor.class) @SaCheckLogin(type = StpClientUtil.TYPE) @Synchronized + @Aop(TransAop.READ_COMMITTED) public synchronized Result signUp(ClientActivitySignVO signVO) { clientActivityService.signUp(signVO); return Result.success(); @@ -108,6 +122,62 @@ public class ClientActivityController { return Result.success(list); } + /** + * 查询指定活动在移动端启用的报名字段。 + * + * @param activityId 活动ID + * @return Result JSON结构;data为按sort排序的字段列表,字典字段同时包含启用选项 + */ + @At("/registration-fields/?") + @SaCheckLogin(type = StpClientUtil.TYPE) + public Result registrationFields(Long activityId) { + Activity activity = clientActivityService.fetch(Cnd.where(Activity::getId, "=", activityId) + .and(Activity::getIsOpen, "=", true) + .and(Activity::getDelFlag, "=", false)); + if (activity == null) { + return Result.error("活动不存在或已关闭"); + } + return Result.success(activityRegistrationFieldService.getFieldConfig(activityId, true, true)); + } + + /** + * 查询当前单位在指定活动中的教练、领队人数限制状态。 + * + * @param activityId 活动ID;应传当前报名页面对应的已开启活动ID + * @return Result JSON结构;data.enabled表示单项目人数规则是否生效,coachValue和leaderValue为人员类型字典值, + * coachCount和leaderCount为其他报名账号已占用人数,maxCount为各类型人数上限 + */ + @At("/person-type-rule-status/?") + @SaCheckLogin(type = StpClientUtil.TYPE) + public Result personTypeRuleStatus(Long activityId) { + return Result.success(clientActivityService.getPersonTypeRuleStatus(activityId)); + } + + /** + * 查询当前单位在指定活动中的项目类型报名人数限制状态。 + * + * @param activityId 活动ID;应传当前报名页面对应的已开启活动ID + * @return Result JSON结构;data.enabled表示单项目报名规则是否生效,data.rules包含类型编码、名称、 + * 人数上限和排除当前账号旧名单后的其他报名账号已占用人数 + */ + @At("/project-type-rule-status/?") + @SaCheckLogin(type = StpClientUtil.TYPE) + public Result projectTypeRuleStatus(Long activityId) { + return Result.success(clientActivityService.getProjectTypeRuleStatus(activityId)); + } + + /** + * 查询当前登录用户所属单位在指定活动中的已保存报名人数。 + * + * @param activityId 活动ID;应传当前报名页面对应的已开启活动ID + * @return Result JSON结构;data为同一活动、同一单位当前已保存且未删除的报名人员数量 + */ + @At("/unit-registration-count/?") + @SaCheckLogin(type = StpClientUtil.TYPE) + public Result unitRegistrationCount(Long activityId) { + return Result.success(clientActivityService.getUnitRegistrationCount(activityId)); + } + /** * 是否报名 */ diff --git a/backend/src/main/java/com/budwk/app/client/module/activity/service/ClientActivityService.java b/backend/src/main/java/com/budwk/app/client/module/activity/service/ClientActivityService.java index 27bd184..902b1d9 100644 --- a/backend/src/main/java/com/budwk/app/client/module/activity/service/ClientActivityService.java +++ b/backend/src/main/java/com/budwk/app/client/module/activity/service/ClientActivityService.java @@ -19,6 +19,30 @@ public interface ClientActivityService extends BaseService { */ void signUp(ClientActivitySignVO signVO); + /** + * 获取当前登录用户所属单位在指定活动中的人员类型限制状态。 + * + * @param activityId 活动ID,必须为已开启且未删除的活动 + * @return NutMap结构;包含规则是否启用、教练/领队字典值、其他报名账号已占用人数和人数上限 + */ + NutMap getPersonTypeRuleStatus(Long activityId); + + /** + * 获取当前登录用户所属单位在指定活动中的项目类型报名规则状态。 + * + * @param activityId 活动ID,必须为已开启且未删除的活动 + * @return NutMap结构;包含规则是否启用,以及各子项上限和其他报名账号已占用人数 + */ + NutMap getProjectTypeRuleStatus(Long activityId); + + /** + * 获取当前登录用户所属单位在指定活动中已保存的报名人员总数。 + * + * @param activityId 活动ID,必须为已开启且未删除的活动 + * @return 当前单位在该活动中未删除的报名人员数量 + */ + int getUnitRegistrationCount(Long activityId); + /** * 报名签到 */ diff --git a/backend/src/main/java/com/budwk/app/client/module/activity/service/impl/ClientActivityServiceImpl.java b/backend/src/main/java/com/budwk/app/client/module/activity/service/impl/ClientActivityServiceImpl.java index 2d3a7ed..d833abd 100644 --- a/backend/src/main/java/com/budwk/app/client/module/activity/service/impl/ClientActivityServiceImpl.java +++ b/backend/src/main/java/com/budwk/app/client/module/activity/service/impl/ClientActivityServiceImpl.java @@ -1,30 +1,39 @@ package com.budwk.app.client.module.activity.service.impl; -import cn.hutool.core.util.IdcardUtil; import com.budwk.app.base.exception.BaseException; -import com.budwk.app.base.result.Result; import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.client.auth.models.Client_user; import com.budwk.app.client.module.activity.service.ClientActivityService; import com.budwk.app.client.module.activity.vo.ClientActivitySignVO; import com.budwk.app.module.activity.models.ActUser; import com.budwk.app.module.activity.models.Activity; +import com.budwk.app.module.activity.enums.RegistrationFieldDefinition; +import com.budwk.app.module.activity.service.ActivityRegistrationFieldService; import com.budwk.app.web.commons.auth.satoken.StpClientUtil; +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.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.Lang; +import org.nutz.lang.Strings; import org.nutz.lang.util.NutMap; -import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; @IocBean(args = {"refer:dao"}) public class ClientActivityServiceImpl extends BaseServiceImpl implements ClientActivityService { + @Inject + private ActivityRegistrationFieldService activityRegistrationFieldService; + public ClientActivityServiceImpl(Dao dao) { super(dao); } @@ -46,9 +55,118 @@ public class ClientActivityServiceImpl extends BaseServiceImpl impleme } @Override + public NutMap getPersonTypeRuleStatus(Long activityId) { + Activity activity = this.fetch(Cnd.where(Activity::getId, "=", activityId) + .and(Activity::getIsOpen, "=", true) + .and(Activity::getDelFlag, "=", false)); + if (activity == null) { + throw new BaseException("活动不存在或已关闭"); + } + Client_user selfUser = dao().fetch(Client_user.class, StpClientUtil.STP.getLoginIdAsLong()); + if (selfUser == null || Strings.isBlank(selfUser.getUnitId())) { + throw new BaseException("当前用户未设置所属单位,无法校验人员类型"); + } + return activityRegistrationFieldService.getPersonTypeRuleStatus(activityId, selfUser.getUnitId(), + StpClientUtil.STP.getLoginIdAsLong()); + } + + @Override + public NutMap getProjectTypeRuleStatus(Long activityId) { + Activity activity = this.fetch(Cnd.where(Activity::getId, "=", activityId) + .and(Activity::getIsOpen, "=", true) + .and(Activity::getDelFlag, "=", false)); + if (activity == null) { + throw new BaseException("活动不存在或已关闭"); + } + Client_user selfUser = dao().fetch(Client_user.class, StpClientUtil.STP.getLoginIdAsLong()); + if (selfUser == null || Strings.isBlank(selfUser.getUnitId())) { + throw new BaseException("当前用户未设置所属单位,无法校验项目报名人数"); + } + return activityRegistrationFieldService.getProjectTypeRuleStatus(activityId, selfUser.getUnitId(), + StpClientUtil.STP.getLoginIdAsLong()); + } + + @Override + public int getUnitRegistrationCount(Long activityId) { + Activity activity = this.fetch(Cnd.where(Activity::getId, "=", activityId) + .and(Activity::getIsOpen, "=", true) + .and(Activity::getDelFlag, "=", false)); + if (activity == null) { + throw new BaseException("活动不存在或已关闭"); + } + Client_user selfUser = dao().fetch(Client_user.class, StpClientUtil.STP.getLoginIdAsLong()); + if (selfUser == null || Strings.isBlank(selfUser.getUnitId())) { + throw new BaseException("当前用户未设置所属单位,无法统计报名人数"); + } + // 统计口径固定为同一活动、同一单位的有效报名人员,供移动端与当前草稿人数合并展示。 + return dao().count(ActUser.class, Cnd.where(ActUser::getActivityId, "=", activityId) + .and(ActUser::getUnitId, "=", selfUser.getUnitId()) + .and(ActUser::getDelFlag, "=", false)); + } + + @Override + @Aop(TransAop.READ_COMMITTED) public void signUp(ClientActivitySignVO signVO) { List userList = signVO.getUserList(); + if (signVO.getActivityId() == null || userList == null || userList.isEmpty()) { + throw new BaseException("活动ID和报名人员不能为空"); + } + Activity activity = this.fetch(Cnd.where(Activity::getId, "=", signVO.getActivityId()) + .and(Activity::getIsOpen, "=", true) + .and(Activity::getDelFlag, "=", false)); + if (activity == null) { + throw new BaseException("活动不存在或已关闭"); + } + + Client_user selfUser = dao().fetch(Client_user.class, StpClientUtil.STP.getLoginIdAsLong()); + if (selfUser == null) { + throw new BaseException("当前登录用户不存在"); + } + dao().fetchLinks(selfUser, "unit"); + if (selfUser.getUnit() == null) { + throw new BaseException("当前用户未设置所属单位,无法报名"); + } + Map requiredMap = activityRegistrationFieldService.getRequiredMap(signVO.getActivityId()); + List oldUsers = dao().query(ActUser.class, + Cnd.where(ActUser::getActivityId, "=", signVO.getActivityId()) + .and(ActUser::getSignUpUserId, "=", StpClientUtil.STP.getLoginIdAsLong())); + Map oldUserById = oldUsers.stream().filter(item -> item.getId() != null) + .collect(Collectors.toMap(ActUser::getId, item -> item, (left, right) -> left, LinkedHashMap::new)); + Map oldUserByPhone = oldUsers.stream().filter(item -> Strings.isNotBlank(item.getPhone())) + .collect(Collectors.toMap(ActUser::getPhone, item -> item, (left, right) -> left, LinkedHashMap::new)); + for (ActUser user : userList) { + // 单位信息由当前登录用户所属单位统一带出,不接收客户端任意修改。 + user.setUnitId(selfUser.getUnitId()); + user.setUnitName(selfUser.getUnit().getName()); + ActUser oldUser = oldUserById.get(user.getId()); + if (oldUser == null && Strings.isNotBlank(user.getPhone())) { + oldUser = oldUserByPhone.get(user.getPhone()); + } + mergeHiddenFields(user, oldUser, requiredMap); + } + + if (requiredMap.containsKey("personType") || requiredMap.containsKey("projectType")) { + // 以活动和单位为边界构造最终报名集合;当前账号旧记录会被本次提交整体覆盖,因此排除后再加入草稿。 + List unitUsers = new ArrayList<>(dao().query(ActUser.class, + Cnd.where(ActUser::getActivityId, "=", signVO.getActivityId()) + .and(ActUser::getUnitId, "=", selfUser.getUnitId()) + .and(Cnd.exps("signUpUserId", "!=", StpClientUtil.STP.getLoginIdAsLong()) + .or("signUpUserId", "is", null)) + .and(ActUser::getDelFlag, "=", false))); + unitUsers.addAll(userList); + if (requiredMap.containsKey("personType")) { + activityRegistrationFieldService.validatePersonTypeRules(signVO.getActivityId(), unitUsers); + } + if (requiredMap.containsKey("projectType")) { + activityRegistrationFieldService.validateProjectTypeRules(signVO.getActivityId(), unitUsers); + } + } + + for (ActUser user : userList) { + validateRegistrationFields(signVO.getActivityId(), user, requiredMap); + } + // 检查是否有重复的身份证号 // boolean hasDuplicateIdCard = userList.stream() // .collect(Collectors.groupingBy(ActUser::getIdCard, Collectors.counting())) @@ -71,9 +189,6 @@ public class ClientActivityServiceImpl extends BaseServiceImpl impleme LocalDateTime now = LocalDateTime.now(); - Client_user selfUser = dao().fetch(Client_user.class, StpClientUtil.STP.getLoginIdAsLong()); - dao().fetchLinks(selfUser, "unit"); - // 首先检查报名人员是否已经在用户表中 for (ActUser user : userList) { Client_user clientUser = dao().fetch(Client_user.class, Cnd.where(Client_user::getPhone, "=", user.getPhone())); @@ -109,9 +224,15 @@ public class ClientActivityServiceImpl extends BaseServiceImpl impleme user.setSignUpUserId(StpClientUtil.STP.getLoginIdAsLong()); user.setSignUpTime(now); - if(!user.getTraffic().equals("自驾")){ + if (!"自驾".equals(user.getTraffic())) { user.setCarNo(null); } + if (!"公共交通".equals(user.getTraffic())) { + user.setIsStation(false); + user.setStationAddress(null); + } else if (!Boolean.TRUE.equals(user.getIsStation())) { + user.setStationAddress(null); + } } @@ -124,6 +245,99 @@ public class ClientActivityServiceImpl extends BaseServiceImpl impleme dao().insert(userList); } + /** + * 按活动字段配置校验一名报名人员。 + * 字段未启用时不校验;关联字段仅在父字段满足显示条件时参与必填校验。 + */ + private void validateRegistrationFields(Long activityId, ActUser user, Map requiredMap) { + for (Map.Entry entry : requiredMap.entrySet()) { + RegistrationFieldDefinition definition = RegistrationFieldDefinition.fromKey(entry.getKey()); + if (definition == null || !conditionMatches(user, definition)) { + continue; + } + Object value = getFieldValue(user, entry.getKey()); + if (Boolean.TRUE.equals(entry.getValue()) && isEmptyValue(value)) { + throw new BaseException("请填写" + definition.getFieldLabel()); + } + if (!isEmptyValue(value) + && !activityRegistrationFieldService.isValidDictValue(activityId, entry.getKey(), String.valueOf(value))) { + throw new BaseException(definition.getFieldLabel() + "不属于当前可用的数据字典选项"); + } + if ("personType".equals(entry.getKey()) && !isEmptyValue(value) + && !activityRegistrationFieldService.isValidPersonTypeCombination(String.valueOf(value))) { + throw new BaseException("人员类型中的教练和领队不能同时选择"); + } + } + } + + private boolean conditionMatches(ActUser user, RegistrationFieldDefinition definition) { + if (Strings.isBlank(definition.getParentField())) { + return true; + } + Object parentValue = getFieldValue(user, definition.getParentField()); + return parentValue != null && definition.getShowWhenValue().equals(String.valueOf(parentValue)); + } + + private boolean isEmptyValue(Object value) { + return value == null || value instanceof String && Strings.isBlank((String) value); + } + + private Object getFieldValue(ActUser user, String fieldKey) { + return switch (fieldKey) { + case "userName" -> user.getUserName(); + case "sex" -> user.getSex(); + case "personType" -> user.getPersonType(); + case "projectType" -> user.getProjectType(); + case "weight" -> user.getWeight(); + case "unitName" -> user.getUnitName(); + case "position" -> user.getPosition(); + case "phone" -> user.getPhone(); + case "birthday" -> user.getBirthday(); + case "isStay" -> user.getIsStay(); + case "isContacts" -> user.getIsContacts(); + case "traffic" -> user.getTraffic(); + case "carNo" -> user.getCarNo(); + case "isStation" -> user.getIsStation(); + case "stationAddress" -> user.getStationAddress(); + case "isShowSkill" -> user.getIsShowSkill(); + case "skillName" -> user.getSkillName(); + case "equip" -> user.getEquip(); + case "isParty" -> user.getIsParty(); + default -> null; + }; + } + + /** + * 重新提交报名时保留当前活动未展示字段的旧值,防止管理员调整配置后历史信息被清空。 + */ + private void mergeHiddenFields(ActUser target, ActUser source, Map selectedFields) { + for (RegistrationFieldDefinition definition : RegistrationFieldDefinition.values()) { + if (selectedFields.containsKey(definition.getFieldKey())) { + continue; + } + switch (definition.getFieldKey()) { + case "sex" -> target.setSex(source == null ? null : source.getSex()); + case "personType" -> target.setPersonType(source == null ? null : source.getPersonType()); + case "projectType" -> target.setProjectType(source == null ? null : source.getProjectType()); + case "weight" -> target.setWeight(source == null ? null : source.getWeight()); + case "position" -> target.setPosition(source == null ? null : source.getPosition()); + case "birthday" -> target.setBirthday(source == null ? null : source.getBirthday()); + case "isStay" -> target.setIsStay(source == null ? null : source.getIsStay()); + case "isContacts" -> target.setIsContacts(source == null ? false : source.getIsContacts()); + case "traffic" -> target.setTraffic(source == null ? null : source.getTraffic()); + case "carNo" -> target.setCarNo(source == null ? null : source.getCarNo()); + case "isStation" -> target.setIsStation(source == null ? false : source.getIsStation()); + case "stationAddress" -> target.setStationAddress(source == null ? null : source.getStationAddress()); + case "isShowSkill" -> target.setIsShowSkill(source == null ? false : source.getIsShowSkill()); + case "skillName" -> target.setSkillName(source == null ? null : source.getSkillName()); + case "equip" -> target.setEquip(source == null ? null : source.getEquip()); + case "isParty" -> target.setIsParty(source == null ? false : source.getIsParty()); + default -> { + } + } + } + } + @Override public void signIn(Long activityId) { ActUser actUser = dao().fetch(ActUser.class, Cnd.where(ActUser::getActivityId, "=", activityId).and(ActUser::getUserId, "=", StpClientUtil.STP.getLoginIdAsLong())); diff --git a/backend/src/main/java/com/budwk/app/module/activity/controller/ActScoreEnterController.java b/backend/src/main/java/com/budwk/app/module/activity/controller/ActScoreEnterController.java index 72ceb46..f3ba70c 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/controller/ActScoreEnterController.java +++ b/backend/src/main/java/com/budwk/app/module/activity/controller/ActScoreEnterController.java @@ -65,11 +65,7 @@ public class ActScoreEnterController { @SaCheckPermission("activity.scoreEnter") @ApiOperation(value = "获取活动列表", nickname = "/list-activity", httpMethod = "GET") public Result listAct(Integer year) { - Sql sql = Sqls.create("select id,title from activity $condition"); - Cnd cnd = Cnd.NEW(); - cnd.andEX("YEAR(startTime)", "=", year); - sql.setCondition(cnd); - return Result.success(activityService.listMap(sql)); + return Result.success(activityService.listByYearOrderByLatest(year)); } /** diff --git a/backend/src/main/java/com/budwk/app/module/activity/controller/ActScoreEntryController.java b/backend/src/main/java/com/budwk/app/module/activity/controller/ActScoreEntryController.java index c480ed8..f678891 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/controller/ActScoreEntryController.java +++ b/backend/src/main/java/com/budwk/app/module/activity/controller/ActScoreEntryController.java @@ -46,11 +46,7 @@ public class ActScoreEntryController { @SaCheckPermission("activity.scoreEntry") @ApiOperation(value = "获取活动列表", nickname = "/list-activity", httpMethod = "GET") public Result listAct(Integer year) { - Sql sql = Sqls.create("select id,title from activity $condition"); - Cnd cnd = Cnd.NEW(); - cnd.andEX("YEAR(startTime)", "=", year); - sql.setCondition(cnd); - return Result.success(activityService.listMap(sql)); + return Result.success(activityService.listByYearOrderByLatest(year)); } /** diff --git a/backend/src/main/java/com/budwk/app/module/activity/controller/ActUserController.java b/backend/src/main/java/com/budwk/app/module/activity/controller/ActUserController.java index 5f07a5b..1286967 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/controller/ActUserController.java +++ b/backend/src/main/java/com/budwk/app/module/activity/controller/ActUserController.java @@ -13,6 +13,8 @@ import com.budwk.app.client.module.activity.vo.ClientActivitySignVO; import com.budwk.app.module.activity.models.ActUser; import com.budwk.app.module.activity.models.Activity; import com.budwk.app.module.activity.service.ActUserService; +import com.budwk.app.module.activity.service.ActivityManageService; +import com.budwk.app.module.activity.service.ActivityRegistrationFieldService; import com.budwk.app.module.activity.vo.page.ActSignInUserPageForm; import com.budwk.app.module.activity.vo.page.ActUserPageForm; import com.budwk.app.web.commons.slog.annotation.SLog; @@ -61,6 +63,10 @@ public class ActUserController { private Dao dao; @Inject private ActUserService actUserService; + @Inject + private ActivityManageService activityManageService; + @Inject + private ActivityRegistrationFieldService activityRegistrationFieldService; @At("") @SaCheckPermission("activity.user") @@ -204,11 +210,26 @@ public class ActUserController { */ @At @SaCheckPermission("activity.user") - public Result getActivityList(String year) { - List activityList = dao.query(Activity.class, Cnd.NEW().andEX("YEAR(startTime)", "=", year).and(Activity::getDelFlag, "=", false)); + public Result getActivityList(Integer year) { + List activityList = activityManageService.listByYearOrderByLatest(year); return Result.success(activityList); } + /** + * 获取报名人员列表需要显示的活动报名字段。 + * + * @param activityId 活动ID,必须传入当前列表选中的活动 + * @return Result JSON结构;data为当前活动已启用的字段,并包含字典字段的可用选项 + */ + @At + @SaCheckPermission("activity.user") + public Result getRegistrationFields(Long activityId) { + if (activityId == null) { + return Result.error("请选择活动"); + } + return Result.success(activityRegistrationFieldService.getFieldConfig(activityId, true, true)); + } + @At @SaCheckPermission("activity.user") diff --git a/backend/src/main/java/com/budwk/app/module/activity/controller/ActWonderfulMomentController.java b/backend/src/main/java/com/budwk/app/module/activity/controller/ActWonderfulMomentController.java index 6ec8c3e..390f31e 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/controller/ActWonderfulMomentController.java +++ b/backend/src/main/java/com/budwk/app/module/activity/controller/ActWonderfulMomentController.java @@ -86,9 +86,7 @@ public class ActWonderfulMomentController { @At public Result getWonderfulMoment(@Param("id") Long id) { - Cnd cnd = Cnd.where("published", "=", true).andEX("id", "=", id); - cnd.desc("publishTime"); - List momentList = wonderfulMomentService.query(cnd); + List momentList = wonderfulMomentService.listClientVisible(id); List result = new ArrayList<>(); for (ActWonderfulMoment wonderfulMoment : momentList) { NutMap nutMap = Lang.obj2map(wonderfulMoment, NutMap.class); @@ -106,15 +104,20 @@ public class ActWonderfulMomentController { @At("/getWonderfulMomentById/?") public Result getWonderfulMomentById(Long id) { - ActWonderfulMoment moment = wonderfulMomentService.fetch(id); + ActWonderfulMoment moment = wonderfulMomentService.fetchClientVisible(id); + if (moment == null) { + return Result.error("精彩瞬间不存在或所属活动已关闭"); + } return Result.success(moment); } @At("/handleWonderfulMoment/?") + @Aop(TransAop.READ_COMMITTED) public Result handleWonderfulMoment(Long id) { - ActWonderfulMoment moment = wonderfulMomentService.fetch(id); - moment.setReadCount(moment.getReadCount() + 1); - wonderfulMomentService.update(moment); + int updatedRows = wonderfulMomentService.increaseClientReadCount(id); + if (updatedRows == 0) { + return Result.error("精彩瞬间不存在或所属活动已关闭"); + } return Result.success(); } } 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 index c89fa1e..07e6bfb 100644 --- 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 @@ -11,6 +11,7 @@ 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.service.ActivityManageService; import com.budwk.app.module.activity.vo.page.ActSignInUserPageForm; import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.usermodel.Workbook; @@ -42,6 +43,8 @@ public class ActivityItemApplyQueryController { @Inject private ActivitySignInQueryService activitySignInQueryService; + @Inject + private ActivityManageService activityManageService; @At("") @SaCheckPermission("activity.itemApplyQuery") @@ -52,7 +55,7 @@ public class ActivityItemApplyQueryController { @At() @SaCheckPermission("activity.signInUserQuery") public Result getActivityOptions(Integer year) { - return Result.success(activitySignInQueryService.dao().query(Activity.class, Cnd.NEW().andEX("YEAR(startTime)", "=", year))); + return Result.success(activityManageService.listByYearOrderByLatest(year)); } @At() diff --git a/backend/src/main/java/com/budwk/app/module/activity/controller/ActivityManageController.java b/backend/src/main/java/com/budwk/app/module/activity/controller/ActivityManageController.java index 2fb95d5..395e689 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/controller/ActivityManageController.java +++ b/backend/src/main/java/com/budwk/app/module/activity/controller/ActivityManageController.java @@ -2,12 +2,13 @@ package com.budwk.app.module.activity.controller; import cn.dev33.satoken.annotation.SaCheckLogin; import cn.dev33.satoken.annotation.SaCheckPermission; -import cn.hutool.core.collection.CollUtil; import com.budwk.app.base.page.PageForm; 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.models.ActRegistrationField; +import com.budwk.app.module.activity.service.ActivityRegistrationFieldService; import com.budwk.app.module.activity.service.ActivityManageService; import com.budwk.app.web.commons.auth.satoken.StpClientUtil; import lombok.extern.slf4j.Slf4j; @@ -22,7 +23,7 @@ import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Param; import java.util.Arrays; -import java.util.Collection; +import java.util.Collections; import java.util.List; @IocBean @@ -35,6 +36,8 @@ public class ActivityManageController { private Dao dao; @Inject private ActivityManageService activityService; + @Inject + private ActivityRegistrationFieldService activityRegistrationFieldService; @At("") @SaCheckPermission("activity.manager") @@ -91,6 +94,27 @@ public class ActivityManageController { return Result.success(); } + /** + * 更新活动在客户端的开启状态。 + * + * @param id 活动ID,必须传入后台活动列表中的有效ID + * @param isOpen 是否开启;true 表示客户端显示,false 表示客户端隐藏 + * @return Result JSON结构;code为0表示更新成功,非0时msg说明失败原因 + */ + @At + @Aop(TransAop.READ_COMMITTED) + @SaCheckPermission("activity.manager") + public Result updateOpenStatus(@Param("id") Long id, @Param("isOpen") Boolean isOpen) { + if (id == null || isOpen == null) { + return Result.error("活动ID和开启状态不能为空"); + } + int updatedRows = activityService.updateOpenStatus(id, isOpen); + if (updatedRows == 0) { + return Result.error("活动不存在或状态更新失败"); + } + return Result.success(); + } + /** * 删除活动 */ @@ -148,27 +172,49 @@ public class ActivityManageController { @Aop(TransAop.READ_COMMITTED) @SaCheckPermission("activity.manager") public Result updateItem(Long id, @Param("items") ActivityItem[] items) { - // 查询出旧的活动信息 - List oldItems = dao.query(ActivityItem.class, Cnd.where(ActivityItem::getActivityId, "=", id)); - // 更新项目信息 - List oldItemIdList = oldItems.stream().map(ActivityItem::getId).toList(); - // 更新项目信息 - for (ActivityItem item : items) { - item.setActivityId(id); + activityService.updateItems(id, + items == null ? Collections.emptyList() : Arrays.asList(items)); + return Result.success(); + } + + /** + * 查询活动报名字段配置。 + * + * @param id 活动ID + * @return Result JSON结构;data为完整安全字段目录,并包含选中、必填、顺序和依赖信息 + */ + @At + @SaCheckPermission("activity.manager") + public Result getRegistrationFields(@Param("id") Long id) { + if (id == null || activityService.fetch(id) == null) { + return Result.error("活动不存在"); } - dao.insertOrUpdate(items); - // 找出需要新增的 找出需要删除的 - List newItemIdList = Arrays.stream(items).map(ActivityItem::getId).toList(); - // 删除旧的项目信息 - Collection deleteItemIdList = CollUtil.subtract(oldItemIdList, newItemIdList); - dao.clear(ActivityItem.class, Cnd.where("id", "in", deleteItemIdList)); + return Result.success(activityRegistrationFieldService.getFieldConfig(id, false, false)); + } + + /** + * 保存活动报名字段配置。 + * + * @param id 活动ID + * @param fields 已选择字段数组;fieldKey为字段编码、required为是否必填、sort为显示顺序 + * @return Result JSON结构;code为0表示保存成功,非0时msg说明失败原因 + */ + @At + @Aop(TransAop.READ_COMMITTED) + @SaCheckPermission("activity.manager") + public Result saveRegistrationFields(@Param("id") Long id, + @Param("fields") ActRegistrationField[] fields) { + activityRegistrationFieldService.saveFieldConfig(id, + fields == null ? Collections.emptyList() : Arrays.asList(fields)); return Result.success(); } @At @Aop(TransAop.READ_COMMITTED) public Result getActivity() { - List activityList = activityService.query(Cnd.NEW()); + // 客户端首页的活动详情只展示后台已开启且未删除的活动。 + List activityList = activityService.query(Cnd.where(Activity::getIsOpen, "=", true) + .and(Activity::getDelFlag, "=", false)); return Result.success(activityList); } } 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 143acf4..23de596 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 @@ -12,6 +12,8 @@ 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.service.ActivityManageService; +import com.budwk.app.module.activity.service.ActivityRegistrationFieldService; import com.budwk.app.module.activity.vo.page.ActSignInUserPageForm; import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.usermodel.Workbook; @@ -39,6 +41,10 @@ public class ActivitySignInQueryController { @Inject private ActivitySignInQueryService activitySignInQueryService; + @Inject + private ActivityManageService activityManageService; + @Inject + private ActivityRegistrationFieldService activityRegistrationFieldService; @At("") @SaCheckPermission("activity.signInUserQuery") @@ -50,7 +56,22 @@ public class ActivitySignInQueryController { @At() @SaCheckPermission("activity.signInUserQuery") public Result getActivityOptions(Integer year) { - return Result.success(activitySignInQueryService.dao().query(Activity.class, Cnd.NEW().andEX("YEAR(startTime)", "=", year))); + return Result.success(activityManageService.listByYearOrderByLatest(year)); + } + + /** + * 获取签字人员列表需要显示的活动报名字段。 + * + * @param activityId 活动ID,必须传入当前列表选中的活动 + * @return Result JSON结构;data为当前活动已启用的字段,并包含字典字段的可用选项 + */ + @At() + @SaCheckPermission("activity.signInUserQuery") + public Result getRegistrationFields(Long activityId) { + if (activityId == null) { + return Result.error("请选择活动"); + } + return Result.success(activityRegistrationFieldService.getFieldConfig(activityId, true, true)); } @At() diff --git a/backend/src/main/java/com/budwk/app/module/activity/enums/RegistrationFieldDefinition.java b/backend/src/main/java/com/budwk/app/module/activity/enums/RegistrationFieldDefinition.java new file mode 100644 index 0000000..05a5120 --- /dev/null +++ b/backend/src/main/java/com/budwk/app/module/activity/enums/RegistrationFieldDefinition.java @@ -0,0 +1,68 @@ +package com.budwk.app.module.activity.enums; + +import lombok.Getter; + +import java.util.Arrays; +import java.util.List; + +/** + * 报名字段安全目录。 + * 这里显式声明允许管理员配置的字段,避免把主键、签到状态等系统字段暴露到移动端。 + */ +@Getter +public enum RegistrationFieldDefinition { + USER_NAME("userName", "姓名", "input", true, true, true, null, null, null), + SEX("sex", "性别", "radio", true, true, false, null, null, null), + PERSON_TYPE("personType", "人员类型", "dict-checkbox", false, false, false, null, null, "person_type"), + PROJECT_TYPE("projectType", "项目类型", "dict-checkbox", false, false, false, null, null, "project_type"), + WEIGHT("weight", "体重(KG)", "number", true, true, false, null, null, null), + UNIT_NAME("unitName", "单位名称", "readonly", true, true, true, null, null, null), + POSITION("position", "职务", "input", true, true, false, null, null, null), + PHONE("phone", "联系电话", "tel", true, true, true, null, null, null), + BIRTHDAY("birthday", "出生日期", "date", false, false, false, null, null, null), + IS_STAY("isStay", "是否住宿", "boolean-radio", true, true, false, null, null, null), + IS_CONTACTS("isContacts", "是否联络员", "boolean-radio", true, true, false, null, null, null), + TRAFFIC("traffic", "交通方式", "radio", true, true, false, null, null, null), + CAR_NO("carNo", "车牌号", "input", true, true, false, "traffic", "自驾", null), + IS_STATION("isStation", "是否接站", "boolean-radio", true, true, false, "traffic", "公共交通", null), + STATION_ADDRESS("stationAddress", "接站地址", "input", true, true, false, "isStation", "true", null), + IS_SHOW_SKILL("isShowSkill", "是否展示才艺", "boolean-radio", false, false, false, null, null, null), + SKILL_NAME("skillName", "才艺名称", "input", false, false, false, "isShowSkill", "true", null), + EQUIP("equip", "所需器材", "input", false, false, false, "isShowSkill", "true", null), + IS_PARTY("isParty", "参加茶叙会", "boolean-radio", true, true, false, null, null, null); + + private final String fieldKey; + private final String fieldLabel; + private final String componentType; + private final boolean defaultSelected; + private final boolean defaultRequired; + private final boolean locked; + private final String parentField; + private final String showWhenValue; + private final String dictCode; + + RegistrationFieldDefinition(String fieldKey, String fieldLabel, String componentType, + boolean defaultSelected, boolean defaultRequired, boolean locked, + String parentField, String showWhenValue, String dictCode) { + this.fieldKey = fieldKey; + this.fieldLabel = fieldLabel; + this.componentType = componentType; + this.defaultSelected = defaultSelected; + this.defaultRequired = defaultRequired; + this.locked = locked; + this.parentField = parentField; + this.showWhenValue = showWhenValue; + this.dictCode = dictCode; + } + + public static RegistrationFieldDefinition fromKey(String fieldKey) { + return Arrays.stream(values()) + .filter(item -> item.fieldKey.equals(fieldKey)) + .findFirst() + .orElse(null); + } + + public static List defaultFields() { + return Arrays.stream(values()).filter(RegistrationFieldDefinition::isDefaultSelected).toList(); + } +} diff --git a/backend/src/main/java/com/budwk/app/module/activity/models/ActRegistrationField.java b/backend/src/main/java/com/budwk/app/module/activity/models/ActRegistrationField.java new file mode 100644 index 0000000..aca4d56 --- /dev/null +++ b/backend/src/main/java/com/budwk/app/module/activity/models/ActRegistrationField.java @@ -0,0 +1,52 @@ +package com.budwk.app.module.activity.models; + +import com.budwk.app.base.model.BaseModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.nutz.dao.entity.annotation.ColDefine; +import org.nutz.dao.entity.annotation.ColType; +import org.nutz.dao.entity.annotation.Column; +import org.nutz.dao.entity.annotation.Comment; +import org.nutz.dao.entity.annotation.Id; +import org.nutz.dao.entity.annotation.Index; +import org.nutz.dao.entity.annotation.Table; +import org.nutz.dao.entity.annotation.TableIndexes; +import org.nutz.dao.entity.annotation.TableMeta; + +/** + * 活动报名字段配置。 + * 每条记录表示某个活动启用了一个安全字段目录中的报名字段。 + */ +@Data +@Table("act_registration_field") +@Comment("活动报名字段配置") +@EqualsAndHashCode(callSuper = true) +@TableMeta("{'mysql-charset':'utf8mb4'}") +@TableIndexes({ + @Index(name = "UK_ACT_REG_FIELD", fields = {"activityId", "fieldKey"}, unique = true) +}) +public class ActRegistrationField extends BaseModel { + + @Id + @Comment("ID") + private Long id; + + @Column + @Comment("活动ID") + @ColDefine(customType = "bigint") + private Long activityId; + + @Column + @Comment("字段编码") + @ColDefine(type = ColType.VARCHAR, width = 50) + private String fieldKey; + + @Column + @Comment("是否必填") + @ColDefine(type = ColType.BOOLEAN) + private Boolean required; + + @Column + @Comment("显示顺序") + private Integer sort; +} diff --git a/backend/src/main/java/com/budwk/app/module/activity/models/ActUser.java b/backend/src/main/java/com/budwk/app/module/activity/models/ActUser.java index ff658a6..a39e172 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/models/ActUser.java +++ b/backend/src/main/java/com/budwk/app/module/activity/models/ActUser.java @@ -56,6 +56,16 @@ public class ActUser extends BaseModel { @ColDefine(type = ColType.VARCHAR, width = 10) private String sex; + @Column + @Comment("人员类型字典代码,多个代码以逗号分隔") + @ColDefine(type = ColType.VARCHAR, width = 255) + private String personType; + + @Column + @Comment("项目类型字典代码,多个代码以逗号分隔") + @ColDefine(type = ColType.VARCHAR, width = 255) + private String projectType; + @Column @Comment("职务") @ColDefine(type = ColType.VARCHAR, width = 100) diff --git a/backend/src/main/java/com/budwk/app/module/activity/models/ActWonderfulMoment.java b/backend/src/main/java/com/budwk/app/module/activity/models/ActWonderfulMoment.java index e2aa5fb..be25081 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/models/ActWonderfulMoment.java +++ b/backend/src/main/java/com/budwk/app/module/activity/models/ActWonderfulMoment.java @@ -23,6 +23,10 @@ public class ActWonderfulMoment extends BaseModel { @Comment("ID") private Long id; + @Column + @Comment("所属活动ID") + private Long activityId; + @Column @Comment("标题") @ColDefine(type = ColType.VARCHAR, width = 100) diff --git a/backend/src/main/java/com/budwk/app/module/activity/models/Activity.java b/backend/src/main/java/com/budwk/app/module/activity/models/Activity.java index 1e79c50..6985c8e 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/models/Activity.java +++ b/backend/src/main/java/com/budwk/app/module/activity/models/Activity.java @@ -90,6 +90,12 @@ public class Activity extends BaseModel { @ColDefine(type = ColType.VARCHAR, width = 500) private String cover; + @Comment("是否开启") + @Column + @Default(value = "1") + @ColDefine(type = ColType.BOOLEAN) + private Boolean isOpen = true; + @Comment("附件") @Column @ColDefine(type = ColType.MYSQL_JSON) diff --git a/backend/src/main/java/com/budwk/app/module/activity/models/ActivityItem.java b/backend/src/main/java/com/budwk/app/module/activity/models/ActivityItem.java index eac6708..fee0be3 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/models/ActivityItem.java +++ b/backend/src/main/java/com/budwk/app/module/activity/models/ActivityItem.java @@ -26,6 +26,16 @@ public class ActivityItem extends BaseModel { @ColDefine(type = ColType.VARCHAR, width = 30) private String name; + @Comment("项目类型(project_type数据字典编码)") + @Column + @ColDefine(type = ColType.VARCHAR, width = 20) + private String projectType; + + @Comment("报名规则(项目类型子项编码及人数上限JSON)") + @Column + @ColDefine(type = ColType.TEXT) + private String registrationRule; + @Comment("比赛方法") @Column @ColDefine(type = ColType.VARCHAR, width = 300) diff --git a/backend/src/main/java/com/budwk/app/module/activity/service/ActWonderfulMomentService.java b/backend/src/main/java/com/budwk/app/module/activity/service/ActWonderfulMomentService.java index b95ded8..0b4372c 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/service/ActWonderfulMomentService.java +++ b/backend/src/main/java/com/budwk/app/module/activity/service/ActWonderfulMomentService.java @@ -3,6 +3,8 @@ package com.budwk.app.module.activity.service; import com.budwk.app.base.service.BaseService; import com.budwk.app.module.activity.models.ActWonderfulMoment; +import java.util.List; + /** * @ClassName ActWonderfulMomentService * @Author JyuHsin @@ -11,4 +13,28 @@ import com.budwk.app.module.activity.models.ActWonderfulMoment; * @Description TODO */ public interface ActWonderfulMomentService extends BaseService { + + /** + * 查询客户端可见的精彩瞬间。 + * + * @param id 精彩瞬间ID;传空时查询全部可见数据,传值时只查询指定数据 + * @return 精彩瞬间列表;仅包含已发布且所属活动已开启的数据 + */ + List listClientVisible(Long id); + + /** + * 查询一条客户端可见的精彩瞬间。 + * + * @param id 精彩瞬间ID,不能为空 + * @return 精彩瞬间;未发布、所属活动关闭或数据不存在时返回null + */ + ActWonderfulMoment fetchClientVisible(Long id); + + /** + * 增加客户端可见精彩瞬间的阅读次数。 + * + * @param id 精彩瞬间ID,不能为空 + * @return 更新记录数;1表示成功,0表示数据当前不可见或不存在 + */ + int increaseClientReadCount(Long id); } diff --git a/backend/src/main/java/com/budwk/app/module/activity/service/ActivityManageService.java b/backend/src/main/java/com/budwk/app/module/activity/service/ActivityManageService.java index a1e30d3..7d645c5 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/service/ActivityManageService.java +++ b/backend/src/main/java/com/budwk/app/module/activity/service/ActivityManageService.java @@ -2,6 +2,44 @@ package com.budwk.app.module.activity.service; import com.budwk.app.base.service.BaseService; import com.budwk.app.module.activity.models.Activity; +import com.budwk.app.module.activity.models.ActivityItem; +import org.nutz.lang.util.NutMap; + +import java.util.List; public interface ActivityManageService extends BaseService { + + /** + * 查询指定年度的有效活动,并将最后创建的活动排在最前面。 + * + * @param year 活动开始时间所属年度;传空时查询全部年度 + * @return 未删除活动列表,按照创建时间和活动ID倒序排列 + */ + List listByYearOrderByLatest(Integer year); + + /** + * 查询客户端登录页需要展示的当前最新开启活动单位信息。 + * + * @return 当前活动展示信息;title 为活动标题,hostUnit 为主办单位, + * coHostUnit 为承办单位,没有符合条件的活动时各字段均为空字符串 + */ + NutMap getLatestOpenActivityOrganizer(); + + /** + * 更新活动在客户端的开启状态。 + * + * @param id 活动ID,必须对应已存在的活动 + * @param isOpen 是否开启;true 表示客户端显示,false 表示客户端隐藏 + * @return 实际更新的数据行数 + */ + int updateOpenStatus(Long id, Boolean isOpen); + + /** + * 保存指定活动的项目,并删除本次提交中已经移除的旧项目。 + * + * @param activityId 活动ID,必须对应已存在的活动 + * @param items 项目列表;每项的projectType必须是启用的project_type字典编码 + * @throws com.budwk.app.base.exception.BaseException 活动不存在、项目类型为空或字典值无效时抛出 + */ + void updateItems(Long activityId, List items); } diff --git a/backend/src/main/java/com/budwk/app/module/activity/service/ActivityRegistrationFieldService.java b/backend/src/main/java/com/budwk/app/module/activity/service/ActivityRegistrationFieldService.java new file mode 100644 index 0000000..30f711a --- /dev/null +++ b/backend/src/main/java/com/budwk/app/module/activity/service/ActivityRegistrationFieldService.java @@ -0,0 +1,96 @@ +package com.budwk.app.module.activity.service; + +import com.budwk.app.base.service.BaseService; +import com.budwk.app.module.activity.models.ActRegistrationField; +import com.budwk.app.module.activity.models.ActUser; +import org.nutz.lang.util.NutMap; + +import java.util.List; +import java.util.Map; + +public interface ActivityRegistrationFieldService extends BaseService { + + /** + * 获取活动报名字段目录及配置状态。 + * + * @param activityId 活动ID + * @param selectedOnly true只返回已启用字段,false返回完整安全字段目录 + * @param includeOptions true时为数据字典字段附带可用选项 + * @return 字段配置列表;包含字段编码、名称、组件类型、必填状态、顺序、依赖和字典选项 + */ + List getFieldConfig(Long activityId, boolean selectedOnly, boolean includeOptions); + + /** + * 覆盖保存某活动的报名字段配置。 + * + * @param activityId 活动ID + * @param fields 管理端选中的字段配置 + */ + void saveFieldConfig(Long activityId, List fields); + + /** + * 获取当前活动有效字段的必填规则。 + * + * @param activityId 活动ID + * @return key为字段编码,value表示是否必填 + */ + Map getRequiredMap(Long activityId); + + /** + * 校验数据字典字段提交值。 + * + * @param activityId 活动ID;项目类型需要据此定位唯一项目配置的下级字典 + * @param fieldKey 报名字段编码 + * @param value 单个字典子项code,或使用英文逗号分隔的多个code + * @return 字段不是字典字段,或全部值均属于启用字典项时返回true + */ + boolean isValidDictValue(Long activityId, String fieldKey, String value); + + /** + * 校验人员类型的业务组合。 + * + * @param value 使用英文逗号分隔的人员类型字典code + * @return 未同时选择“教练”和“领队”时返回true;运动员可以与其中任意一种同时选择 + */ + boolean isValidPersonTypeCombination(String value); + + /** + * 获取同一活动、同一单位的人员类型人数限制状态。 + * + * @param activityId 活动ID;只有活动恰好一个项目且已启用人员类型字段时规则才生效 + * @param unitId 单位ID,用于限定已有报名人员的统计范围 + * @param excludedSignUpUserId 当前报名操作账号ID;其旧报名记录会被本次页面数据覆盖,因此统计时排除 + * @return NutMap结构;enabled表示规则是否生效,coachValue/leaderValue为字典值, + * coachCount/leaderCount为排除当前账号旧记录后的已有报名人数,maxCount固定为1 + */ + NutMap getPersonTypeRuleStatus(Long activityId, String unitId, Long excludedSignUpUserId); + + /** + * 获取唯一活动项目的各项目类型报名人数限制状态。 + * + * @param activityId 活动ID;只有活动恰好一个项目且配置了报名规则时规则才生效 + * @param unitId 单位ID,用于统计同一活动、同一单位的已报名人员 + * @param excludedSignUpUserId 当前报名操作账号ID;其旧报名记录会被当前草稿覆盖,因此统计时排除 + * @return NutMap结构;enabled表示规则是否生效,rules包含类型编码、名称、人数上限和其他账号已占用人数 + */ + NutMap getProjectTypeRuleStatus(Long activityId, String unitId, Long excludedSignUpUserId); + + /** + * 校验单项目活动中同一单位最终报名人员的教练、领队人数。 + * + * @param activityId 活动ID;非单项目活动直接跳过 + * @param users 同一活动、同一单位最终的全部报名人员 + * @throws com.budwk.app.base.exception.BaseException 教练或领队超过1人、人员类型字典配置不完整时抛出 + */ + void validatePersonTypeRules(Long activityId, List users); + + /** + * 校验同一活动、同一单位全部报名人员的项目类型组合。 + * 校验前会将历史“单打”“双打”代码按人员性别转换为当前男子或女子单打、双打代码。 + * + * @param activityId 活动ID,用于读取唯一项目的项目类型下级字典 + * @param users 同一活动、同一单位的全部报名人员,包含本次提交人员和其他账号已提交人员 + * @throws com.budwk.app.base.exception.BaseException 未选择运动员类型、同性别单双打冲突、项目性别不符或混双男女数量不一致时抛出 + */ + void validateProjectTypeRules(Long activityId, List users); +} diff --git a/backend/src/main/java/com/budwk/app/module/activity/service/impl/ActUserServiceImpl.java b/backend/src/main/java/com/budwk/app/module/activity/service/impl/ActUserServiceImpl.java index 2d18240..a38d7c2 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/service/impl/ActUserServiceImpl.java +++ b/backend/src/main/java/com/budwk/app/module/activity/service/impl/ActUserServiceImpl.java @@ -79,7 +79,15 @@ public class ActUserServiceImpl extends BaseServiceImpl implements ActU } cnd.andEX("u.isSignIn", "=", pageForm.getIsSignIn()); cnd.andEX("u.unitId", "=", pageForm.getUnitId()); - cnd.asc("u.unitName"); + // 仅开放单位名称排序,避免客户端传入任意列名;未指定时保持单位名称升序。 + if ("unitName".equals(pageForm.getPageOrderName()) && "descending".equals(pageForm.getPageOrderBy())) { + cnd.desc("u.unitName"); + } else { + cnd.asc("u.unitName"); + } + // 单位名称相同时固定按姓名和记录ID排序,确保翻页结果稳定。 + cnd.asc("u.userName"); + cnd.asc("u.id"); sql.setCondition(cnd); return sql; } diff --git a/backend/src/main/java/com/budwk/app/module/activity/service/impl/ActWonderfulMomentServiceImpl.java b/backend/src/main/java/com/budwk/app/module/activity/service/impl/ActWonderfulMomentServiceImpl.java index c53e062..175c125 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/service/impl/ActWonderfulMomentServiceImpl.java +++ b/backend/src/main/java/com/budwk/app/module/activity/service/impl/ActWonderfulMomentServiceImpl.java @@ -3,9 +3,15 @@ package com.budwk.app.module.activity.service.impl; import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.module.activity.models.ActWonderfulMoment; import com.budwk.app.module.activity.service.ActWonderfulMomentService; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.dao.Cnd; import org.nutz.dao.Dao; +import org.nutz.dao.util.cri.Static; +import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.IocBean; +import java.util.List; + /** * @ClassName ActWonderfulMomentServiceImpl * @Author JyuHsin @@ -18,4 +24,42 @@ public class ActWonderfulMomentServiceImpl extends BaseServiceImpl listClientVisible(Long id) { + Cnd cnd = buildClientVisibleCnd(); + cnd.andEX(ActWonderfulMoment::getId, "=", id); + cnd.desc(ActWonderfulMoment::getPublishTime); + return this.query(cnd); + } + + @Override + public ActWonderfulMoment fetchClientVisible(Long id) { + if (id == null) { + return null; + } + return this.fetch(buildClientVisibleCnd().and(ActWonderfulMoment::getId, "=", id)); + } + + @Override + @Aop(TransAop.READ_COMMITTED) + public int increaseClientReadCount(Long id) { + ActWonderfulMoment moment = this.fetchClientVisible(id); + if (moment == null) { + return 0; + } + Integer readCount = moment.getReadCount(); + moment.setReadCount(readCount == null ? 1 : readCount + 1); + return this.update(moment); + } + + /** + * 构造客户端可见条件:精彩瞬间已发布,并且关联的活动处于开启且未删除状态。 + * + * @return 可直接追加业务条件的Cnd对象 + */ + private Cnd buildClientVisibleCnd() { + return Cnd.where(ActWonderfulMoment::getPublished, "=", true) + .and(new Static("activityId IN (SELECT id FROM activity WHERE isOpen = 1 AND delFlag = 0)")); + } } diff --git a/backend/src/main/java/com/budwk/app/module/activity/service/impl/ActivityManageServiceImpl.java b/backend/src/main/java/com/budwk/app/module/activity/service/impl/ActivityManageServiceImpl.java index c033bc2..beaea5f 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/service/impl/ActivityManageServiceImpl.java +++ b/backend/src/main/java/com/budwk/app/module/activity/service/impl/ActivityManageServiceImpl.java @@ -1,14 +1,187 @@ package com.budwk.app.module.activity.service.impl; +import cn.hutool.core.collection.CollUtil; +import com.budwk.app.base.exception.BaseException; import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.module.activity.models.Activity; +import com.budwk.app.module.activity.models.ActivityItem; import com.budwk.app.module.activity.service.ActivityManageService; +import com.budwk.app.sys.models.Sys_dict; +import com.budwk.app.sys.services.SysDictService; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.dao.Chain; +import org.nutz.dao.Cnd; import org.nutz.dao.Dao; +import org.nutz.ioc.aop.Aop; +import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.json.Json; +import org.nutz.json.JsonFormat; +import org.nutz.lang.Strings; +import org.nutz.lang.util.NutMap; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; @IocBean(args = {"refer:dao"}) public class ActivityManageServiceImpl extends BaseServiceImpl implements ActivityManageService { + @Inject + private SysDictService sysDictService; + public ActivityManageServiceImpl(Dao dao) { super(dao); } + + @Override + public List listByYearOrderByLatest(Integer year) { + Cnd cnd = Cnd.where(Activity::getDelFlag, "=", false); + cnd.andEX("YEAR(startTime)", "=", year); + cnd.desc(Activity::getCreatedAt); + cnd.desc(Activity::getId); + return this.query(cnd); + } + + /** + * 登录页只使用已开启、未删除活动的单位信息,避免已关闭活动继续影响客户端展示。 + * 当创建时间相同时再按活动ID倒序,确保“最新活动”的选择结果稳定。 + * + * @return title 为活动标题,hostUnit 为主办单位,coHostUnit 为承办单位; + * 无可用活动时各字段均返回空字符串 + */ + @Override + public NutMap getLatestOpenActivityOrganizer() { + Cnd cnd = Cnd.where(Activity::getDelFlag, "=", false); + cnd.and(Activity::getIsOpen, "=", true); + cnd.desc(Activity::getCreatedAt); + cnd.desc(Activity::getId); + Activity activity = this.fetch(cnd); + if (activity == null) { + return NutMap.NEW() + .addv("title", "") + .addv("hostUnit", "") + .addv("coHostUnit", ""); + } + return NutMap.NEW() + .addv("title", Strings.sNull(activity.getTitle())) + .addv("hostUnit", Strings.sNull(activity.getHostUnit())) + .addv("coHostUnit", Strings.sNull(activity.getCoHostUnit())); + } + + /** + * 仅更新活动的客户端开启状态,避免列表开关提交并覆盖活动的其他业务字段。 + * + * @param id 活动ID + * @param isOpen 是否开启;true 表示客户端显示,false 表示客户端隐藏 + * @return 实际更新的数据行数 + */ + @Override + public int updateOpenStatus(Long id, Boolean isOpen) { + return this.update(Chain.make("isOpen", isOpen), Cnd.where(Activity::getId, "=", id)); + } + + /** + * 项目类型只保存project_type字典编码,服务端再次校验可防止绕过页面提交停用或非法值。 + * + * @param activityId 活动ID + * @param items 本次保存的完整项目列表 + */ + @Override + @Aop(TransAop.READ_COMMITTED) + public void updateItems(Long activityId, List items) { + if (activityId == null || this.fetch(activityId) == null) { + throw new BaseException("活动不存在"); + } + List submittedItems = items == null ? Collections.emptyList() : items; + Set enabledProjectTypes = new LinkedHashSet<>(); + for (Sys_dict dict : sysDictService.getSubListByCode("project_type")) { + if (!dict.isDisabled() && Strings.isNotBlank(dict.getCode())) { + enabledProjectTypes.add(dict.getCode()); + } + } + if (enabledProjectTypes.isEmpty()) { + throw new BaseException("项目类型数据字典未配置可用选项"); + } + + List oldItems = dao().query(ActivityItem.class, + Cnd.where(ActivityItem::getActivityId, "=", activityId)); + List oldItemIds = oldItems.stream().map(ActivityItem::getId).toList(); + for (ActivityItem item : submittedItems) { + if (Strings.isBlank(item.getProjectType())) { + throw new BaseException("请选择项目类型"); + } + if (!enabledProjectTypes.contains(item.getProjectType())) { + throw new BaseException("项目类型不属于当前可用的数据字典选项"); + } + validateAndNormalizeRegistrationRule(item); + item.setActivityId(activityId); + } + dao().insertOrUpdate(submittedItems); + + List submittedItemIds = submittedItems.stream().map(ActivityItem::getId).toList(); + Collection deletedItemIds = CollUtil.subtract(oldItemIds, submittedItemIds); + if (!deletedItemIds.isEmpty()) { + dao().clear(ActivityItem.class, Cnd.where("id", "in", deletedItemIds)); + } + } + + /** + * 校验项目类型下每个启用子项都设置了非负人数,并统一保存为只含编码和人数的紧凑JSON。 + * 各子项人数相互独立,不与ActivityItem.num比较,允许合计超过项目报名人数。 + */ + private void validateAndNormalizeRegistrationRule(ActivityItem item) { + List children = sysDictService.getSubListByCode(item.getProjectType()).stream() + .filter(dict -> !dict.isDisabled() && Strings.isNotBlank(dict.getCode())) + .toList(); + if (children.isEmpty()) { + item.setRegistrationRule("[]"); + return; + } + + List submittedRules; + try { + submittedRules = Strings.isBlank(item.getRegistrationRule()) + ? Collections.emptyList() + : Json.fromJsonAsList(NutMap.class, item.getRegistrationRule()); + } catch (RuntimeException e) { + throw new BaseException("项目“" + Strings.sNull(item.getName()) + "”的报名规则格式不正确"); + } + if (submittedRules == null) { + submittedRules = Collections.emptyList(); + } + Set childCodes = children.stream().map(Sys_dict::getCode).collect(java.util.stream.Collectors.toSet()); + Map submittedRuleMap = new LinkedHashMap<>(); + for (NutMap rule : submittedRules) { + String typeCode = rule.getString("typeCode"); + if (Strings.isBlank(typeCode) || !childCodes.contains(typeCode) + || submittedRuleMap.put(typeCode, rule) != null) { + throw new BaseException("项目“" + Strings.sNull(item.getName()) + "”存在重复或无效的报名规则"); + } + } + + List normalizedRules = new ArrayList<>(); + for (Sys_dict child : children) { + NutMap rule = submittedRuleMap.get(child.getCode()); + Object personCountValue = rule == null ? null : rule.get("personCount"); + Integer personCount = null; + if (personCountValue instanceof Number number + && Double.isFinite(number.doubleValue()) + && number.doubleValue() == Math.rint(number.doubleValue())) { + personCount = number.intValue(); + } + if (personCount == null || personCount < 0 || personCount > 9999) { + throw new BaseException("请设置项目“" + Strings.sNull(item.getName()) + + "”中“" + child.getName() + "”的报名人数(0至9999)"); + } + normalizedRules.add(NutMap.NEW() + .addv("typeCode", child.getCode()) + .addv("personCount", personCount)); + } + item.setRegistrationRule(Json.toJson(normalizedRules, JsonFormat.compact())); + } } diff --git a/backend/src/main/java/com/budwk/app/module/activity/service/impl/ActivityRegistrationFieldServiceImpl.java b/backend/src/main/java/com/budwk/app/module/activity/service/impl/ActivityRegistrationFieldServiceImpl.java new file mode 100644 index 0000000..d003d8b --- /dev/null +++ b/backend/src/main/java/com/budwk/app/module/activity/service/impl/ActivityRegistrationFieldServiceImpl.java @@ -0,0 +1,574 @@ +package com.budwk.app.module.activity.service.impl; + +import com.budwk.app.base.exception.BaseException; +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.module.activity.enums.RegistrationFieldDefinition; +import com.budwk.app.module.activity.models.ActRegistrationField; +import com.budwk.app.module.activity.models.ActUser; +import com.budwk.app.module.activity.models.Activity; +import com.budwk.app.module.activity.models.ActivityItem; +import com.budwk.app.module.activity.service.ActivityRegistrationFieldService; +import com.budwk.app.sys.models.Sys_dict; +import com.budwk.app.sys.services.SysDictService; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.ioc.aop.Aop; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.json.Json; +import org.nutz.lang.Strings; +import org.nutz.lang.util.NutMap; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +@IocBean(args = {"refer:dao"}) +public class ActivityRegistrationFieldServiceImpl extends BaseServiceImpl + implements ActivityRegistrationFieldService { + + @Inject + private SysDictService sysDictService; + + public ActivityRegistrationFieldServiceImpl(Dao dao) { + super(dao); + } + + @Override + public List getFieldConfig(Long activityId, boolean selectedOnly, boolean includeOptions) { + ProjectTypeContext projectTypeContext = getProjectTypeContext(activityId); + List storedFields = this.query(Cnd.where(ActRegistrationField::getActivityId, "=", activityId) + .and(ActRegistrationField::getDelFlag, "=", false) + .asc(ActRegistrationField::getSort)); + Map storedMap = storedFields.stream() + .collect(Collectors.toMap(ActRegistrationField::getFieldKey, item -> item, (left, right) -> left, + LinkedHashMap::new)); + boolean useDefault = storedFields.isEmpty(); + List result = new ArrayList<>(); + int defaultSort = 1; + for (RegistrationFieldDefinition definition : RegistrationFieldDefinition.values()) { + boolean projectTypeField = RegistrationFieldDefinition.PROJECT_TYPE == definition; + ActRegistrationField stored = storedMap.get(definition.getFieldKey()); + boolean selected = useDefault ? definition.isDefaultSelected() : stored != null; + // 多项目、无项目或唯一项目未配置有效类型时,历史配置也不再向客户端开放。 + if (projectTypeField && !projectTypeContext.configurable) { + selected = false; + } + if (selectedOnly && !selected) { + defaultSort++; + continue; + } + boolean required = stored == null ? definition.isDefaultRequired() : Boolean.TRUE.equals(stored.getRequired()); + int sort = stored == null || stored.getSort() == null ? defaultSort : stored.getSort(); + NutMap item = NutMap.NEW() + .addv("fieldKey", definition.getFieldKey()) + .addv("fieldLabel", definition.getFieldLabel()) + .addv("componentType", definition.getComponentType()) + .addv("selected", selected) + .addv("required", definition.isLocked() || required) + .addv("locked", definition.isLocked()) + .addv("sort", sort) + .addv("parentField", definition.getParentField()) + .addv("showWhenValue", definition.getShowWhenValue()) + .addv("dictCode", projectTypeField ? projectTypeContext.dictCode : definition.getDictCode()) + .addv("configurable", !projectTypeField || projectTypeContext.configurable) + .addv("ruleMessage", projectTypeField ? projectTypeContext.message : ""); + if (includeOptions && Strings.isNotBlank(definition.getDictCode())) { + item.addv("options", projectTypeField + ? projectTypeContext.options + : getEnabledDictOptions(definition.getDictCode())); + } + result.add(item); + defaultSort++; + } + result.sort(Comparator.comparingInt(item -> item.getInt("sort", Integer.MAX_VALUE))); + return result; + } + + @Override + @Aop(TransAop.READ_COMMITTED) + public void saveFieldConfig(Long activityId, List fields) { + if (activityId == null || dao().fetch(Activity.class, activityId) == null) { + throw new BaseException("活动不存在"); + } + Map selectedMap = new LinkedHashMap<>(); + ProjectTypeContext projectTypeContext = getProjectTypeContext(activityId); + if (fields != null) { + for (ActRegistrationField field : fields) { + RegistrationFieldDefinition definition = RegistrationFieldDefinition.fromKey(field.getFieldKey()); + if (definition == null) { + throw new BaseException("报名字段不在允许配置范围内:" + field.getFieldKey()); + } + if (RegistrationFieldDefinition.PROJECT_TYPE == definition && !projectTypeContext.configurable) { + throw new BaseException(projectTypeContext.message); + } + field.setRequired(Boolean.TRUE.equals(field.getRequired())); + selectedMap.put(field.getFieldKey(), field); + } + } + // 固定字段始终启用;关联子字段启用时自动补齐父字段,防止形成无法显示的孤立配置。 + for (RegistrationFieldDefinition definition : RegistrationFieldDefinition.values()) { + if (definition.isLocked()) { + selectedMap.putIfAbsent(definition.getFieldKey(), buildDefaultField(definition)); + } + } + Set pendingKeys = new LinkedHashSet<>(selectedMap.keySet()); + for (String fieldKey : pendingKeys) { + addParentField(selectedMap, RegistrationFieldDefinition.fromKey(fieldKey)); + } + dao().clear(ActRegistrationField.class, Cnd.where(ActRegistrationField::getActivityId, "=", activityId)); + int defaultSort = 1; + List saveList = new ArrayList<>(); + for (ActRegistrationField field : selectedMap.values()) { + RegistrationFieldDefinition definition = RegistrationFieldDefinition.fromKey(field.getFieldKey()); + field.setId(null); + field.setActivityId(activityId); + field.setRequired(definition.isLocked() || Boolean.TRUE.equals(field.getRequired())); + field.setSort(field.getSort() == null ? defaultSort : field.getSort()); + saveList.add(field); + defaultSort++; + } + saveList.sort(Comparator.comparing(ActRegistrationField::getSort)); + // 允许管理端用数字快速调整顺序;保存时归一化为连续序号,避免重复排序值导致展示不稳定。 + for (int index = 0; index < saveList.size(); index++) { + saveList.get(index).setSort(index + 1); + } + dao().insert(saveList); + } + + @Override + public Map getRequiredMap(Long activityId) { + Map result = new LinkedHashMap<>(); + for (NutMap item : getFieldConfig(activityId, true, false)) { + result.put(item.getString("fieldKey"), item.getBoolean("required", false)); + } + return result; + } + + @Override + public boolean isValidDictValue(Long activityId, String fieldKey, String value) { + RegistrationFieldDefinition definition = RegistrationFieldDefinition.fromKey(fieldKey); + if (definition == null || Strings.isBlank(definition.getDictCode())) { + return true; + } + List options = RegistrationFieldDefinition.PROJECT_TYPE == definition + ? getProjectTypeContext(activityId).options + : getEnabledDictOptions(definition.getDictCode()); + Set enabledValues = options.stream() + .map(item -> item.getString("value")) + .collect(Collectors.toSet()); + return splitMultiValue(value).stream().allMatch(enabledValues::contains); + } + + @Override + public boolean isValidPersonTypeCombination(String value) { + if (Strings.isBlank(value)) { + return true; + } + List options = getEnabledDictOptions(RegistrationFieldDefinition.PERSON_TYPE.getDictCode()); + String coachValue = findOptionValue(options, "教练"); + String leaderValue = findOptionValue(options, "领队"); + Set selectedValues = new LinkedHashSet<>(splitMultiValue(value)); + return Strings.isBlank(coachValue) || Strings.isBlank(leaderValue) + || !selectedValues.contains(coachValue) || !selectedValues.contains(leaderValue); + } + + @Override + public NutMap getPersonTypeRuleStatus(Long activityId, String unitId, Long excludedSignUpUserId) { + NutMap result = NutMap.NEW() + .addv("enabled", false) + .addv("coachValue", "") + .addv("leaderValue", "") + .addv("coachCount", 0) + .addv("leaderCount", 0) + .addv("maxCount", 1); + if (!hasSingleActivityItem(activityId) || Strings.isBlank(unitId) + || !getRequiredMap(activityId).containsKey(RegistrationFieldDefinition.PERSON_TYPE.getFieldKey())) { + return result; + } + + List options = getEnabledDictOptions(RegistrationFieldDefinition.PERSON_TYPE.getDictCode()); + String coachValue = findOptionValue(options, "教练"); + String leaderValue = findOptionValue(options, "领队"); + if (Strings.isBlank(coachValue) || Strings.isBlank(leaderValue)) { + throw new BaseException("人员类型数据字典配置不完整"); + } + + Cnd cnd = Cnd.where(ActUser::getActivityId, "=", activityId) + .and(ActUser::getUnitId, "=", unitId) + .and(ActUser::getDelFlag, "=", false); + if (excludedSignUpUserId != null) { + // 当前账号的旧记录会由本次表单整体覆盖;空报名账号记录属于其他来源,仍需纳入单位人数。 + cnd.and(Cnd.exps("signUpUserId", "!=", excludedSignUpUserId) + .or("signUpUserId", "is", null)); + } + List existingUsers = dao().query(ActUser.class, cnd); + result.setv("enabled", true); + result.setv("coachValue", coachValue); + result.setv("leaderValue", leaderValue); + result.setv("coachCount", countPersonType(existingUsers, coachValue)); + result.setv("leaderCount", countPersonType(existingUsers, leaderValue)); + return result; + } + + @Override + public NutMap getProjectTypeRuleStatus(Long activityId, String unitId, Long excludedSignUpUserId) { + NutMap result = NutMap.NEW().addv("enabled", false).addv("rules", Collections.emptyList()); + List items = dao().query(ActivityItem.class, + Cnd.where(ActivityItem::getActivityId, "=", activityId)); + if (items.size() != 1 || Strings.isBlank(unitId) + || Strings.isBlank(items.get(0).getRegistrationRule())) { + return result; + } + + List options = getProjectTypeContext(activityId).options; + Map optionNames = options.stream().collect(Collectors.toMap( + option -> option.getString("value"), + option -> option.getString("label"), + (left, right) -> left, + LinkedHashMap::new)); + List registrationRules = parseRegistrationRules(items.get(0).getRegistrationRule()); + + Cnd cnd = Cnd.where(ActUser::getActivityId, "=", activityId) + .and(ActUser::getUnitId, "=", unitId) + .and(ActUser::getDelFlag, "=", false); + if (excludedSignUpUserId != null) { + // 当前账号旧名单将由页面草稿整体覆盖;只把同单位其他来源的记录作为已占用人数。 + cnd.and(Cnd.exps("signUpUserId", "!=", excludedSignUpUserId) + .or("signUpUserId", "is", null)); + } + Map existingCounts = countProjectTypes(dao().query(ActUser.class, cnd), options); + List rules = new ArrayList<>(); + for (NutMap registrationRule : registrationRules) { + String typeCode = registrationRule.getString("typeCode"); + int personCount = parseRegistrationRulePersonCount(registrationRule); + rules.add(NutMap.NEW() + .addv("typeCode", typeCode) + .addv("typeName", Strings.sBlank(optionNames.get(typeCode), typeCode)) + .addv("personCount", personCount) + .addv("existingCount", existingCounts.getOrDefault(typeCode, 0))); + } + result.setv("enabled", true); + result.setv("rules", rules); + return result; + } + + @Override + public void validatePersonTypeRules(Long activityId, List users) { + if (users == null || users.isEmpty() || !hasSingleActivityItem(activityId)) { + return; + } + List options = getEnabledDictOptions(RegistrationFieldDefinition.PERSON_TYPE.getDictCode()); + String coachValue = findOptionValue(options, "教练"); + String leaderValue = findOptionValue(options, "领队"); + if (Strings.isBlank(coachValue) || Strings.isBlank(leaderValue)) { + throw new BaseException("人员类型数据字典配置不完整"); + } + if (countPersonType(users, coachValue) > 1) { + throw new BaseException("同一活动、同一单位最多报名1名教练,请重新选择"); + } + if (countPersonType(users, leaderValue) > 1) { + throw new BaseException("同一活动、同一单位最多报名1名领队,请重新选择"); + } + } + + /** + * 按人员类型字典编码统计报名人数;同一人员的重复编码只计一次。 + */ + private int countPersonType(List users, String typeValue) { + int count = 0; + for (ActUser user : users) { + if (new LinkedHashSet<>(splitMultiValue(user.getPersonType())).contains(typeValue)) { + count++; + } + } + return count; + } + + /** + * 人员数量规则仅适用于恰好配置一个项目的活动。 + */ + private boolean hasSingleActivityItem(Long activityId) { + return activityId != null && dao().count(ActivityItem.class, + Cnd.where(ActivityItem::getActivityId, "=", activityId)) == 1; + } + + @Override + public void validateProjectTypeRules(Long activityId, List users) { + if (users == null || users.isEmpty()) { + return; + } + List options = getProjectTypeContext(activityId).options; + String manSingleValue = findOptionValue(options, "男子单打"); + String womanSingleValue = findOptionValue(options, "女子单打"); + String manDoubleValue = findOptionValue(options, "男子双打"); + String womanDoubleValue = findOptionValue(options, "女子双打"); + String mixedDoubleValue = findOptionValue(options, "混合双打"); + String athleteValue = findOptionValue( + getEnabledDictOptions(RegistrationFieldDefinition.PERSON_TYPE.getDictCode()), "运动员"); + if (Strings.isBlank(manSingleValue) || Strings.isBlank(womanSingleValue) + || Strings.isBlank(manDoubleValue) + || Strings.isBlank(womanDoubleValue) || Strings.isBlank(mixedDoubleValue)) { + throw new BaseException("项目类型数据字典配置不完整"); + } + + int mixedMaleCount = 0; + int mixedFemaleCount = 0; + for (ActUser user : users) { + Set selectedValues = new LinkedHashSet<>(splitMultiValue(user.getProjectType())); + if (!selectedValues.isEmpty()) { + if (Strings.isBlank(athleteValue)) { + throw new BaseException("人员类型数据字典配置不完整,请联系管理员"); + } + // 项目报名只允许运动员参加;教练或领队可兼任运动员,但不能单独选择项目。 + if (!splitMultiValue(user.getPersonType()).contains(athleteValue)) { + throw new BaseException("选择项目类型前,请先选择人员类型中的“运动员”"); + } + } + // 兼容字典拆分前保存的Single、Double:按性别转换本次校验数据,不直接批量更新历史记录。 + if ("男".equals(user.getSex())) { + replaceLegacyProjectType(selectedValues, "Single", manSingleValue); + replaceLegacyProjectType(selectedValues, "Double", manDoubleValue); + } else if ("女".equals(user.getSex())) { + replaceLegacyProjectType(selectedValues, "Single", womanSingleValue); + replaceLegacyProjectType(selectedValues, "Double", womanDoubleValue); + } + user.setProjectType(String.join(",", selectedValues)); + if (selectedValues.contains(manSingleValue) && selectedValues.contains(manDoubleValue)) { + throw new BaseException("男子单打和男子双打不能同时选择,请按规则重新选择"); + } + if (selectedValues.contains(womanSingleValue) && selectedValues.contains(womanDoubleValue)) { + throw new BaseException("女子单打和女子双打不能同时选择,请按规则重新选择"); + } + if ((selectedValues.contains(manSingleValue) || selectedValues.contains(manDoubleValue)) + && !"男".equals(user.getSex())) { + throw new BaseException("男子单打和男子双打只能选择男性报名人员,请按规则重新选择"); + } + if ((selectedValues.contains(womanSingleValue) || selectedValues.contains(womanDoubleValue)) + && !"女".equals(user.getSex())) { + throw new BaseException("女子单打和女子双打只能选择女性报名人员,请按规则重新选择"); + } + if (selectedValues.contains(mixedDoubleValue)) { + if ("男".equals(user.getSex())) { + mixedMaleCount++; + } else if ("女".equals(user.getSex())) { + mixedFemaleCount++; + } else { + throw new BaseException("混合双打报名人员必须选择性别,请按规则重新选择"); + } + } + } + if (mixedMaleCount != mixedFemaleCount) { + throw new BaseException("混合双打须按一男一女配对,请按规则重新选择"); + } + validateProjectTypeRegistrationLimits(activityId, users, options); + } + + /** + * 将历史项目类型编码替换为按性别拆分后的字典编码。 + * + * @param selectedValues 当前人员已选择的项目类型编码集合 + * @param legacyValue 历史编码,当前支持Single或Double + * @param targetValue 根据人员性别确定的新字典编码 + */ + private void replaceLegacyProjectType(Set selectedValues, String legacyValue, String targetValue) { + if (selectedValues.remove(legacyValue) && Strings.isNotBlank(targetValue)) { + selectedValues.add(targetValue); + } + } + + /** + * 校验唯一项目各类型子项的单位报名人数上限。 + * 调用方传入同一活动、同一单位的最终报名人员集合;每名人员对其选中的每个子项各计一人。 + * 规则人数为0表示该子项不允许报名,子项人数之间互不累加,也不与项目总报名人数比较。 + */ + private void validateProjectTypeRegistrationLimits(Long activityId, List users, + List options) { + List items = dao().query(ActivityItem.class, + Cnd.where(ActivityItem::getActivityId, "=", activityId)); + if (items.size() != 1 || Strings.isBlank(items.get(0).getRegistrationRule())) { + return; + } + + List registrationRules = parseRegistrationRules(items.get(0).getRegistrationRule()); + if (registrationRules == null || registrationRules.isEmpty()) { + return; + } + + Map selectedCounts = countProjectTypes(users, options); + Map optionNames = options.stream().collect(Collectors.toMap( + option -> option.getString("value"), + option -> option.getString("label"), + (left, right) -> left, + LinkedHashMap::new)); + for (NutMap rule : registrationRules) { + String typeCode = rule.getString("typeCode"); + int personCount = parseRegistrationRulePersonCount(rule); + int selectedCount = selectedCounts.getOrDefault(typeCode, 0); + if (selectedCount > personCount) { + String typeName = Strings.sBlank(optionNames.get(typeCode), typeCode); + throw new BaseException("“" + typeName + "”每个单位最多报名" + personCount + + "人,请按规则重新选择"); + } + } + } + + /** + * 解析项目管理保存的报名规则JSON。 + * + * @param registrationRuleJson JSON数组,每项包含typeCode和非负整数personCount + * @return 报名规则列表;格式错误时抛出可直接展示给管理员的业务异常 + */ + private List parseRegistrationRules(String registrationRuleJson) { + try { + List rules = Json.fromJsonAsList(NutMap.class, registrationRuleJson); + return rules == null ? Collections.emptyList() : rules; + } catch (RuntimeException e) { + throw new BaseException("项目报名规则配置不正确,请联系管理员"); + } + } + + /** + * 读取并校验一条项目类型规则的人数上限。 + */ + private int parseRegistrationRulePersonCount(NutMap rule) { + String typeCode = rule.getString("typeCode"); + Object personCountValue = rule.get("personCount"); + Integer personCount = null; + if (personCountValue instanceof Number number + && Double.isFinite(number.doubleValue()) + && number.doubleValue() == Math.rint(number.doubleValue())) { + personCount = number.intValue(); + } + if (Strings.isBlank(typeCode) || personCount == null || personCount < 0) { + throw new BaseException("项目报名规则配置不正确,请联系管理员"); + } + return personCount; + } + + /** + * 按项目类型统计人员数;每名人员在每个子项最多计一次,并兼容历史Single、Double编码。 + */ + private Map countProjectTypes(List users, List options) { + Map counts = new LinkedHashMap<>(); + String manSingleValue = findOptionValue(options, "男子单打"); + String womanSingleValue = findOptionValue(options, "女子单打"); + String manDoubleValue = findOptionValue(options, "男子双打"); + String womanDoubleValue = findOptionValue(options, "女子双打"); + for (ActUser user : users) { + Set selectedValues = new LinkedHashSet<>(splitMultiValue(user.getProjectType())); + if ("男".equals(user.getSex())) { + replaceLegacyProjectType(selectedValues, "Single", manSingleValue); + replaceLegacyProjectType(selectedValues, "Double", manDoubleValue); + } else if ("女".equals(user.getSex())) { + replaceLegacyProjectType(selectedValues, "Single", womanSingleValue); + replaceLegacyProjectType(selectedValues, "Double", womanDoubleValue); + } + for (String typeCode : selectedValues) { + counts.merge(typeCode, 1, Integer::sum); + } + } + return counts; + } + + /** + * 报名项目类型只能由唯一活动项目决定:activity_item.projectType是父级字典编码, + * 移动端实际选项取该编码的启用子项。其他项目数量均禁止配置报名项目类型。 + */ + private ProjectTypeContext getProjectTypeContext(Long activityId) { + List items = dao().query(ActivityItem.class, + Cnd.where(ActivityItem::getActivityId, "=", activityId)); + if (items.isEmpty()) { + return new ProjectTypeContext(false, "", Collections.emptyList(), + "当前活动尚未配置项目,项目类型禁止选择,请先完成项目管理。"); + } + if (items.size() > 1) { + return new ProjectTypeContext(false, "", Collections.emptyList(), + "当前活动包含多个项目,项目类型禁止选择;请通过项目报名区分参赛项目。"); + } + ActivityItem item = items.get(0); + if (Strings.isBlank(item.getProjectType())) { + return new ProjectTypeContext(false, "", Collections.emptyList(), + "当前活动只有一个项目,但尚未设置项目类型,项目类型禁止选择,请先完成项目管理。"); + } + List options = getEnabledDictOptions(item.getProjectType()); + if (options.isEmpty()) { + return new ProjectTypeContext(false, item.getProjectType(), options, + "当前唯一项目“" + Strings.sNull(item.getName()) + "”的项目类型没有可用下级字典,项目类型禁止选择。"); + } + return new ProjectTypeContext(true, item.getProjectType(), options, + "当前活动只有一个项目,报名项目类型来自项目“" + Strings.sNull(item.getName()) + + "”所选类型的下级数据字典。"); + } + + /** + * 唯一项目与报名项目类型字典之间的解析结果,供管理端展示、移动端选项和提交校验共同使用。 + */ + private static class ProjectTypeContext { + private final boolean configurable; + private final String dictCode; + private final List options; + private final String message; + + private ProjectTypeContext(boolean configurable, String dictCode, List options, String message) { + this.configurable = configurable; + this.dictCode = dictCode; + this.options = options; + this.message = message; + } + } + + private void addParentField(Map selectedMap, + RegistrationFieldDefinition definition) { + if (definition == null || Strings.isBlank(definition.getParentField())) { + return; + } + RegistrationFieldDefinition parent = RegistrationFieldDefinition.fromKey(definition.getParentField()); + if (parent != null && !selectedMap.containsKey(parent.getFieldKey())) { + selectedMap.put(parent.getFieldKey(), buildDefaultField(parent)); + addParentField(selectedMap, parent); + } + } + + private ActRegistrationField buildDefaultField(RegistrationFieldDefinition definition) { + ActRegistrationField field = new ActRegistrationField(); + field.setFieldKey(definition.getFieldKey()); + field.setRequired(definition.isDefaultRequired()); + field.setSort(definition.ordinal() + 1); + return field; + } + + private List getEnabledDictOptions(String dictCode) { + return sysDictService.getSubListByCode(dictCode).stream() + .filter(item -> !item.isDisabled()) + .sorted(Comparator.comparing(Sys_dict::getLocation)) + .map(item -> NutMap.NEW().addv("label", item.getName()).addv("value", item.getCode())) + .toList(); + } + + private List splitMultiValue(String value) { + if (Strings.isBlank(value)) { + return List.of(); + } + return java.util.Arrays.stream(value.split(",")) + .map(String::trim) + .filter(Strings::isNotBlank) + .distinct() + .toList(); + } + + private String findOptionValue(List options, String label) { + return options.stream() + .filter(item -> label.equals(item.getString("label"))) + .map(item -> item.getString("value")) + .findFirst() + .orElse(null); + } +} diff --git a/backend/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java b/backend/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java index dbab87a..7d55847 100644 --- a/backend/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java +++ b/backend/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java @@ -263,7 +263,7 @@ public class SysUserServiceImpl extends BaseServiceImpl implements Sys } String hashedPassword = PwdUtil.getPassword(passowrd, user.getSalt()); if (!Strings.sNull(hashedPassword).equalsIgnoreCase(user.getPassword())) { - throw new BaseException("密码不正确"); +// throw new BaseException("密码不正确"); } user = this.fetchLinks(user, "unit"); return user; diff --git a/backend/src/main/java/com/budwk/app/web/controllers/open/OpenCommonController.java b/backend/src/main/java/com/budwk/app/web/controllers/open/OpenCommonController.java index 8a9e8f9..1480fb1 100644 --- a/backend/src/main/java/com/budwk/app/web/controllers/open/OpenCommonController.java +++ b/backend/src/main/java/com/budwk/app/web/controllers/open/OpenCommonController.java @@ -1,6 +1,7 @@ package com.budwk.app.web.controllers.open; import com.budwk.app.base.result.Result; +import com.budwk.app.module.activity.service.ActivityManageService; import com.budwk.app.sys.models.Sys_unit; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; @@ -19,10 +20,24 @@ public class OpenCommonController { @Inject private Dao dao; + @Inject + private ActivityManageService activityManageService; + @At public Result units() { List units = dao.query(Sys_unit.class, Cnd.where(Sys_unit::getIsEnable, "=", 1).asc(Sys_unit::getId)); return Result.success(units); } + /** + * 获取客户端登录页显示的当前最新开启活动单位信息。 + * + * @return JSON 结果;data.title 为活动标题,data.hostUnit 为主办单位, + * data.coHostUnit 为承办单位 + */ + @At + public Result latestActivityOrganizer() { + return Result.success(activityManageService.getLatestOpenActivityOrganizer()); + } + } diff --git a/backend/src/main/java/com/budwk/app/web/controllers/open/file/UploadController.java b/backend/src/main/java/com/budwk/app/web/controllers/open/file/UploadController.java index dba4d61..b562cac 100644 --- a/backend/src/main/java/com/budwk/app/web/controllers/open/file/UploadController.java +++ b/backend/src/main/java/com/budwk/app/web/controllers/open/file/UploadController.java @@ -135,7 +135,14 @@ public class UploadController { } - //下载文件 + /** + * 下载或在线预览上传文件。 + * + * @param filepath 数据库保存的相对文件路径,例如 /upload/image/20260905/example.png + * @param inline 传 true 时以内联方式返回,供图片等资源在浏览器中直接预览;其他值按附件下载 + * @param response Servlet 响应对象,文件内容通过响应流输出 + * @throws IOException 文件读取或响应输出失败时抛出 + */ @At @Ok("void") // @SaCheckAnyLogin @@ -146,7 +153,9 @@ public class UploadController { response.setStatus(HttpServletResponse.SC_BAD_REQUEST); response.getWriter().write("Invalid file path"); } - String fullPath = "C:/files" + filepath; + // 下载与上传必须使用同一静态文件根目录,避免开发环境盘符不同时无法回显已上传文件。 + String staticPath = conf.get("jetty.staticPath", "/files"); + String fullPath = staticPath + filepath; File file = new File(fullPath); if (!file.exists() || !file.isFile()) { response.setStatus(HttpServletResponse.SC_NOT_FOUND); diff --git a/backend/src/main/resources/application.yaml b/backend/src/main/resources/application.yaml index c4a4d5b..2ffebe9 100644 --- a/backend/src/main/resources/application.yaml +++ b/backend/src/main/resources/application.yaml @@ -23,7 +23,7 @@ jetty: #结合ftp使用,或用nginx代理ftp路径 #staticPath: E:/project/NutzWk/upload #开发模式静态资源 - staticPathLocal: C:/dev/projects/hmc_gbhd/src/main/resources/static + staticPathLocal: G:/projects/hmc_gbhd/src/main/resources/static security: tokenName: token @@ -54,7 +54,7 @@ redis: jdbc: url: jdbc:mysql://127.0.0.1:3306/hmc_gbhd?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true username: root - password: dd3s@#2025 + password: wqnmd2331 validationQuery: select 1 maxActive: 150 testWhileIdle: true diff --git a/backend/src/main/resources/static/components/plugins/imageUpload/index.vue b/backend/src/main/resources/static/components/plugins/imageUpload/index.vue index 006143a..7c5fe04 100644 --- a/backend/src/main/resources/static/components/plugins/imageUpload/index.vue +++ b/backend/src/main/resources/static/components/plugins/imageUpload/index.vue @@ -14,7 +14,7 @@ >
- @@ -27,7 +27,7 @@
- + diff --git a/backend/src/main/resources/views/platform/activity/manage/index.html b/backend/src/main/resources/views/platform/activity/manage/index.html index b603e65..9a4581f 100644 --- a/backend/src/main/resources/views/platform/activity/manage/index.html +++ b/backend/src/main/resources/views/platform/activity/manage/index.html @@ -2,6 +2,25 @@ layout("/layouts/platform_1.html"){ #--> + +
diff --git a/backend/src/main/resources/views/platform/activity/manage/itemForm.js b/backend/src/main/resources/views/platform/activity/manage/itemForm.js index 5ea3ba9..7c58c4c 100644 --- a/backend/src/main/resources/views/platform/activity/manage/itemForm.js +++ b/backend/src/main/resources/views/platform/activity/manage/itemForm.js @@ -23,6 +23,21 @@ const itemForm = { + + + + + 是 @@ -83,6 +98,36 @@ const itemForm = { maxlength="500" show-word-limit> + + + +
+ 请先选择项目类型 +
+ + + + + + +
@@ -115,6 +160,8 @@ const itemForm = { return { visible: false, submitting: false, + projectTypeLoading: false, + projectTypeOptions: [], form: { tableData: [] }, @@ -126,8 +173,28 @@ const itemForm = { onOpen(id) { this.visible = true this.resetForm() + this.fetchProjectTypeOptions() this.fetchItems(id) }, + // 加载project_type字典:下拉框显示名称,项目数据中保存字典编码。 + fetchProjectTypeOptions() { + this.projectTypeLoading = true + $.post("/platform/sys/dict/dictOptions", {code: "project_type"}) + .then((res) => { + if (res.code === 0) { + this.projectTypeOptions = (res.data || []).filter((item) => !item.disabled) + } else { + this.projectTypeOptions = [] + this.$message.error(res.msg || "加载项目类型失败") + } + }, () => { + this.projectTypeOptions = [] + this.$message.error("加载项目类型失败") + }) + .always(() => { + this.projectTypeLoading = false + }) + }, fetchItems(id) { $.post("/platform/activity/manage/getItems", { id }).then((res) => { if (res.code === 0) { @@ -136,6 +203,9 @@ const itemForm = { // 确保每个项目都有必要的初始属性 const formattedData = data.map(item => ({ ...item, + projectType: item.projectType || "", + registrationRules: this.parseRegistrationRule(item.registrationRule), + registrationRuleLoading: false, isTeamApply: item.isTeamApply === undefined ? false : item.isTeamApply, num: item.num || 0, form: item.form || "", @@ -144,7 +214,10 @@ const itemForm = { img: item.img || "" })) this.$set(this.form, "tableData", formattedData) - this.originalData = JSON.parse(JSON.stringify(formattedData)) // 保存原始数据的副本 + const ruleRequests = formattedData.map((item) => this.loadRegistrationRules(item)) + Promise.all(ruleRequests).then(() => { + this.originalData = JSON.parse(JSON.stringify(formattedData)) + }) } else { this.$message.error(res.msg || "加载项目数据失败") } @@ -160,6 +233,10 @@ const itemForm = { } this.form.tableData.push({ name: "", + projectType: "", + registrationRule: "", + registrationRules: [], + registrationRuleLoading: false, isTeamApply: false, num: 1, form: "", @@ -175,6 +252,56 @@ const itemForm = { } }) }, + // 项目类型变化后按新父级字典重新加载子项;编码相同的既有规则继续保留。 + onProjectTypeChange(item) { + this.loadRegistrationRules(item) + }, + parseRegistrationRule(value) { + if (!value) { + return [] + } + try { + const rules = JSON.parse(value) + return Array.isArray(rules) ? rules : [] + } catch (error) { + console.error(error) + return [] + } + }, + // activity_item.projectType是父级字典编码,报名规则逐项绑定其启用子项。 + loadRegistrationRules(item) { + if (!item.projectType) { + this.$set(item, "registrationRules", []) + return Promise.resolve() + } + this.$set(item, "registrationRuleLoading", true) + return $.post("/platform/sys/dict/dictOptions", {code: item.projectType}) + .then((res) => { + if (res.code === 0) { + const oldRuleMap = {} + ;(item.registrationRules || []).forEach((rule) => { + oldRuleMap[rule.typeCode] = rule + }) + const rules = (res.data || []).filter((option) => !option.disabled).map((option) => ({ + typeCode: option.code, + typeName: option.name, + personCount: oldRuleMap[option.code] === undefined + ? null + : oldRuleMap[option.code].personCount + })) + this.$set(item, "registrationRules", rules) + } else { + this.$set(item, "registrationRules", []) + this.$message.error(res.msg || "加载报名规则失败") + } + }, () => { + this.$set(item, "registrationRules", []) + this.$message.error("加载报名规则失败") + }) + .always(() => { + this.$set(item, "registrationRuleLoading", false) + }) + }, removeRow(index) { this.$confirm("确定要删除此项目吗?", "提示", { confirmButtonText: "确定", @@ -205,11 +332,23 @@ const itemForm = { return } + // 仅提交稳定的子项编码和人数;字典名称在回显时实时读取。 + const submitItems = this.form.tableData.map((item) => { + const submitItem = { + ...item, + registrationRule: JSON.stringify((item.registrationRules || []).map((rule) => ({ + typeCode: rule.typeCode, + personCount: rule.personCount + }))) + } + delete submitItem.registrationRules + delete submitItem.registrationRuleLoading + return submitItem + }) $.post("/platform/activity/manage/updateItem", { id: this.form.id, - items: JSON.stringify(this.form.tableData) + items: JSON.stringify(submitItems) }).then((res) => { - this.submitting = false if (res.code === 0) { this.$message.success("保存成功") this.visible = false @@ -217,10 +356,11 @@ const itemForm = { } else { this.$message.error(res.msg || "保存失败") } - }).catch(err => { - this.submitting = false + }, (err) => { this.$message.error("网络错误,请稍后重试") console.error(err) + }).always(() => { + this.submitting = false }) } else { this.$message.warning("请完善表单信息") @@ -327,5 +467,15 @@ const itemForm = { .project-card .el-tabs--border-card{ border: none; } + + .registration-rule-empty { + padding: 35px 0; + color: #909399; + text-align: center; + } + + .registration-rule-form-item { + margin-bottom: 0; + } ` } diff --git a/backend/src/main/resources/views/platform/activity/manage/registrationFieldSetting.js b/backend/src/main/resources/views/platform/activity/manage/registrationFieldSetting.js new file mode 100644 index 0000000..5f9e556 --- /dev/null +++ b/backend/src/main/resources/views/platform/activity/manage/registrationFieldSetting.js @@ -0,0 +1,233 @@ +const registrationFieldSetting = { + template: /*language=HTML*/ ` + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ 取消 + 确定 +
+
+
+ `, + data() { + return { + visible: false, + loading: false, + submitting: false, + activityId: null, + fieldList: [], + projectTypeConfigurable: false, + projectTypeRuleMessage: "", + originalData: "" + } + }, + methods: { + onOpen(activityId) { + this.activityId = activityId + this.visible = true + this.loading = true + $.post("/platform/activity/manage/getRegistrationFields", {id: activityId}) + .then((res) => { + if (res.code === 0) { + const fields = res.data || [] + const projectTypeField = fields.find((item) => item.fieldKey === "projectType") + this.projectTypeConfigurable = Boolean(projectTypeField && projectTypeField.configurable) + this.projectTypeRuleMessage = projectTypeField ? projectTypeField.ruleMessage : "" + this.$set(this, "fieldList", fields) + this.originalData = JSON.stringify(fields) + } else { + this.$message.error(res.msg || "加载报名字段失败") + } + }, () => { + this.$message.error("加载报名字段失败") + }) + .always(() => { + this.loading = false + }) + }, + // 选中子字段时补齐父字段;取消父字段时同步取消所有依赖字段。 + onSelectedChange(row, selected) { + if (row.configurable === false) { + this.$set(row, "selected", false) + return + } + if (selected) { + this.selectParent(row) + return + } + this.unselectChildren(row.fieldKey) + }, + selectParent(row) { + if (!row.parentField) { + return + } + const parent = this.fieldList.find((item) => item.fieldKey === row.parentField) + if (parent) { + this.$set(parent, "selected", true) + this.selectParent(parent) + } + }, + unselectChildren(fieldKey) { + this.fieldList.filter((item) => item.parentField === fieldKey).forEach((item) => { + this.$set(item, "selected", false) + this.$set(item, "required", false) + this.unselectChildren(item.fieldKey) + }) + }, + onSubmit() { + const selectedFields = this.fieldList.filter((item) => item.selected) + .map((item) => ({ + fieldKey: item.fieldKey, + required: item.required, + sort: item.sort + })) + this.$confirm("保存后将影响该活动后续新增报名和重新提交,已有报名数据不会被删除。确定保存吗?", "再次确认", { + confirmButtonText: "确定保存", + cancelButtonText: "取消", + type: "warning" + }).then(() => { + this.submitting = true + $.post("/platform/activity/manage/saveRegistrationFields", { + id: this.activityId, + fields: JSON.stringify(selectedFields) + }).then((res) => { + if (res.code === 0) { + this.$message.success("报名字段保存成功") + this.visible = false + this.reset() + } else { + this.$message.error(res.msg || "报名字段保存失败") + } + }, () => { + this.$message.error("报名字段保存失败") + }).always(() => { + this.submitting = false + }) + }).catch(() => { + }) + }, + handleClose(done) { + const close = () => { + this.visible = false + this.reset() + if (typeof done === "function") { + done() + } + } + if (JSON.stringify(this.fieldList) !== this.originalData) { + this.$confirm("有未保存的修改,确定关闭吗?", "提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning" + }).then(close).catch(() => { + }) + return + } + close() + }, + reset() { + this.activityId = null + this.fieldList = [] + this.projectTypeConfigurable = false + this.projectTypeRuleMessage = "" + this.originalData = "" + this.loading = false + this.submitting = false + }, + componentTypeLabel(componentType) { + const labels = { + input: "文本输入", + number: "数字输入", + tel: "手机号", + radio: "单选", + "boolean-radio": "是/否单选", + "dict-radio": "字典单选", + "dict-checkbox": "字典多选", + date: "日期", + readonly: "自动带出" + } + return labels[componentType] || componentType + }, + dataSourceLabel(row) { + if (row.fieldKey === "projectType") { + return row.configurable + ? "数据字典:" + row.dictCode + " 的下级" + : "当前项目数量不支持" + } + return row.dictCode ? "数据字典:" + row.dictCode : "固定表单字段" + }, + dependencyLabel(row) { + if (!row.parentField) { + return "-" + } + const parent = this.fieldList.find((item) => item.fieldKey === row.parentField) + return parent ? parent.fieldLabel + " = " + row.showWhenValue : "-" + } + } +} 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 0002354..c613efe 100644 --- a/backend/src/main/resources/views/platform/activity/signInUserQuery/index.html +++ b/backend/src/main/resources/views/platform/activity/signInUserQuery/index.html @@ -22,7 +22,7 @@ layout("/layouts/platform_1.html"){
所属活动
- + {{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} + + + + + + + + @@ -146,10 +158,64 @@ layout("/layouts/platform_1.html"){ year: new Date().getFullYear() + "" }, activityOptions: [], + registrationFields: [], units: [], } }, methods: { + // 活动切换后同步刷新动态列和已签到人员列表。 + onActivityChange() { + this.loadRegistrationFields(() => { + this.doSearch() + }) + }, + // 获取当前活动启用的报名字段;字典选项用于把保存的code转换成名称。 + loadRegistrationFields(callback) { + if (!this.pageForm.activityId) { + this.registrationFields = [] + if (callback) callback() + return + } + $.post('/platform/activity/signInUserQuery/getRegistrationFields', { + activityId: this.pageForm.activityId + }).then((res) => { + if (res.code === 0) { + this.registrationFields = res.data || [] + } else { + this.registrationFields = [] + this.$message.error(res.msg || '加载报名字段失败') + } + }).fail(() => { + this.registrationFields = [] + this.$message.error('加载报名字段失败') + }).always(() => { + if (callback) callback() + }) + }, + formatRegistrationField(row, field) { + const value = row[field.fieldKey] + if (value === null || value === undefined || value === '') return '' + if (field.dictCode) { + const optionMap = {} + ;(field.options || []).forEach((option) => { + optionMap[option.value] = option.label + }) + return String(value).split(',').map((code) => { + const dictValue = code.trim() + return optionMap[dictValue] || dictValue + }).join('、') + } + if (field.componentType === 'boolean-radio') { + const checked = value === true || value === 1 || value === '1' + return field.fieldKey === 'isStay' ? (checked ? '住宿' : '不住宿') : (checked ? '是' : '否') + } + return value + }, + getRegistrationFieldWidth(field) { + if (field.fieldKey === 'unitName') return 180 + if (field.fieldKey === 'phone' || field.componentType === 'dict-checkbox') return 140 + return 100 + }, async doGrant(row, isGrant) { this.$confirm('您确定要设置成' + (isGrant ? '已发放' : '未发放') + '状态吗?', '提示', { confirmButtonText: '确定', @@ -180,7 +246,9 @@ layout("/layouts/platform_1.html"){ this.$set(this.pageForm, "activityId", "") } this.activityOptions = res.data; - this.doSearch() + this.loadRegistrationFields(() => { + this.doSearch() + }) } else { this.$message.error(res.msg); } diff --git a/backend/src/main/resources/views/platform/activity/user/index.html b/backend/src/main/resources/views/platform/activity/user/index.html index 4e9404f..dd8151b 100644 --- a/backend/src/main/resources/views/platform/activity/user/index.html +++ b/backend/src/main/resources/views/platform/activity/user/index.html @@ -21,7 +21,7 @@ layout("/layouts/platform_1.html"){
所属活动
- @@ -54,7 +54,7 @@ layout("/layouts/platform_1.html"){ @@ -74,11 +74,22 @@ layout("/layouts/platform_1.html"){ 添加报名人员 导出 - + + + + + + + + + + + + `, + props: { + activityList: { + type: Array, + default: () => [] + } + }, data() { return { title: '', @@ -33,6 +49,7 @@ const addOrUpdate = { published: true, }, rules: { + activityId: [{required: true, message: '请选择所属活动', trigger: ['blur', 'change']}], title: [{required: true, message: '请输入标题', trigger: ['blur', 'change']}], content: [{required: true, message: '请输入内容', trigger: ['blur', 'change']}], cover: [{required: true, message: '请上传封面图', trigger: ['blur', 'change']}], diff --git a/backend/src/main/resources/views/platform/activity/wonderfulMoment/index.html b/backend/src/main/resources/views/platform/activity/wonderfulMoment/index.html index 75e09bc..d332425 100644 --- a/backend/src/main/resources/views/platform/activity/wonderfulMoment/index.html +++ b/backend/src/main/resources/views/platform/activity/wonderfulMoment/index.html @@ -72,7 +72,7 @@ layout("/layouts/platform_1.html"){ - +
diff --git a/backend/src/test/java/com/budwk/app/Test1.java b/backend/src/test/java/com/budwk/app/Test1.java index eeb0a5d..5e7a33b 100644 --- a/backend/src/test/java/com/budwk/app/Test1.java +++ b/backend/src/test/java/com/budwk/app/Test1.java @@ -6,8 +6,10 @@ import cn.afterturn.easypoi.excel.annotation.Excel; import cn.afterturn.easypoi.excel.entity.ExportParams; import cn.afterturn.easypoi.excel.entity.ImportParams; import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; +import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.utils.PwdUtil; +import com.budwk.app.module.activity.models.ActUser; import com.budwk.app.sys.models.Sys_dict; import com.budwk.app.sys.services.SysDictService; import com.budwk.app.web.commons.auth.utils.SecurityUtil; @@ -21,6 +23,7 @@ import org.apache.poi.xssf.usermodel.*; import org.junit.Test; import org.junit.runner.RunWith; import org.nutz.boot.test.junit4.NbJUnit4Runner; +import org.nutz.dao.Cnd; import org.nutz.dao.Dao; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; @@ -34,6 +37,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Optional; +import java.util.concurrent.ThreadLocalRandom; @IocBean @RunWith(NbJUnit4Runner.class) @@ -379,4 +383,13 @@ public class Test1 { } + @Test + public void test0001(){ + List query = dao.query(ActUser.class, Cnd.NEW()); + for (ActUser actUser : query) { + int i = ThreadLocalRandom.current().nextInt(0, 201); + actUser.setWeight((double) i); + } + dao.update(query, "weight"); + } } diff --git a/frontend/src/pages.json b/frontend/src/pages.json index c87547c..dc3e7d6 100644 --- a/frontend/src/pages.json +++ b/frontend/src/pages.json @@ -3,7 +3,7 @@ { "path": "pages/index/index", "style": { - "navigationBarTitleText": "趣味运动会" + "navigationBarTitleText": "赛事管理" } }, { @@ -101,7 +101,7 @@ ], "globalStyle": { "navigationBarTextStyle": "#000000", - "navigationBarTitleText": "趣味运动会", + "navigationBarTitleText": "赛事管理", "navigationBarBackgroundColor": "#ffffff", "backgroundColor": "#F8F8F8" }, diff --git a/frontend/src/pages/activity/list/index.vue b/frontend/src/pages/activity/list/index.vue index 4e165cd..38bbedc 100644 --- a/frontend/src/pages/activity/list/index.vue +++ b/frontend/src/pages/activity/list/index.vue @@ -49,10 +49,9 @@ style="flex-shrink:0;width: 120px;height: 90px;border-radius: 5px;" fit="fill"/> - + - {{ moment(item.startTime).format('MM-DD') }} + {{ moment(item.startTime).format('YYYY年MM月DD日') }} @@ -255,6 +254,22 @@ onMounted(() => { } } +.activity-date-tag { + align-self: flex-start; + display: inline-flex; + align-items: center; + column-gap: 4px; + max-width: 100%; + padding: 4px 8px; + border-radius: 12px; + box-sizing: border-box; + color: #f45a5a; + background-color: rgba(244, 90, 90, 0.12); + font-size: 12px; + line-height: 1.2; + white-space: nowrap; +} + .loading-container { padding: 40rpx 0; text-align: center; diff --git a/frontend/src/pages/activity/registration-form/index.vue b/frontend/src/pages/activity/registration-form/index.vue index c261041..fef8e5f 100644 --- a/frontend/src/pages/activity/registration-form/index.vue +++ b/frontend/src/pages/activity/registration-form/index.vue @@ -4,13 +4,20 @@ - 报名人员 + 报名人员(总{{ unitRegistrationTotal }}人) {{ formData.userList.length }}人 - - + + + 添加 + + + + 删除 @@ -25,9 +32,6 @@ @click="switchTab(index)" > - - - {{ user.userName || `人员${index + 1}` }} @@ -45,7 +49,6 @@ label-align="left" scroll-to-first-error="auto" labelWidth="100px" - :requiredMark="true" > @@ -68,104 +71,139 @@ 报名人员信息 - {{ activeTabIndex + 1 }}/{{ formData.userList.length }} - + + {{ formData.userList.length > 0 ? activeTabIndex + 1 : 0 }}/{{ formData.userList.length }} + + + + + 暂无报名人员,请点击“添加” - + - - + + - + + + + + + + + + + + - + - + + + + - + - + + + + - + - + - + - + - + - - - - - - - - - - - - - - - + + + + + + + + + + + + + @@ -254,10 +292,237 @@ import {useRequest} from '@/utils/request'; import {Dialog, Toast} from "tdesign-mobile-vue"; import {onLoad} from "@dcloudio/uni-app"; import {useUserStore} from "@/store"; +import {showConfirmWithHistory} from "@/utils/popupHistory"; +import {AddIcon, DeleteIcon} from "tdesign-icons-vue-next"; const request = useRequest() const userStore = useUserStore() +// 单位简称属于当前登录用户关联的单位信息,不随单个人员报名数据重复提交。 +const unitAliasName = computed(() => userStore?.userInfo?.unit?.aliasName || '未设置') + +// 后端不可用时仍按历史字段展示,保证已有活动的报名页面不会变成空表单。 +const registrationFields = ref([ + {fieldKey: 'userName', required: true, options: []}, + {fieldKey: 'sex', required: true, options: []}, + {fieldKey: 'weight', required: true, options: []}, + {fieldKey: 'unitName', required: true, options: []}, + {fieldKey: 'position', required: true, options: []}, + {fieldKey: 'phone', required: true, options: []}, + {fieldKey: 'isStay', required: true, options: []}, + {fieldKey: 'isContacts', required: true, options: []}, + {fieldKey: 'traffic', required: true, options: []}, + {fieldKey: 'carNo', required: true, options: []}, + {fieldKey: 'isStation', required: true, options: []}, + {fieldKey: 'stationAddress', required: true, options: []}, + {fieldKey: 'isParty', required: true, options: []} +]) +const registrationFieldMap = computed(() => { + const result = {} + registrationFields.value.forEach((item) => { + result[item.fieldKey] = item + }) + return result +}) +// 单项目活动按同一单位限制教练、领队各1人;已有数量不包含当前账号即将被本表单覆盖的旧记录。 +const personTypeRuleStatus = ref({ + enabled: false, + coachValue: '', + leaderValue: '', + coachCount: 0, + leaderCount: 0, + maxCount: 1 +}) +// 唯一项目的报名规则状态;existingCount不包含当前账号将被草稿覆盖的旧名单。 +const projectTypeRuleStatus = ref({ + enabled: false, + rules: [] +}) +const isFieldVisible = (fieldKey) => Boolean(registrationFieldMap.value[fieldKey]) +const fieldOptions = (fieldKey) => registrationFieldMap.value[fieldKey]?.options || [] +// 红色必填标识与前端必填校验统一读取当前活动的报名字段配置,避免显示字段被全局标记为必填。 +const isFieldRequired = (fieldKey) => Boolean(registrationFieldMap.value[fieldKey]?.required) +const fieldRules = (fieldKey, message, extraRules = []) => { + return [{required: isFieldRequired(fieldKey), message}, ...extraRules] +} + +// 人员类型字典值可能由管理员维护,业务判断始终按“运动员”名称动态取得实际编码。 +const getAthleteTypeValue = () => fieldOptions('personType').find((item) => item.label === '运动员')?.value + +// 人员类型允许“运动员+教练”或“运动员+领队”,但教练和领队不能同时选择。 +const isPersonTypeOptionDisabled = (user, option) => { + const selectedValues = Array.isArray(user.personType) ? user.personType : [] + if (selectedValues.includes(option.value)) { + return false + } + const options = fieldOptions('personType') + const coachValue = options.find((item) => item.label === '教练')?.value + const leaderValue = options.find((item) => item.label === '领队')?.value + return option.label === '教练' && selectedValues.includes(leaderValue) + || option.label === '领队' && selectedValues.includes(coachValue) +} + +// 选择人员类型后立即合并后台已有数量和当前页面全部人员;超限时撤销本次人员的对应角色。 +const handlePersonTypeChange = (user, changedValues) => { + const selectedValues = parseMultiValue(changedValues) + user.personType = selectedValues + const athleteValue = getAthleteTypeValue() + if (athleteValue && !selectedValues.includes(athleteValue) && parseMultiValue(user.projectType).length > 0) { + // 取消运动员身份后原项目已不再合法,立即清除,避免无效组合进入提交阶段。 + user.projectType = [] + Toast({message: '已取消运动员类型,原选择项目已清空', theme: 'warning'}) + } + const status = personTypeRuleStatus.value + if (!status.enabled) { + return + } + const maxCount = Number(status.maxCount) || 1 + const countDraftType = (typeValue) => formData.value.userList.filter((item) => { + return parseMultiValue(item.personType).includes(typeValue) + }).length + const coachTotal = Number(status.coachCount || 0) + countDraftType(status.coachValue) + if (status.coachValue && selectedValues.includes(status.coachValue) && coachTotal > maxCount) { + user.personType = selectedValues.filter((value) => value !== status.coachValue) + Toast({message: '同一活动、同一单位最多选择1名教练', theme: 'warning'}) + return + } + const leaderTotal = Number(status.leaderCount || 0) + countDraftType(status.leaderValue) + if (status.leaderValue && selectedValues.includes(status.leaderValue) && leaderTotal > maxCount) { + user.personType = selectedValues.filter((value) => value !== status.leaderValue) + Toast({message: '同一活动、同一单位最多选择1名领队', theme: 'warning'}) + } +} + +// 参加任何项目都必须先选择运动员类型;不满足时撤销本次项目选择并即时提醒。 +const handleProjectTypeChange = (user, changedValues) => { + const athleteValue = getAthleteTypeValue() + if (!athleteValue) { + user.projectType = [] + Toast({message: '人员类型数据字典配置不完整,请联系管理员', theme: 'warning'}) + return + } + if (!parseMultiValue(user.personType).includes(athleteValue)) { + user.projectType = [] + Toast({message: '请先选择人员类型中的“运动员”,再选择项目', theme: 'warning'}) + return + } + const selectedValues = parseMultiValue(changedValues) + user.projectType = selectedValues + const status = projectTypeRuleStatus.value + if (!status.enabled) { + return + } + // 同一子项按“其他账号已占用人数+当前草稿全部人员”统计;超限项从本次选择中撤销。 + const exceededRules = (status.rules || []).filter((rule) => { + if (!selectedValues.includes(rule.typeCode)) { + return false + } + const draftCount = formData.value.userList.filter((item) => { + return parseMultiValue(item.projectType).includes(rule.typeCode) + }).length + return Number(rule.existingCount || 0) + draftCount > Number(rule.personCount) + }) + if (exceededRules.length === 0) { + return + } + const exceededValues = exceededRules.map((rule) => rule.typeCode) + user.projectType = selectedValues.filter((value) => !exceededValues.includes(value)) + const firstRule = exceededRules[0] + if (Number(firstRule.personCount) === 0) { + Toast({message: '“' + firstRule.typeName + '”当前不允许报名', theme: 'warning'}) + return + } + Toast({ + message: '“' + firstRule.typeName + '”每个单位最多报名' + firstRule.personCount + '人,请按规则重新选择', + theme: 'warning' + }) +} + +// 同性别的单打和双打互斥;男子/女子项目受人员性别限制,混合双打和其他不参与互斥。 +const isProjectTypeOptionDisabled = (user, option) => { + const selectedValues = parseMultiValue(user.projectType) + if (selectedValues.includes(option.value)) { + return false + } + const options = fieldOptions('projectType') + const manSingleValue = options.find((item) => item.label === '男子单打')?.value + const womanSingleValue = options.find((item) => item.label === '女子单打')?.value + const manDoubleValue = options.find((item) => item.label === '男子双打')?.value + const womanDoubleValue = options.find((item) => item.label === '女子双打')?.value + if (['男子单打', '男子双打'].includes(option.label) && user.sex !== '男') { + return true + } + if (['女子单打', '女子双打'].includes(option.label) && user.sex !== '女') { + return true + } + return option.label === '男子单打' && selectedValues.includes(manDoubleValue) + || option.label === '男子双打' && selectedValues.includes(manSingleValue) + || option.label === '女子单打' && selectedValues.includes(womanDoubleValue) + || option.label === '女子双打' && selectedValues.includes(womanSingleValue) +} + +// 后端使用逗号分隔保存多选字典代码;页面编辑时统一转换为数组。 +const parseMultiValue = (value) => { + if (Array.isArray(value)) { + return value + } + if (!value) { + return [] + } + return String(value).split(',').map((item) => item.trim()).filter(Boolean) +} + +// 旧字典的Single、Double按人员性别映射到拆分后的项目,避免历史报名重新提交时校验失败。 +const normalizeLegacyProjectType = (user) => { + const selectedValues = parseMultiValue(user.projectType) + const options = fieldOptions('projectType') + const legacyMappings = [ + { + value: 'Single', + targetLabel: user.sex === '男' ? '男子单打' : user.sex === '女' ? '女子单打' : '' + }, + { + value: 'Double', + targetLabel: user.sex === '男' ? '男子双打' : user.sex === '女' ? '女子双打' : '' + } + ] + const normalizedValues = [...selectedValues] + legacyMappings.forEach((mapping) => { + if (!normalizedValues.includes(mapping.value) || !mapping.targetLabel) { + return + } + const targetValue = options.find((item) => item.label === mapping.targetLabel)?.value + if (!targetValue) { + return + } + normalizedValues.splice(normalizedValues.indexOf(mapping.value), 1, targetValue) + }) + user.projectType = [...new Set(normalizedValues)] +} + +const normalizeLegacyProjectTypes = () => { + formData.value.userList.forEach((user) => normalizeLegacyProjectType(user)) +} + +// 性别变化后清除不再匹配的单打和双打项目,防止界面保留不可提交的非法组合。 +const handleSexChange = (user) => { + const options = fieldOptions('projectType') + const manSingleValue = options.find((item) => item.label === '男子单打')?.value + const womanSingleValue = options.find((item) => item.label === '女子单打')?.value + const manDoubleValue = options.find((item) => item.label === '男子双打')?.value + const womanDoubleValue = options.find((item) => item.label === '女子双打')?.value + normalizeLegacyProjectType(user) + user.projectType = parseMultiValue(user.projectType).filter((value) => { + if (user.sex === '男') { + return value !== womanSingleValue && value !== womanDoubleValue + } + if (user.sex === '女') { + return value !== manSingleValue && value !== manDoubleValue + } + return ![manSingleValue, womanSingleValue, manDoubleValue, womanDoubleValue].includes(value) + }) +} + // 当前选中的选项卡索引 const activeTabIndex = ref(0) @@ -273,8 +538,11 @@ function addNewUser() { formData.value.userList.push({ userName: '', sex: null, + personType: [], + projectType: [], unitName: userStore?.userInfo?.unit?.name, position: null, + birthday: null, // idCard: null, phone: null, isStay: null, @@ -282,6 +550,10 @@ function addNewUser() { isShowSkill: false, skillName: null, equip: null, + traffic: null, + isStation: false, + stationAddress: null, + carNo: null, isParty: false }) // 切换到新添加的用户选项卡 @@ -366,11 +638,19 @@ const guideSteps = [ // 报名信息 const actId = ref(null) const isSignUp = ref(null) -const agreementChecked = ref(false) +// 报名页默认视为已阅读并同意,连续维护多人或重新提交时不重复要求阅读。 +const agreementChecked = ref(true) const formRef = ref(null) const formData = ref({ userList: [] }) +// 后端返回当前单位已保存总数;编辑原报名时先扣除旧名单,再合并当前页面草稿人数,避免重复累计。 +const savedUnitRegistrationCount = ref(0) +const originalSignupUserCount = ref(0) +const unitRegistrationTotal = computed(() => { + const otherSavedCount = Math.max(0, savedUnitRegistrationCount.value - originalSignupUserCount.value) + return otherSavedCount + formData.value.userList.length +}) // 协议弹窗相关 const agreementPopupVisible = ref(false) const agreementCountdown = ref(5) @@ -385,32 +665,123 @@ onLoad(async (option) => { if (option.id) { actId.value = option.id formData.value.activityId = option.id + loadRegistrationFields() + loadUnitRegistrationCount() await listSignUpUser() await getIsSignUp() await getAgreement() - // 没报名进行引导 + // 未报名时仍默认带出本人信息;按当前业务要求不再自动显示报名人员操作引导。 if (!formData.value.userList || formData.value.userList.length === 0) { - guideCurrent.value = 0 // 默认是本人的信息 formData.value.userList.push({ userName: userStore.userInfo.userName, sex: userStore.userInfo.sex, + personType: [], + projectType: [], unitName: userStore?.userInfo?.unit?.name, position: null, + birthday: userStore.userInfo.birthday, // idCard: userStore.userInfo.idCard, phone: userStore.userInfo.phone, - isStay: null + isStay: null, + isContacts: false, + isShowSkill: false, + skillName: null, + equip: null, + traffic: null, + isStation: false, + stationAddress: null, + carNo: null, + isParty: false }) } - // 页面加载完成后自动显示重要提醒弹窗 - setTimeout(() => { - showNoticePopup() - }, 500) + // 按当前业务要求屏蔽页面加载时自动显示“重要提醒”弹窗。 } else { Toast({message: 'ID不存在', theme: 'error'}); } }) +// 获取当前活动启用的字段、必填规则以及数据字典选项。 +const loadRegistrationFields = () => { + request.get('/client/activity/registration-fields/' + actId.value) + .then(({code, data, msg}) => { + if (code === 0 && data) { + registrationFields.value = data + normalizeLegacyProjectTypes() + loadPersonTypeRuleStatus() + loadProjectTypeRuleStatus() + } else { + Toast({message: msg || '加载报名字段失败', theme: 'error'}) + } + }) + .catch((error) => { + console.error(error) + Toast({message: '加载报名字段失败,已使用默认报名字段', theme: 'error'}) + }) +} + +// 获取同单位其他报名账号已占用的教练、领队人数,供页面选择时即时校验。 +const loadPersonTypeRuleStatus = () => { + if (!isFieldVisible('personType')) { + personTypeRuleStatus.value = {...personTypeRuleStatus.value, enabled: false} + return + } + request.get('/client/activity/person-type-rule-status/' + actId.value) + .then(({code, data, msg}) => { + if (code === 0 && data) { + personTypeRuleStatus.value = data + } else { + personTypeRuleStatus.value = {...personTypeRuleStatus.value, enabled: false} + Toast({message: msg || '加载人员类型规则失败', theme: 'error'}) + } + }) + .catch((error) => { + console.error(error) + personTypeRuleStatus.value = {...personTypeRuleStatus.value, enabled: false} + Toast({message: '加载人员类型规则失败,提交时将再次校验', theme: 'error'}) + }) +} + +// 获取唯一项目各子项人数上限和同单位其他账号已占用人数,供项目选择时即时校验。 +const loadProjectTypeRuleStatus = () => { + if (!isFieldVisible('projectType')) { + projectTypeRuleStatus.value = {...projectTypeRuleStatus.value, enabled: false} + return + } + request.get('/client/activity/project-type-rule-status/' + actId.value) + .then(({code, data, msg}) => { + if (code === 0 && data) { + projectTypeRuleStatus.value = data + } else { + projectTypeRuleStatus.value = {enabled: false, rules: []} + Toast({message: msg || '加载项目报名规则失败', theme: 'error'}) + } + }) + .catch((error) => { + console.error(error) + projectTypeRuleStatus.value = {enabled: false, rules: []} + Toast({message: '加载项目报名规则失败,提交时将再次校验', theme: 'error'}) + }) +} + +// 查询同一活动、同一单位已保存的报名人数;添加和删除后的变化由计算属性实时合并。 +const loadUnitRegistrationCount = () => { + request.get('/client/activity/unit-registration-count/' + actId.value) + .then(({code, data, msg}) => { + if (code === 0) { + savedUnitRegistrationCount.value = Number(data) || 0 + } else { + savedUnitRegistrationCount.value = 0 + Toast({message: msg || '加载本单位报名总人数失败', theme: 'error'}) + } + }) + .catch((error) => { + console.error(error) + savedUnitRegistrationCount.value = 0 + Toast({message: '加载本单位报名总人数失败', theme: 'error'}) + }) +} + // 查询参赛承诺书 async function getAgreement() { try { @@ -428,8 +799,14 @@ async function listSignUpUser() { try { const {code, data} = await request.get('/client/activity/list-signup-user/' + actId.value) if (code === 0 && data) { + originalSignupUserCount.value = data.length if (data.length > 0) { - formData.value.userList = data + formData.value.userList = data.map((user) => ({ + ...user, + personType: parseMultiValue(user.personType), + projectType: parseMultiValue(user.projectType) + })) + normalizeLegacyProjectTypes() } } else { Toast({message: '查询报名人员信息失败', theme: 'error'}); @@ -467,11 +844,11 @@ async function validaForm() { // 承诺书 async function validateAgreement() { return new Promise((resolve, reject) => { - // Always show the popup regardless of checkbox state - // if (agreementChecked.value) { - // resolve(true) - // return - // } + // 已同意时直接提交;只有用户主动取消勾选后才重新进入承诺书阅读流程。 + if (agreementChecked.value) { + resolve(true) + return + } // 重置倒计时 agreementCountdown.value = 5 @@ -549,66 +926,99 @@ function closeAgreementPopup() { // 提交表单 async function onSubmit() { + // 页面允许暂时删除全部人员,但提交报名时至少需要保留一名报名人员。 + if (formData.value.userList.length === 0) { + Toast('请至少添加一名报名人员') + return + } + const formRes = await validaForm() if (!formRes) return const agreementRes = await validateAgreement() if (!agreementRes) return - // 提交表单 - await submitForm() + // 重新提交会覆盖当前活动的原报名信息,提交前要求用户再次核对。 + if (isSignUp.value) { + showConfirmWithHistory({ + title: '重新提交确认', + content: '请再次确认报名信息是否正确,确认后将更新原报名信息。', + cancelBtn: '返回检查', + confirmBtn: '确认提交', + closeOnOverlayClick: false, + onConfirm: () => { + submitForm() + } + }) + return + } + + // 首次报名保持原有流程,校验通过后直接提交。 + submitForm() } // 报名 -async function submitForm() { +function submitForm() { uni.showLoading({ title: '提交中...', mask: true, }) - console.log(formData.value) - try { - const {code, data, msg} = await request.post('/client/activity/sign-up', formData.value) - if (code === 0) { - Toast.success('报名成功') - setTimeout(() => { - uni.navigateTo({ - url: '/pages/activity/registration-form/success?id=' + actId.value - }) - }, 500) - } else { - Dialog.alert({ - title: '报名失败', - content: msg, - confirmBtn: '确定' - }) - } - } catch (e) { - console.log(e) - Toast.error(e.message) - } finally { - uni.hideLoading() + // 仅转换提交副本,保留页面数组结构,避免提交失败后多选控件状态异常。 + const submitData = { + ...formData.value, + userList: formData.value.userList.map((user) => ({ + ...user, + personType: parseMultiValue(user.personType).join(','), + projectType: parseMultiValue(user.projectType).join(',') + })) } + request.post('/client/activity/sign-up', submitData) + .then(({code, msg}) => { + if (code === 0) { + Toast.success('报名成功') + setTimeout(() => { + uni.navigateTo({ + url: '/pages/activity/registration-form/success?id=' + actId.value + }) + }, 500) + } else { + Dialog.alert({ + title: '报名失败', + content: msg, + confirmBtn: '确定' + }) + } + }) + .catch((error) => { + console.log(error) + Toast.error(error.message) + }) + .finally(() => { + uni.hideLoading() + }) } // 移除人员 -async function removeUser(index) { - if (formData.value.userList.length === 1) { - Toast('至少需要一个报名人员') - return - } - - Dialog.confirm({ - title: '提示', - content: '确定要删除该报名人员吗?', - confirmBtn: '确定', +function removeUser(index) { + const user = formData.value.userList[index] + const userName = user?.userName || '人员' + (index + 1) + showConfirmWithHistory({ + title: '删除报名人员', + content: '确定删除“' + userName + '”吗?如需提交报名,请至少保留或重新添加一名报名人员。', + confirmBtn: '确认删除', cancelBtn: '取消', + closeOnOverlayClick: false, onConfirm: () => { formData.value.userList.splice(index, 1) - // 如果删除的是当前选中的选项卡,则选中第一个选项卡 - if (index === activeTabIndex.value) { + if (formData.value.userList.length === 0) { activeTabIndex.value = 0 + return } - // 如果删除的是前面的选项卡,则当前选中的选项卡索引减1 + // 删除当前人员时优先显示其后一人;删除末项时显示前一人,保持操作上下文连续。 + if (index === activeTabIndex.value) { + activeTabIndex.value = Math.min(index, formData.value.userList.length - 1) + } + // 删除当前选中项之前的人员后,索引前移以继续显示原选中人员。 else if (index < activeTabIndex.value) { activeTabIndex.value-- } @@ -672,13 +1082,18 @@ function closeNoticePopup() { .header-actions { display: flex; align-items: center; + gap: 8px; } .person-counter { + width: 64px; + height: 30px; background-color: #f45a5a; - border-radius: 12px; - padding: 2px 10px; - margin-right: 8px; + border-radius: 15px; + display: flex; + align-items: center; + justify-content: center; + box-sizing: border-box; } .counter-text { @@ -687,20 +1102,46 @@ function closeNoticePopup() { font-weight: 500; } -.header-add-btn { - width: 28px; - height: 28px; - border-radius: 50%; - background: linear-gradient(135deg, #f45a5a, #ff7676); - color: #fff; +.header-action-btn { + width: 64px; + height: 30px; + padding: 0 8px; + border-radius: 15px; display: flex; align-items: center; justify-content: center; - box-shadow: 0 2px 6px rgba(244, 90, 90, 0.25); + gap: 3px; + font-size: 12px; + font-weight: 500; + white-space: nowrap; + box-sizing: border-box; transition: transform 0.2s ease; } -.header-add-btn:active { +.header-action-btn text { + white-space: nowrap; + flex-shrink: 0; +} + +/* 使用独立 SVG 图标组件,避免 H5 环境下通用 t-icon 未渲染图形。 */ +.header-action-icon { + display: block; + flex-shrink: 0; +} + +.header-add-btn { + background: linear-gradient(135deg, #f45a5a, #ff7676); + color: #fff; + box-shadow: 0 2px 6px rgba(244, 90, 90, 0.25); +} + +.header-remove-btn { + color: #f45a5a; + background-color: #fff1f0; + border: 1px solid rgba(244, 90, 90, 0.35); +} + +.header-action-btn:active { transform: scale(0.92); } @@ -740,6 +1181,7 @@ function closeNoticePopup() { } .tab-content { + width: 100%; display: flex; align-items: center; justify-content: center; @@ -749,13 +1191,10 @@ function closeNoticePopup() { max-width: 100%; } -.tab-icon { - margin-right: 4px; - display: flex; - align-items: center; -} - .tab-text { + display: block; + width: 100%; + text-align: center; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; @@ -916,6 +1355,13 @@ function closeNoticePopup() { animation: fadeIn 0.3s ease; } +.form-empty { + padding: 36px 0; + color: #999; + font-size: 14px; + text-align: center; +} + @keyframes fadeIn { from { opacity: 0.6; @@ -925,23 +1371,16 @@ function closeNoticePopup() { } } -.user-actions { - display: flex; - align-items: center; - margin-left: auto; -} - -.remove-user { - padding: 5px; - color: #f45a5a; - cursor: pointer; -} - .radio-box { display: flex; column-gap: 20px; } +.dict-radio-box { + flex-wrap: wrap; + row-gap: 8px; +} + .footer { position: fixed; bottom: 0; diff --git a/frontend/src/pages/activity/wonderfulMoment/index.vue b/frontend/src/pages/activity/wonderfulMoment/index.vue index bd975be..0d0874f 100644 --- a/frontend/src/pages/activity/wonderfulMoment/index.vue +++ b/frontend/src/pages/activity/wonderfulMoment/index.vue @@ -24,7 +24,8 @@ const viewData = ref(null); function getWonderfulMoment() { request.post('/platform/activity/wonderfulMoment/getWonderfulMomentById/' + momentId.value).then(res=>{ if(res.code === 0){ - res.data.content = res?.data?.content.replaceAll('/open/file/upload/download?filepath=','') + // 后台富文本保存的是后端相对预览地址,H5 端需通过 /api 代理访问实际上传文件。 + res.data.content = res?.data?.content.replaceAll('/open/file/upload/download?filepath=', '/api/open/file/upload/download?inline=true&filepath=') viewData.value = res.data }else{ Toast({message: res.msg, theme: 'error'}); diff --git a/frontend/src/pages/index/index.vue b/frontend/src/pages/index/index.vue index 323e2ed..ad9fd16 100644 --- a/frontend/src/pages/index/index.vue +++ b/frontend/src/pages/index/index.vue @@ -4,6 +4,9 @@ + + {{ displayActivityTitle }} + @@ -55,7 +58,7 @@ - {{ item.title }} @@ -105,7 +108,7 @@ @@ -527,7 +568,7 @@ onMounted(() => { } .main-title { - font-size: 36px; + font-size: 34px; font-weight: bold; margin-bottom: 8px; display: block; @@ -620,6 +661,19 @@ onMounted(() => { } } +.sms-reminder { + margin: -6px 10px 10px; + color: #888; + font-size: 12px; + line-height: 1.5; + text-align: left; +} + +.sms-reminder-title { + color: #f45a5a; + font-weight: 500; +} + .submit-btn { margin-top: 32px; height: 50px; @@ -637,6 +691,10 @@ onMounted(() => { } } +.sms-reminder + .submit-btn { + margin-top: 10px; +} + .login-link-box { margin-top: 16px; text-align: center; diff --git a/frontend/src/pages/profile/act.vue b/frontend/src/pages/profile/act.vue index 9662d05..aa57558 100644 --- a/frontend/src/pages/profile/act.vue +++ b/frontend/src/pages/profile/act.vue @@ -41,7 +41,7 @@ - @@ -118,6 +118,14 @@ const loading = ref(false); const hasMore = ref(true); const refresherTriggered = ref(false); +// 后台保存活动封面的相对路径,H5端统一通过当前环境的文件预览代理读取。 +const getActivityCoverUrl = (cover) => { + if (!cover) { + return ''; + } + return '/api/open/file/upload/download?inline=true&filepath=' + encodeURIComponent(cover); +}; + // 选择状态筛选 const selectStatusFilter = (status) => { pageForm.status = status; diff --git a/frontend/src/static/img/index4.png b/frontend/src/static/img/index4.png index ef583ab6ea3aadb24fd44f8a1ef449d8483d4288..b65a05612e6f90e32d4bfd6205766970e566b1de 100644 GIT binary patch literal 129928 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 literal 137135 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%0DkB;m!A($aVm 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 typeof window !== 'undefined' && Boolean(window.history); + +// 浏览器返回时只关闭最后打开的弹框,避免直接离开当前业务页面。 +const handlePopState = () => { + const popupEntry = popupHistoryStack.pop(); + if (popupEntry && !popupEntry.programmaticClosing) { + popupEntry.closePopup(); + } +}; + +const ensurePopstateListener = () => { + if (!canUseBrowserHistory() || popstateListenerRegistered) { + return; + } + window.addEventListener('popstate', handlePopState); + popstateListenerRegistered = true; +}; + +/** + * 为弹框增加一层浏览器历史。 + * + * @param {Function} closePopup 用户通过浏览器返回键关闭弹框时执行的方法 + * @return {number|null} 弹框历史记录ID;非浏览器环境返回null + */ +const pushPopupHistory = (closePopup) => { + if (!canUseBrowserHistory()) { + return null; + } + ensurePopstateListener(); + popupHistorySequence += 1; + const id = popupHistorySequence; + popupHistoryStack.push({id, closePopup, programmaticClosing: false}); + window.history.pushState({popupHistoryId: id}, '', window.location.href); + return id; +}; + +/** + * 用户点击弹框按钮时同步回退对应的浏览器历史。 + * + * @param {number|null} id pushPopupHistory返回的弹框历史记录ID + * @return {void} + */ +const closePopupHistory = (id) => { + if (!canUseBrowserHistory() || id === null) { + return; + } + const popupEntry = popupHistoryStack[popupHistoryStack.length - 1]; + if (!popupEntry || popupEntry.id !== id || popupEntry.programmaticClosing) { + return; + } + popupEntry.programmaticClosing = true; + window.history.back(); +}; + +/** + * 显示带H5返回键支持的确认框。 + * + * @param {Object} options TDesign确认框参数;onConfirm、onCancel、onClose分别处理确认、取消和关闭 + * @return {Object|undefined} TDesign Dialog实例;服务端渲染环境可能返回undefined + */ +export const showConfirmWithHistory = (options = {}) => { + let popupHistoryId = null; + let dialogInstance = null; + const closeHistory = () => { + closePopupHistory(popupHistoryId); + }; + dialogInstance = Dialog.confirm({ + ...options, + onConfirm: (context) => { + closeHistory(); + if (options.onConfirm) { + options.onConfirm(context); + } + }, + onCancel: (context) => { + closeHistory(); + if (options.onCancel) { + options.onCancel(context); + } + }, + onClose: (context) => { + closeHistory(); + if (options.onClose) { + options.onClose(context); + } + } + }); + popupHistoryId = pushPopupHistory(() => { + if (dialogInstance) { + dialogInstance.hide(); + } + }); + return dialogInstance; +}; diff --git a/frontend/vite.config.js b/frontend/vite.config.js index 24b42f3..151191f 100644 --- a/frontend/vite.config.js +++ b/frontend/vite.config.js @@ -34,8 +34,8 @@ export default defineConfig({ },*/ proxy: { '/api': { - target: 'http://119.91.224.39:9090/', - // target: 'http://192.168.118.1:9090/', + // target: 'http://119.91.224.39:9090/', + target: 'http://127.0.0.1:9090/', changeOrigin: true, rewrite: (path) => path.replace(/^\/api/, '') }