diff --git a/src/main/java/io/v/nutz/activity/controller/union/ActivityUnionApplyController.java b/src/main/java/io/v/nutz/activity/controller/union/ActivityUnionApplyController.java index cdacbe6..927413f 100644 --- a/src/main/java/io/v/nutz/activity/controller/union/ActivityUnionApplyController.java +++ b/src/main/java/io/v/nutz/activity/controller/union/ActivityUnionApplyController.java @@ -3,8 +3,11 @@ package io.v.nutz.activity.controller.union; import cn.hutool.core.util.StrUtil; import cn.wizzer.framework.base.service.BaseService; import io.v.nutz.activity.models.ActivityTissue; +import io.v.nutz.activity.models.ActivityTissueBasicSettings; import io.v.nutz.annontation.ViReturn; import io.v.nutz.base.service.SimpleService; +import io.v.nutz.base.utils.DateUtil; +import org.apache.shiro.authz.annotation.Logical; import org.apache.shiro.authz.annotation.RequiresAuthentication; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.nutz.dao.Cnd; @@ -18,6 +21,7 @@ import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Param; import java.util.Calendar; +import java.util.List; /** * @author zhf @@ -116,4 +120,13 @@ public class ActivityUnionApplyController { } + + @At + @ViReturn + @RequiresPermissions(value = {"activity.school.apply", "activity.club.apply", "activity.union.apply"}, logical = Logical.OR) + public Object getActivityBasicSettingsList(){ + List list = simpleService.dao().query(ActivityTissueBasicSettings.class, + Cnd.where("YEAR(applyDate)", "=", DateUtil.getYear())); + return list; + } } diff --git a/src/main/java/io/v/nutz/activity/controller/union/ActivityUnionApplyUserController.java b/src/main/java/io/v/nutz/activity/controller/union/ActivityUnionApplyUserController.java index 5f5474d..5ad32ec 100644 --- a/src/main/java/io/v/nutz/activity/controller/union/ActivityUnionApplyUserController.java +++ b/src/main/java/io/v/nutz/activity/controller/union/ActivityUnionApplyUserController.java @@ -164,7 +164,8 @@ public class ActivityUnionApplyUserController { $condition """); Cnd cnd = Cnd.NEW(); - cnd.and("u.unionId", "=", Vi.getUnionId()); + cnd.and("u.unitid", "is not", null); + cnd.and("u.unionid", "is not", null); cnd.and("aus.groupId", "=", groupId); cnd.groupBy("u.id"); cnd.asc("u.unitname").asc("u.unionname"); @@ -184,10 +185,11 @@ public class ActivityUnionApplyUserController { activity_tissue_person atp LEFT JOIN `user` u ON atp.userId = u.id WHERE - atp.tissueId = @tissueId AND u.unionid = @unionId + atp.tissueId = @tissueId AND atp.applyUserId = @userId """); sql.setParam("tissueId", tissueId); sql.setParam("unionId", Vi.getUnionId()); + sql.setParam("userId", ShiroUtil.getUserId()); List list = baseService.listMap(sql); List userIds = list.stream().map(v -> v.getString("userId")).collect(Collectors.toList()); return userIds; diff --git a/src/main/java/io/v/nutz/activity/controller/union/ActivityUnionBasicSettingsController.java b/src/main/java/io/v/nutz/activity/controller/union/ActivityUnionBasicSettingsController.java new file mode 100644 index 0000000..9a1aac3 --- /dev/null +++ b/src/main/java/io/v/nutz/activity/controller/union/ActivityUnionBasicSettingsController.java @@ -0,0 +1,62 @@ +package io.v.nutz.activity.controller.union; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import io.v.nutz.activity.models.ActivityTissueBasicSettings; +import io.v.nutz.annontation.ViReturn; +import io.v.nutz.base.page.Pagination; +import io.v.nutz.base.service.BaseService; +import io.v.nutz.modules.models.PageForm; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; + +/** + * @ClassName ActivityUnionBasicSettingsController + * @Description TODO + * @Author zhf + * @Date 2025/4/3 上午9:16 + */ +@IocBean +@Ok("json:full") +@At("/platform/activity/union/basicSettings") +public class ActivityUnionBasicSettingsController { + + @At("") + @Ok("beetl:/platform/activity/union/basicSettings.html") + @RequiresPermissions("activity.union.basicSettings") + public void index() { + } + + @Inject + private BaseService baseService; + + + @At + @ViReturn + @RequiresPermissions("activity.union.basicSettings") + public Object doSubmit(ActivityTissueBasicSettings activityTissueBasicSettings) { + if (StrUtil.isEmpty(activityTissueBasicSettings.getApplyDate())){ + activityTissueBasicSettings.setApplyDate(DateUtil.now()); + } + baseService.insertOrUpdate(activityTissueBasicSettings); + return null; + } + + + @At + @ViReturn + @RequiresPermissions("activity.union.basicSettings") + public Object pageData(PageForm pageForm, Integer year) { + Sql sql = Sqls.create("SELECT * FROM `activity_tissue_basic_settings` WHERE YEAR(applyDate)=@year").setParam("year", year); + Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + return pagination; + } + + +} diff --git a/src/main/java/io/v/nutz/activity/models/ActivityTissue.java b/src/main/java/io/v/nutz/activity/models/ActivityTissue.java index cb75d82..f965380 100644 --- a/src/main/java/io/v/nutz/activity/models/ActivityTissue.java +++ b/src/main/java/io/v/nutz/activity/models/ActivityTissue.java @@ -249,4 +249,9 @@ public class ActivityTissue extends BaseModel implements Serializable { @ColDefine(type = ColType.VARCHAR, width = 30) private String signEndTime; + @Column + @Comment("活动设置id") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String basicSettingsId; + } diff --git a/src/main/java/io/v/nutz/activity/models/ActivityTissueBasicSettings.java b/src/main/java/io/v/nutz/activity/models/ActivityTissueBasicSettings.java new file mode 100644 index 0000000..45d178c --- /dev/null +++ b/src/main/java/io/v/nutz/activity/models/ActivityTissueBasicSettings.java @@ -0,0 +1,48 @@ +package io.v.nutz.activity.models; + +import cn.wizzer.framework.base.model.BaseModel; +import lombok.Data; +import org.nutz.dao.entity.annotation.*; + +import java.io.Serializable; + +/** + * @ClassName ActivityTissueBasicSettings + * @Description TODO + * @Author zhf + * @Date 2025/4/3 上午9:20 + */ +@Data +@Table("activity_tissue_basic_settings") +@Comment("协会或分工会活动校工会活动基础设置") +public class ActivityTissueBasicSettings extends BaseModel implements Serializable { + + @Column + @Name + @Comment("ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + @Prev(els = {@EL("uuid()")}) + private String id; + + @Column + @Comment("设置名称") + @ColDefine(type = ColType.VARCHAR, width = 100) + private String basicSettingsName; + + @Column + @Comment("设置编码") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String basicSettingsCode; + + @Column + @Comment("可报活动数") + @ColDefine(type = ColType.INT) + private Integer signUpActivityNum; + + @Column + @Comment("创建时间") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String applyDate; + + +} diff --git a/src/main/java/io/v/nutz/mobile/activity/unionActivity/UnionActivityRegisterController.java b/src/main/java/io/v/nutz/mobile/activity/unionActivity/UnionActivityRegisterController.java index 5de558b..8e30c6b 100644 --- a/src/main/java/io/v/nutz/mobile/activity/unionActivity/UnionActivityRegisterController.java +++ b/src/main/java/io/v/nutz/mobile/activity/unionActivity/UnionActivityRegisterController.java @@ -2,9 +2,7 @@ package io.v.nutz.mobile.activity.unionActivity; import cn.hutool.core.util.StrUtil; import cn.wizzer.framework.base.Result; -import io.v.nutz.activity.models.ActivityTissue; -import io.v.nutz.activity.models.ActivityTissuePerson; -import io.v.nutz.activity.models.ActivityUserScope; +import io.v.nutz.activity.models.*; import io.v.nutz.annontation.ViReturn; import io.v.nutz.base.service.SimpleService; import io.v.nutz.base.utils.DateUtil; @@ -31,7 +29,9 @@ import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Param; import org.nutz.trans.Trans; +import java.util.Arrays; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @@ -120,9 +120,9 @@ public class UnionActivityRegisterController { @ViReturn @RequiresAuthentication public Object pageData(PageForm pageForm, - @Param(value = "year",required = false) Integer year, - @Param(value = "activityStatus",required = false)int activityStatus, - @Param(value = "activityLevel",required = false)String activityLevel) { + @Param(value = "year", required = false) Integer year, + @Param(value = "activityStatus", required = false) int activityStatus, + @Param(value = "activityLevel", required = false) String activityLevel) { Sql sql = Sqls.create(""" SELECT id, @@ -334,12 +334,67 @@ public class UnionActivityRegisterController { @ViReturn @RequiresAuthentication public synchronized Object doSaveUnionRegister(String activityId, String[] personIds) { + lock.lock(); + ActivityTissue activityTissue = simpleService.dao().fetch(ActivityTissue.class, activityId); + + if (StrUtil.isNotEmpty(activityTissue.getBasicSettingsId())) { + //如果不为空就代表有活动设置 + ActivityTissueBasicSettings settings = simpleService.dao().fetch(ActivityTissueBasicSettings.class, activityTissue.getBasicSettingsId()); + //找出跟这个活动设置关联的活动 + List tissueList = simpleService.dao().query(ActivityTissue.class, Cnd.where("basicSettingsId", "=", settings.getId()).and("id", "!=", activityId)); + List tissueIds = tissueList.stream().map(ActivityTissue::getId).collect(Collectors.toList()); + //找出当前登入人报名的活动 + Sql sql = Sqls.create(""" + SELECT + act.`name` + FROM + `activity_tissue_person` atp + LEFT JOIN activity_tissue act ON act.id = atp.tissueId + WHERE atp.tissueId in (@tissueId) AND atp.userId=@userId + """).setParam("tissueId", tissueIds).setParam("userId", ShiroUtil.getUserId()); + List applyTissueList = simpleService.listMap(sql); + if (applyTissueList.size() == settings.getSignUpActivityNum()) { + lock.unlock(); + List nameList = applyTissueList.stream().map(v -> v.getString("name")).collect(Collectors.toList()); + return Result.error("【" + settings.getBasicSettingsName() + "】类型只能报名" + settings.getSignUpActivityNum() + "个!您已报名【" + String.join(",", nameList) + "】"); + } + + //找到队友的id + List teammateUserIds = Arrays.stream(personIds).filter(id -> !id.equals(ShiroUtil.getUserId())).collect(Collectors.toList()); + Sql sql2 = Sqls.create(""" + SELECT + atp.userId, + atp.userName, + act.`name` + FROM + `activity_tissue_person` atp + LEFT JOIN activity_tissue act ON act.id = atp.tissueId + WHERE atp.tissueId in (@tissueId) AND atp.userId in (@userId) + """).setParam("tissueId", tissueIds).setParam("userId", teammateUserIds); + List teammateUserList = simpleService.listMap(sql2); + //队友分组 + Map> groupedData = teammateUserList.stream() + .collect(Collectors.groupingBy( + nutMap -> nutMap.getString("userName") // 提取 userName 作为分组键 + )); + final String[] msg = {""}; + groupedData.forEach((key, value) -> { + //判断每个队友是否报名 + if (value.size() == settings.getSignUpActivityNum()) { + List activityNames = value.stream().map(v -> v.getString("name")).collect(Collectors.toList()); + msg[0] = msg[0] + "当前活动只能报名" + settings.getSignUpActivityNum() + "个,【" + key + "】已报名【" + String.join(",", activityNames) + "】"; + } + }); + if (StrUtil.isNotEmpty(msg[0])) { + lock.unlock(); + return Result.error().addMsg(msg[0]); + } + } String unionId = Vi.getUnionId(); - - ActivityTissue activityTissue = simpleService.dao().fetch(ActivityTissue.class, activityId); if (activityTissue.getSignUpMethod() == 2) { if (!ShiroUtil.hasRole("H04")) { + lock.unlock(); return Result.error().addMsg("请使用分工会管理员报名!"); } } @@ -348,12 +403,14 @@ public class UnionActivityRegisterController { int hasRegisterCount = simpleService.dao().count(ActivityTissuePerson.class, Cnd.where("tissueId", "=", activityId)); if (hasRegisterCount + personIds.length > activityTissue.getTotalUserNumberLimit()) { // return Result.error().addMsg("当前最多只能报名%s人!".formatted(Math.max(activityTissue.getTotalUserNumberLimit() - hasRegisterCount, 0))); + lock.unlock(); return Result.error().addMsg("该活动限制人数为%s人".formatted(activityTissue.getTotalUserNumberLimit())); } } if (activityTissue.getUserNumberLimit() == 2) { int limitNumByUnion = getLimitNumByUnion(activityTissue.getUnionUserNumberLimit(), unionId); if (personIds.length > limitNumByUnion) { + lock.unlock(); return Result.error().addMsg("分工会报名限额%s人!".formatted(limitNumByUnion)); } } @@ -398,6 +455,7 @@ public class UnionActivityRegisterController { sql.setCondition(Cnd.where("id", "in", personIds)); List fullPersonList = simpleService.listEntity(sql, ActivityTissuePerson.class); simpleService.insert(fullPersonList); + lock.unlock(); }); return Result.success().addMsg("报名成功!"); } @@ -422,10 +480,32 @@ public class UnionActivityRegisterController { lock.unlock(); return Result.error("您的工会信息有误,无法报名,请联系工会管理员!"); } - String unionId = Vi.getUnionId(); -// String unionId = "74d1600a7486457b9afd660128c86a20"; + ActivityTissue activityTissue = simpleService.dao().fetch(ActivityTissue.class, activityId); - ; + if (StrUtil.isNotEmpty(activityTissue.getBasicSettingsId())) { + //如果不为空就代表有活动设置 + ActivityTissueBasicSettings settings = simpleService.dao().fetch(ActivityTissueBasicSettings.class, activityTissue.getBasicSettingsId()); + //找出跟这个活动设置关联的活动 + List tissueList = simpleService.dao().query(ActivityTissue.class, Cnd.where("basicSettingsId", "=", settings.getId())); + List tissueIds = tissueList.stream().map(ActivityTissue::getId).collect(Collectors.toList()); + //找出当前登入人报名的活动 + Sql sql = Sqls.create(""" + SELECT + act.`name` + FROM + `activity_tissue_person` atp + LEFT JOIN activity_tissue act ON act.id = atp.tissueId + WHERE atp.tissueId in (@tissueId) AND atp.userId=@userId + """).setParam("tissueId", tissueIds).setParam("userId", ShiroUtil.getUserId()); + List applyTissueList = simpleService.listMap(sql); + if (applyTissueList.size() == settings.getSignUpActivityNum()) { + lock.unlock(); + List nameList = applyTissueList.stream().map(v -> v.getString("name")).collect(Collectors.toList()); + return Result.error("【" + settings.getBasicSettingsName() + "】类型只能报名" + settings.getSignUpActivityNum() + "个!您已报名【" + String.join(",", nameList) + "】"); + } + + + } //活动设置了分组人员 if (activityTissue.getGroupId() != null) { int count = simpleService.dao().count(ActivityUserScope.class, Cnd.where("groupId", "=", activityTissue.getGroupId()).and("userId", "=", ShiroUtil.getPrincipalProperty("id"))); @@ -434,7 +514,7 @@ public class UnionActivityRegisterController { return Result.error().addMsg("您不在本次活动参加人员范围内!"); } } - + String unionId = Vi.getUnionId(); if (Lang.isNotEmpty(activityTissue.getUserNumberLimit())) { if (activityTissue.getUserNumberLimit() == 1) { Integer totalUserNumberLimit = activityTissue.getTotalUserNumberLimit(); @@ -477,6 +557,9 @@ public class UnionActivityRegisterController { activityTissuePerson.setMobile(principal.getMobile()); activityTissuePerson.setUnitName(principal.getUnit().getName()); activityTissuePerson.setUnionName(principal.getUnion().getUnionname()); + activityTissuePerson.setApplyDateTime(DateUtil.getDateTime()); + activityTissuePerson.setApplyUserId(principal.getId()); + activityTissuePerson.setApplyUserUserName(principal.getUsername()); simpleService.dao().insert(activityTissuePerson); lock.unlock(); return Result.success().addMsg("报名成功!"); @@ -487,7 +570,7 @@ public class UnionActivityRegisterController { @RequiresAuthentication public Object doSingleCancelRegister(String activityId) { simpleService.dao().clear(ActivityTissuePerson.class, Cnd.where("tissueId", "=", activityId) - .and("userId", "=", ShiroUtil.getPrincipalProperty("id"))); + .and("applyUserId", "=", ShiroUtil.getPrincipalProperty("id"))); return Result.success().addMsg("取消成功!"); } diff --git a/src/main/resources/views/mobile/activity/unionActivity/unionReg.html b/src/main/resources/views/mobile/activity/unionActivity/unionReg.html index 9964679..b9324cd 100644 --- a/src/main/resources/views/mobile/activity/unionActivity/unionReg.html +++ b/src/main/resources/views/mobile/activity/unionActivity/unionReg.html @@ -185,7 +185,6 @@ layout("/mobile/platform.html"){ } }, showActivityInfo(activityContent){ - console.log(activityContent) this.activityContent = '' this.activityContent = activityContent this.showActivityInfoPopup = true diff --git a/src/main/resources/views/mobile/platform.html b/src/main/resources/views/mobile/platform.html index 461a9b3..8fc1d90 100644 --- a/src/main/resources/views/mobile/platform.html +++ b/src/main/resources/views/mobile/platform.html @@ -51,6 +51,7 @@ diff --git a/src/main/resources/views/platform/activity/union/applyActivity.html b/src/main/resources/views/platform/activity/union/applyActivity.html index 01f06ed..7c9155f 100644 --- a/src/main/resources/views/platform/activity/union/applyActivity.html +++ b/src/main/resources/views/platform/activity/union/applyActivity.html @@ -201,6 +201,19 @@ + + + + + + + @@ -225,7 +238,8 @@ 个人报名 组队报名 - 分工会报名 + 分工会报名 + @@ -429,8 +443,10 @@ - - + + @@ -442,7 +458,8 @@ - + @@ -478,7 +495,8 @@ 购置物品及价格
- - - -