diff --git a/src/main/java/com/budwk/app/sys/controller/SysRoleController.java b/src/main/java/com/budwk/app/sys/controller/SysRoleController.java index f468276c..b46c9ee8 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysRoleController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysRoleController.java @@ -8,6 +8,7 @@ import com.budwk.app.base.annotation.SLog; import com.budwk.app.base.result.Result; import com.budwk.app.base.utils.PageUtil; import com.budwk.app.sys.models.Sys_menu; +import com.budwk.app.sys.models.Sys_module; import com.budwk.app.sys.models.Sys_role; import com.budwk.app.sys.models.Sys_unit; import com.budwk.app.sys.models.Sys_user; @@ -23,6 +24,8 @@ import org.nutz.dao.FieldFilter; import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; import org.nutz.dao.util.Daos; +import org.nutz.aop.interceptor.ioc.TransAop; +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; @@ -120,6 +123,7 @@ public class SysRoleController { @Ok("json:full") @SaCheckPermission("sys.manager.role") public Object pageData(@Param("searchUnit") String searchUnit, + @Param("moduleId") String moduleId, @Param("searchName") String searchName, @Param("searchKeyword") String searchKeyword, @Param("searchName2") String searchName2, @@ -130,9 +134,10 @@ public class SysRoleController { try { Sql sql = Sqls.create(""" SELECT - role.* + role.*, module.name AS moduleName FROM sys_role role + LEFT JOIN sys_module module ON module.id = role.moduleId LEFT JOIN sys_user_role ur ON role.id = ur.roleId LEFT JOIN sys_user u ON u.id = ur.userId $condition @@ -163,6 +168,9 @@ public class SysRoleController { if (StrUtil.isAllNotBlank(searchName2, searchKeyword2)) { cnd.and("u." + searchName2, "like", "%" + searchKeyword2 + "%"); } + if (StrUtil.isNotBlank(moduleId)) { + cnd.and("role.moduleId", "=", moduleId); + } if (Strings.isNotBlank(pageOrderName) && Strings.isNotBlank(pageOrderBy)) { cnd.orderBy(pageOrderName, PageUtil.getOrder(pageOrderBy)); } else { @@ -287,8 +295,13 @@ public class SysRoleController { @Ok("json") @SaCheckPermission("sys.manager.role.add") @SLog(tag = "添加角色", msg = "角色名称:${args[1].name}") + @Aop(TransAop.READ_COMMITTED) public Object addDo(@Param("..") Sys_role role, HttpServletRequest req) { try { + // 所属模块只允许选择已配置的 PC 端模块,避免角色关联无效或 H5 模块。 + if (!isPcModule(role.getModuleId())) { + return Result.error("请选择所属模块"); + } int num = sysRoleService.count(Cnd.where("code", "=", role.getCode().trim())); if (num > 0) { return Result.error("角色编码已存在"); @@ -360,8 +373,13 @@ public class SysRoleController { @Ok("json") @SaCheckPermission("sys.manager.role.edit") @SLog(tag = "修改角色", msg = "角色名称:${args[0].name}") + @Aop(TransAop.READ_COMMITTED) public Object editDo(@Param("..") Sys_role role, HttpServletRequest req) { try { + // 编辑时同样校验模块,保证历史角色补录后始终关联有效 PC 模块。 + if (!isPcModule(role.getModuleId())) { + return Result.error("请选择所属模块"); + } Sys_role oldRole = sysRoleService.fetch(role.getId()); if (oldRole != null && !Strings.sBlank(oldRole.getCode()).equalsIgnoreCase(role.getCode())) { int num = sysRoleService.count(Cnd.where("code", "=", role.getCode().trim())); @@ -503,6 +521,35 @@ public class SysRoleController { cnd.and(Cnd.exps("parentId", "is", null).or("parentId", "=", "")); return Result.success(Daos.ext(sysRoleService.dao(), fieldFilter).query(Sys_menu.class, cnd)); } + + /** + * 查询角色可选择的 PC 端模块。 + * + * @return PC 端模块列表,按模块排序编号升序返回,元素包含模块 ID 和模块名称 + */ + @At + @Ok("json:full") + @SaCheckPermission("sys.manager.role") + public Result listModule() { + List modules = sysRoleService.dao().query(Sys_module.class, + Cnd.where(Sys_module::getPlatform, "=", "PC").asc(Sys_module::getSortNum)); + return Result.success(modules); + } + + /** + * 校验所属模块是否存在且属于 PC 平台。 + * + * @param moduleId 模块主键,必须来自 sys_module 的 PC 端模块记录 + * @return 模块有效时返回 true,否则返回 false + */ + private boolean isPcModule(String moduleId) { + if (StrUtil.isBlank(moduleId)) { + return false; + } + Sys_module module = sysRoleService.dao().fetch(Sys_module.class, moduleId); + return module != null && "PC".equals(module.getPlatform()); + } + @At @Ok("json:full") @SaCheckLogin diff --git a/src/main/java/com/budwk/app/sys/models/Sys_log.java b/src/main/java/com/budwk/app/sys/models/Sys_log.java index 53cea981..7f461db6 100644 --- a/src/main/java/com/budwk/app/sys/models/Sys_log.java +++ b/src/main/java/com/budwk/app/sys/models/Sys_log.java @@ -60,7 +60,7 @@ public class Sys_log extends BaseModel implements Serializable { @Column @Comment("请求结果") - @ColDefine(type = ColType.TEXT) + @ColDefine(customType = "MEDIUMTEXT") private String param; @Column diff --git a/src/main/java/com/budwk/app/sys/models/Sys_role.java b/src/main/java/com/budwk/app/sys/models/Sys_role.java index 75ebe81e..a6bd6d11 100644 --- a/src/main/java/com/budwk/app/sys/models/Sys_role.java +++ b/src/main/java/com/budwk/app/sys/models/Sys_role.java @@ -45,6 +45,11 @@ public class Sys_role extends BaseModel implements Serializable { @ColDefine(type = ColType.VARCHAR, width = 32) private String unitid; + @Column + @ColDefine(type = ColType.VARCHAR, width = 32) + @Comment("所属模块ID") + private String moduleId; + @Column @ColDefine(type = ColType.VARCHAR, width = 255) private String note; diff --git a/src/main/java/com/budwk/app/zhgh/activity/basic/controller/ActivityBasicScopeUserDataController.java b/src/main/java/com/budwk/app/zhgh/activity/basic/controller/ActivityBasicScopeUserDataController.java index de119ce0..556a6467 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/basic/controller/ActivityBasicScopeUserDataController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/basic/controller/ActivityBasicScopeUserDataController.java @@ -133,10 +133,20 @@ public class ActivityBasicScopeUserDataController { /** - * 删除一条记录 + * 删除活动分组人员。 + * id 有值时删除单个人员;id 为空时按当前页面的姓名/工号、工会、单位、人员类别和在职状态筛选后批量删除。 + * groupId 为待删除人员所在的活动分组;existsLoginNameRedisKey 为导入核对名单生成的工号筛选缓存键。 + * 返回 Result,code 为 0 表示删除处理成功。 * - * @param id - * @return + * @param id 单个人员 ID;批量删除时传空 + * @param groupId 当前活动分组 ID + * @param searchKeyword 姓名或工号关键字 + * @param unionId 所属工会 ID + * @param unitId 所属单位 ID + * @param personType 教职工类别 + * @param userState 在职状态 + * @param existsLoginNameRedisKey 导入核对名单的 Redis 缓存键 + * @return 删除结果 */ @At @SLog(tag = "活动人员查询", msg = "删除活动人员") @@ -145,7 +155,6 @@ public class ActivityBasicScopeUserDataController { public Result doDelete(@Param(value = "id") String id, @Param(value = "groupId") Integer groupId, @Param(value = "searchKeyword") String searchKeyword, - @Param(value = "searchName") String searchName, @Param(value = "unionId") String unionId, @Param(value = "unitId") String unitId, @Param(value = "personType") String personType, @@ -160,7 +169,7 @@ public class ActivityBasicScopeUserDataController { } } - List targetUserIds = queryGroupUserIds(groupId, id, searchKeyword, searchName, unionId, unitId, personType, userState, existsLoginNames); + List targetUserIds = queryGroupUserIds(groupId, id, searchKeyword, unionId, unitId, personType, userState, existsLoginNames); if (Lang.isEmpty(targetUserIds)) { return Result.success(); } @@ -282,9 +291,10 @@ public class ActivityBasicScopeUserDataController { } /** - * 删除时需要先按页面当前筛选条件圈定目标人员,再根据分组类型删除对应存储表中的快照数据。 + * 删除时需要先按页面当前筛选条件圈定目标人员。姓名或工号关键字必须与列表查询使用相同的匹配规则, + * 再根据分组类型删除对应存储表中的快照数据。 */ - private List queryGroupUserIds(Integer groupId, String id, String searchKeyword, String searchName, + private List queryGroupUserIds(Integer groupId, String id, String searchKeyword, String unionId, String unitId, String personType, String userState, List existsLoginNames) { Sql sql = Sqls.queryString(""" @@ -296,8 +306,11 @@ public class ActivityBasicScopeUserDataController { """); Cnd cnd = Cnd.NEW(); cnd.and("u.id", "in", activityBasicScopeService.buildGroupUserIdSubSql(groupId)); - if (StrUtil.isNotBlank(searchName) && StrUtil.isNotBlank(searchKeyword)) { - cnd.and(Cnd.likeEX(searchName, searchKeyword)); + if (StrUtil.isNotBlank(searchKeyword)) { + SqlExpressionGroup group = new SqlExpressionGroup(); + group.orLike("u.username", searchKeyword); + group.orLike("u.loginname", searchKeyword); + cnd.and(group); } cnd.andEX("u.unionid", "=", unionId); cnd.andEX("u.unitid", "=", unitId); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleQueryController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleQueryController.java index c191c596..13eac6a0 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleQueryController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleQueryController.java @@ -49,6 +49,7 @@ public class ArticleQueryController { info.loginName, info.unitName, info.unionName, + info.clubName, info.submitTime, info.origin, ins.id AS instanceId, diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/asset/controller/AssetManageController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/asset/controller/AssetManageController.java index e2df45e8..3d768e1c 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/asset/controller/AssetManageController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/asset/controller/AssetManageController.java @@ -5,6 +5,7 @@ import cn.afterturn.easypoi.excel.entity.ExportParams; import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaMode; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.annotation.SLog; @@ -153,7 +154,7 @@ public class AssetManageController { @At @ApiOperation("查询责任人") - @SaCheckPermission("asset.manage") + @SaCheckPermission(value = {"asset.manage", "asset.stocktaking", "h5.asset.stocktaking"}, mode = SaMode.OR) public Result searchAssetUseUser(String query) { Cnd cnd = Cnd.NEW(); cnd.where().orLike("username", query); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/cadreTraining/controller/CadreTrainingMineController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/cadreTraining/controller/CadreTrainingMineController.java index 273f1e66..2b5909cf 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/cadreTraining/controller/CadreTrainingMineController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/cadreTraining/controller/CadreTrainingMineController.java @@ -4,12 +4,15 @@ import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaMode; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.annotation.SLog; +import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.param.PageForm; import com.budwk.app.base.result.Result; import com.budwk.app.flow.engine.FlowEngine; +import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.dayofficework.cadreTraining.model.CadreTrainingAct; +import com.budwk.app.zhgh.dayofficework.cadreTraining.model.CadreTrainingSignUp; import com.budwk.app.zhgh.dayofficework.cadreTraining.service.CadreTrainingActService; import com.budwk.app.zhgh.dayofficework.cadreTraining.service.CadreTrainingSignUpService; import io.swagger.annotations.Api; @@ -29,6 +32,7 @@ import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Param; import javax.validation.Valid; +import java.util.List; /** * @author : hongqiwei @@ -112,6 +116,33 @@ public class CadreTrainingMineController { return Result.success(pagination); } + /** + * 查询“我的报名”查看页的报名人员。 + * 管理角色按活动和分工会查看全部报名人员;普通用户仅返回本人记录,避免扩大人员信息可见范围。 + * + * @param activityId 培训活动 ID,对应 cadre_training 表主键 + * @param unionId 当前查看报名记录所属的分工会 ID + * @return 报名记录列表,元素包含人员姓名、工号、单位、分工会、联系方式及备注 + */ + @At + @ApiOperation("查询我的报名活动人员") + @SaCheckPermission(value = {"cadreTraining.mine", "h5.cadreTraining.mine"}, mode = SaMode.OR) + public Result listSignUsers(@Valid String activityId, String unionId) { + Cnd cnd = Cnd.where(CadreTrainingSignUp::getCadreTrainingActId, "=", activityId); + if (AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name(), RoleConstant.BRANCH_UNION_CHAIRMAN.name())) { + // 管理角色必须携带当前报名记录所属的分工会,防止空参数绕过分工会范围。 + if (StrUtil.isBlank(unionId)) { + return Result.error("分工会信息不能为空"); + } + cnd.and(CadreTrainingSignUp::getUnionId, "=", unionId); + } else { + cnd.and(CadreTrainingSignUp::getUserId, "=", SecurityUtil.getUserId()); + } + cnd.asc(CadreTrainingSignUp::getApplyTime); + List signUsers = dao.query(CadreTrainingSignUp.class, cnd); + return Result.success(signUsers); + } + @At @ApiOperation("删除") @Aop(TransAop.READ_COMMITTED) diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/ghkh/controller/GhkhKhphController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/ghkh/controller/GhkhKhphController.java index ba4349ff..b10e37e2 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/ghkh/controller/GhkhKhphController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/ghkh/controller/GhkhKhphController.java @@ -141,7 +141,7 @@ public class GhkhKhphController { List exportEntities = new ArrayList<>(); exportEntities.add(new ExcelExportEntity("序号", "index", 10)); exportEntities.add(new ExcelExportEntity("年度", "annual", 10)); - exportEntities.add(new ExcelExportEntity("分工会名称", "unionName", 30)); + exportEntities.add(new ExcelExportEntity("分工会名称", "unionname", 30)); exportEntities.add(new ExcelExportEntity("线上得分", "xgh_score", 20)); exportEntities.add(new ExcelExportEntity("线上最终得分" + (config.getOnLine() != null ? "(" + config.getOnLine() + "%)" : ""), "onLineFinalScore", 20)); exportEntities.add(new ExcelExportEntity("线下得分", "offLineScore", 20)); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/honor/controller/HonorRegistrationController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/honor/controller/HonorRegistrationController.java index 2e3ddd1d..d438b48f 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/honor/controller/HonorRegistrationController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/honor/controller/HonorRegistrationController.java @@ -3,11 +3,13 @@ package com.budwk.app.zhgh.dayofficework.honor.controller; import cn.dev33.satoken.annotation.SaCheckLogin; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.result.Result; import com.budwk.app.sys.models.Sys_union; import com.budwk.app.sys.services.SysUnionService; import com.budwk.app.sys.services.SysUserService; +import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.dayofficework.honor.models.Honor; import com.budwk.app.zhgh.dayofficework.honor.service.HonorCommonService; @@ -90,7 +92,10 @@ public class HonorRegistrationController { seg.orLike("t1.username",keyWord); cnd.and(seg); } - cnd.and("t1.unionId","=", SecurityUtil.getUnionId()); + // 系统管理员可跨分工会查询人员,其他角色仍限定为当前所属分工会。 + if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) { + cnd.and("t1.unionId", "=", SecurityUtil.getUnionId()); + } sql.setCondition(cnd); Pagination pagination = sysUserService.listPageMap(1, 50, sql); return Result.success(pagination.getList()); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/honor/controller/HonorSummaryController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/honor/controller/HonorSummaryController.java index cf1105cd..5aaa36e9 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/honor/controller/HonorSummaryController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/honor/controller/HonorSummaryController.java @@ -54,8 +54,8 @@ public class HonorSummaryController { @SaCheckPermission("honor.honorLevel.Summary") public Result unionData(HonorPageForm pageForm) { List query = dao.query(HonorBasicSettings.class, Cnd.where("queryTypeCode", "in", List.of(HonorTypeOrigin.HONOR_SINGLE.name(), HonorTypeOrigin.HONOR_LIST.name()))); - String listHonorId = query.stream().filter(v->v.getQueryTypeCode().equals(HonorTypeOrigin.HONOR_LIST.name())).findFirst().orElse(new HonorBasicSettings()).getId(); - String singleHonorId = query.stream().filter(v->v.getQueryTypeCode().equals(HonorTypeOrigin.HONOR_SINGLE.name())).findFirst().orElse(new HonorBasicSettings()).getId(); + String personalHonorId = query.stream().filter(v->v.getQueryTypeCode().equals(HonorTypeOrigin.HONOR_SINGLE.name())).findFirst().orElse(new HonorBasicSettings()).getId(); + String collectiveHonorId = query.stream().filter(v->v.getQueryTypeCode().equals(HonorTypeOrigin.HONOR_LIST.name())).findFirst().orElse(new HonorBasicSettings()).getId(); Cnd cnd = Cnd.NEW(); Sql sql = Sqls.create(""" SELECT @@ -65,7 +65,7 @@ public class HonorSummaryController { ( SELECT COUNT( 1 ) FROM honor h WHERE h.honorType = @collectiveHonor AND h.unionId = un.id $cnd) collectiveHonorNum FROM sys_union un $condition - """).setParam("personalHonor", listHonorId).setParam("collectiveHonor", singleHonorId); + """).setParam("personalHonor", personalHonorId).setParam("collectiveHonor", collectiveHonorId); cnd.andEX("id", "=", pageForm.getUnionId()); if (pageForm.getYear() != null) { sql.setVar("cnd", "and YEAR(grantDate)=" + pageForm.getYear()); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/controller/MeetingManageController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/controller/MeetingManageController.java index 164d499c..87d1a810 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/controller/MeetingManageController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/controller/MeetingManageController.java @@ -3,11 +3,14 @@ package com.budwk.app.zhgh.dayofficework.meeting.controller; import cn.dev33.satoken.annotation.SaCheckLogin; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.annotation.RepeatSubmit; import com.budwk.app.base.annotation.SLog; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.param.PageForm; import com.budwk.app.base.result.Result; import com.budwk.app.base.utils.PageUtil; +import com.budwk.app.sys.models.Sys_module; +import com.budwk.app.sys.models.Sys_role; import com.budwk.app.zhgh.dayofficework.meeting.model.MeetingInfo; import com.budwk.app.zhgh.dayofficework.meeting.model.MeetingTimePeriod; import com.budwk.app.zhgh.dayofficework.meeting.model.MeetingTimePeriodUser; @@ -101,6 +104,7 @@ public class MeetingManageController { @At @ApiOperation("新增/修改会议") @Aop(TransAop.READ_COMMITTED) + @RepeatSubmit @SaCheckPermission("meeting.manage") @SLog(tag = "会议管理系统-会议管理", msg = "新增/修改会议") public Object submit(@Param("data") MeetingInfo info, @@ -161,6 +165,10 @@ public class MeetingManageController { if (StrUtil.isNotBlank(roleId)) { cnd.and(new Static("u.id in (select userId from sys_user_role where roleId = '%s')".formatted(roleId))); } + // 选择届次但未选择角色时,按届次筛选全部相关人员;同时选择角色时限定为同一角色关联记录。 + if (StrUtil.isBlank(roleId) && StrUtil.isNotBlank(teacherCongressSessionId)) { + cnd.and(new Static("u.id in (select userId from sys_user_role where tcSessionId = '%s')".formatted(teacherCongressSessionId))); + } if (StrUtil.isNotBlank(roleId) && StrUtil.isNotBlank(teacherCongressSessionId)) { cnd.and(new Static("u.id in (select userId from sys_user_role where roleId = '%s' and tcSessionId = '%s')".formatted(roleId, teacherCongressSessionId))); } @@ -225,4 +233,40 @@ public class MeetingManageController { List list = dao.query(Worker_congress_session.class, Cnd.where(Teacher_congress_session::getEnable, "=", true).desc("year")); return Result.success(list); } + + /** + * 查询会议选择用户时可筛选的 PC 端模块。 + * + * @return 模块列表,元素包含模块 ID、名称和平台,按排序编号升序返回 + */ + @At + @ApiOperation("查询 PC 端模块") + @SaCheckPermission("meeting.manage") + public Result listModule() { + List modules = dao.query(Sys_module.class, + Cnd.where(Sys_module::getPlatform, "=", "PC").asc(Sys_module::getSortNum)); + return Result.success(modules); + } + + /** + * 按模块查询会议选择用户时可筛选的启用角色。 + * + * @param moduleId PC 端模块 ID,来源于 sys_module 表 + * @return 角色列表,元素包含角色 ID、名称和角色标识,未传模块时返回空列表 + */ + @At + @ApiOperation("按模块查询角色") + @SaCheckPermission("meeting.manage") + public Result listRole(String moduleId) { + if (StrUtil.isBlank(moduleId)) { + return Result.success(List.of()); + } + Sys_module module = dao.fetch(Sys_module.class, moduleId); + if (module == null || !"PC".equals(module.getPlatform())) { + return Result.success(List.of()); + } + List roles = dao.query(Sys_role.class, + Cnd.where(Sys_role::getModuleId, "=", moduleId).and(Sys_role::isDisabled, "=", false).asc(Sys_role::getSort)); + return Result.success(roles); + } } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/controller/MeetingMineController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/controller/MeetingMineController.java index 5d339830..400906c7 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/controller/MeetingMineController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/controller/MeetingMineController.java @@ -93,6 +93,10 @@ public class MeetingMineController { List periodUsers = dao.query(MeetingTimePeriodUser.class, Cnd.where(MeetingTimePeriodUser::getUserId, "=", SecurityUtil.getUserId())); List idList = periodUsers.stream().map(MeetingTimePeriodUser::getMeetingId).toList(); + // 当前用户未被安排参会时,直接返回空分页,避免生成空 IN 条件导致数据库语法错误。 + if (idList.isEmpty()) { + return Result.success(new Pagination<>(pageForm.getPageNumber(), pageForm.getPageSize(), 0, List.of())); + } cnd.and("id", "in", idList); cnd.andEX("typeId", "=", type); @@ -217,6 +221,14 @@ public class MeetingMineController { @Aop(TransAop.READ_COMMITTED) @SLog(tag = "会务管理-我的会议-签到", msg = "会议签到") public Result sign(@Valid String periodId) { + MeetingTimePeriod timePeriod = dao.fetch(MeetingTimePeriod.class, periodId); + if (timePeriod == null) { + return Result.error("会议场次不存在!"); + } + // 以服务端时间校验场次开始时间,避免客户端时间或页面状态被绕过。 + if (timePeriod.getStartTime() == null || DateUtil.date().before(timePeriod.getStartTime())) { + return Result.error("会议尚未开始,暂不能签到!"); + } MeetingTimePeriodUser user = dao.fetch( MeetingTimePeriodUser.class, Cnd.where(MeetingTimePeriodUser::getTimePeriodId, "=", periodId) diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/service/impl/MeetingInfoServiceImpl.java b/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/service/impl/MeetingInfoServiceImpl.java index e30b1b52..1711d8c7 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/service/impl/MeetingInfoServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/service/impl/MeetingInfoServiceImpl.java @@ -19,6 +19,7 @@ import org.nutz.lang.Lang; import java.util.ArrayList; import java.util.Arrays; +import java.util.LinkedHashMap; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -44,11 +45,12 @@ public class MeetingInfoServiceImpl extends BaseServiceImpl impleme // 插入会议表和会议场次表 info.setCreateTime(DateUtil.now()); insertWith(info, "timePeriods"); + List uniqueUsers = distinctUsers(users); // 插入参与人员表 - if (Lang.isNotEmpty(info.getTimePeriods()) && Lang.isNotEmpty(users)) { + if (Lang.isNotEmpty(info.getTimePeriods()) && Lang.isNotEmpty(uniqueUsers)) { List relations = info.getTimePeriods() .stream() - .flatMap(period -> Arrays.stream(users).map(user -> buildRelation(info.getId(), period.getId(), user))) + .flatMap(period -> uniqueUsers.stream().map(user -> buildRelation(info.getId(), period.getId(), user))) .toList(); dao().insert(relations); } @@ -58,6 +60,7 @@ public class MeetingInfoServiceImpl extends BaseServiceImpl impleme @Aop(TransAop.READ_COMMITTED) public void edit(MeetingInfo info, MeetingTimePeriodUser[] users) { String meetingId = info.getId(); + List uniqueUsers = distinctUsers(users); // 设置外键并保存场次(含新增和修改) info.getTimePeriods().forEach(p -> p.setMeetingId(meetingId)); @@ -79,7 +82,7 @@ public class MeetingInfoServiceImpl extends BaseServiceImpl impleme .collect(Collectors.toSet()); // 页面传过来的新人员 - Set newUserIds = Arrays.stream(users).map(MeetingTimePeriodUser::getUserId).collect(Collectors.toSet()); + Set newUserIds = uniqueUsers.stream().map(MeetingTimePeriodUser::getUserId).collect(Collectors.toSet()); // 删除废弃场次及其所有关联 Set deletedPeriodIds = Sets.difference(oldPeriodIds, newPeriodIds); @@ -99,7 +102,7 @@ public class MeetingInfoServiceImpl extends BaseServiceImpl impleme List newRelations = new ArrayList<>(); // 新增的用户 → 所有现存场次 - List newUsers = Arrays.stream(users).filter(u -> StrUtil.isBlank(u.getId())).toList(); + List newUsers = uniqueUsers.stream().filter(u -> StrUtil.isBlank(u.getId())).toList(); for (String periodId : newPeriodIds) { for (MeetingTimePeriodUser user : newUsers) { newRelations.add(buildRelation(meetingId, periodId, user)); @@ -109,7 +112,7 @@ public class MeetingInfoServiceImpl extends BaseServiceImpl impleme // 新增的场次 → 所有现存老用户(避免重复插入新用户) Set addedPeriodIds = Sets.difference(newPeriodIds, oldPeriodIds); for (String periodId : addedPeriodIds) { - for (MeetingTimePeriodUser user : users) { + for (MeetingTimePeriodUser user : uniqueUsers) { if (StrUtil.isBlank(user.getId())) continue; newRelations.add(buildRelation(meetingId, periodId, user)); } @@ -131,4 +134,21 @@ public class MeetingInfoServiceImpl extends BaseServiceImpl impleme rel.setJoinStatus(true); return rel; } + + /** + * 按用户 ID 去重会议参会人员,保留首次选择的人员信息。 + * 同一用户在一个会议的每个场次只允许生成一条参会关系,防止重复提交或重复选择产生重复记录。 + * + * @param users 前端提交的参会人员数组,每项必须包含 userId + * @return 去重后的参会人员列表,userId 为空的无效项不会参与保存 + */ + private List distinctUsers(MeetingTimePeriodUser[] users) { + if (users == null || users.length == 0) { + return List.of(); + } + return new ArrayList<>(Arrays.stream(users) + .filter(user -> StrUtil.isNotBlank(user.getUserId())) + .collect(Collectors.toMap(MeetingTimePeriodUser::getUserId, user -> user, (first, duplicate) -> first, LinkedHashMap::new)) + .values()); + } } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/controller/QsvOnlineController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/controller/QsvOnlineController.java index 0d1a4394..e897b48e 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/controller/QsvOnlineController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/controller/QsvOnlineController.java @@ -9,7 +9,7 @@ import com.budwk.app.base.page.Pagination; import com.budwk.app.base.param.PageForm; import com.budwk.app.base.result.Result; import com.budwk.app.web.commons.auth.utils.SecurityUtil; -import com.budwk.app.zhgh.activity.basic.models.ActivityUserScope; +import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService; import com.budwk.app.zhgh.dayofficework.qsv.models.QsvActivity; import com.budwk.app.zhgh.dayofficework.qsv.models.QsvOption; import com.budwk.app.zhgh.dayofficework.qsv.models.QsvSubject; @@ -55,6 +55,8 @@ public class QsvOnlineController { private QsvUserAnswerRecordService qsvUserAnswerRecordService; @Inject private QsvQuizService qsvQuizService; + @Inject + private ActivityBasicScopeService activityBasicScopeService; @At("") @Ok("beetl:/platform/zhgh/dayofficework/qsv/online/index.html") @@ -63,27 +65,41 @@ public class QsvOnlineController { } + /** + * 查询当前用户可参与的在线问卷、答题和投票活动。 + * pageForm 传入页码、每页数量与搜索关键字;year 为活动开始年份;title 为标题关键字; + * isAnswered 用于筛选已答或未答活动。返回 Pagination,列表数据仅包含当前用户命中活动分组的活动。 + * + * @param pageForm 分页及搜索参数 + * @param year 活动开始年份 + * @param title 活动标题关键字 + * @param isAnswered 是否只查看已答活动 + * @return 当前用户可参与的在线活动分页结果 + */ @At @SaCheckPermission("qsv.online") @ApiOperation("在线答题任务分页") public Result pageData(@Valid PageForm pageForm, Integer year, String title, Boolean isAnswered) { - List groupIds = dao.query(ActivityUserScope.class, Cnd.where("userId", "=", SecurityUtil.getUserId())) - .stream().map(ActivityUserScope::getGroupId).collect(Collectors.toList()); - if (groupIds.isEmpty()) { - return Result.success(new Pagination<>(pageForm.getPageNumber(), pageForm.getPageSize(), 0, new ArrayList<>())); - } - Cnd cnd = Cnd.where("enabled", "=", true); - cnd.and("groupId", "in", groupIds); cnd.andEX("YEAR(startTime)", "=", year); cnd.and(Cnd.likeEX("title", title)); cnd.desc("startTime"); - int totalCount = dao.count(QsvActivity.class, cnd); - if (totalCount == 0) { + List activities = dao.query(QsvActivity.class, cnd); + if (activities.isEmpty()) { return Result.success(new Pagination<>(pageForm.getPageNumber(), pageForm.getPageSize(), 0, new ArrayList<>())); } - List activities = dao.query(QsvActivity.class, cnd); + + // SQL条件分组不保存 userId 明细,统一通过分组服务动态判断当前用户是否命中活动分组。 + List visibleGroupIds = activityBasicScopeService.filterGroupIdsByUser( + activities.stream().map(QsvActivity::getGroupId).collect(Collectors.toList()), SecurityUtil.getUserId()); + activities = activities.stream() + .filter(activity -> visibleGroupIds.contains(activity.getGroupId())) + .collect(Collectors.toList()); + if (activities.isEmpty()) { + return Result.success(new Pagination<>(pageForm.getPageNumber(), pageForm.getPageSize(), 0, new ArrayList<>())); + } + List activityIds = activities.stream().map(QsvActivity::getId).collect(Collectors.toList()); Map> recordGroup = dao.query(QsvUserAnswerRecord.class, Cnd.where("userId", "=", SecurityUtil.getUserId()) .and("activityId", "in", activityIds)) @@ -248,9 +264,7 @@ public class QsvOnlineController { } private Result checkUserScope(QsvActivity activity) { - int count = dao.count(ActivityUserScope.class, Cnd.where("groupId", "=", activity.getGroupId()) - .and("userId", "=", SecurityUtil.getUserId())); - if (count != 1) { + if (!activityBasicScopeService.isUserInGroup(activity.getGroupId(), SecurityUtil.getUserId())) { return Result.error("您无需参加此次调查,感谢您的关注!"); } return null; diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/h5controller/H5QsvQuizController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/h5controller/H5QsvQuizController.java index fc49d076..c2c8e132 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/h5controller/H5QsvQuizController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/h5controller/H5QsvQuizController.java @@ -8,7 +8,7 @@ import cn.hutool.json.JSONObject; import com.budwk.app.base.annotation.SLog; import com.budwk.app.base.result.Result; import com.budwk.app.web.commons.auth.utils.SecurityUtil; -import com.budwk.app.zhgh.activity.basic.models.ActivityUserScope; +import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService; import com.budwk.app.zhgh.dayofficework.qsv.dto.QsvCheckAnswerResult; import com.budwk.app.zhgh.dayofficework.qsv.models.QsvActivity; import com.budwk.app.zhgh.dayofficework.qsv.models.QsvSubject; @@ -46,6 +46,8 @@ public class H5QsvQuizController { private QsvUserAnswerRecordService qsvUserAnswerRecordService; @Inject private QsvQuizService qsvQuizService; + @Inject + private ActivityBasicScopeService activityBasicScopeService; @At("") @SaCheckLogin @@ -61,18 +63,24 @@ public class H5QsvQuizController { } + /** + * 获取移动端答题活动的题目和当前用户答题记录。 + * activityId 传入 qsv_activity 表中的活动 ID;返回 Result,data 包含活动信息、题目列表和答题记录 ID。 + * 进入前会校验当前登录用户是否命中活动分组,结果分组和 SQL 条件分组均按统一规则判断。 + * + * @param activityId 答题活动 ID + * @return 包含答题题目及答题记录信息的结果 + */ @At @SaCheckLogin @Aop(TransAop.READ_COMMITTED) public Result subjects(@Valid String activityId) { QsvActivity activity = dao.fetch(QsvActivity.class, activityId); - if (activity.getGroupId() != null) { - int count = dao.count(ActivityUserScope.class, Cnd.where("groupId", "=", activity.getGroupId()) - .and("userId", "=", SecurityUtil.getUserId())); - if (count != 1) { - return Result.error("您无需参加此次答题,感谢您的关注!"); - } + // SQL条件分组不保存 userId 明细,统一通过分组服务动态判断当前用户是否属于活动范围。 + if (activity.getGroupId() != null + && !activityBasicScopeService.isUserInGroup(activity.getGroupId(), SecurityUtil.getUserId())) { + return Result.error("您无需参加此次答题,感谢您的关注!"); } String mode = activity.getMode(); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/h5controller/H5QsvSurveyController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/h5controller/H5QsvSurveyController.java index 264af86d..4b099e22 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/h5controller/H5QsvSurveyController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/h5controller/H5QsvSurveyController.java @@ -4,7 +4,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONObject; import com.budwk.app.base.result.Result; import com.budwk.app.web.commons.auth.utils.SecurityUtil; -import com.budwk.app.zhgh.activity.basic.models.ActivityUserScope; +import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService; import com.budwk.app.zhgh.dayofficework.qsv.models.QsvActivity; import com.budwk.app.zhgh.dayofficework.qsv.models.QsvSubject; import com.budwk.app.zhgh.dayofficework.qsv.models.QsvUserAnswerRecord; @@ -39,6 +39,8 @@ public class H5QsvSurveyController { private Dao dao; @Inject private QsvUserAnswerRecordService qsvUserAnswerRecordService; + @Inject + private ActivityBasicScopeService activityBasicScopeService; @At("") @Ok("beetl:/platform/zhghh5/dayofficework/qsv/survey/index.html") @@ -54,10 +56,10 @@ public class H5QsvSurveyController { return activityStatusResult; } - int count = dao.count(ActivityUserScope.class, Cnd.where("groupId", "=", activity.getGroupId()) - .and("userId", "=", SecurityUtil.getUserId())); - if (count != 1) { - return Result.error("您无需参加此次投票,感谢您的关注!"); + // SQL 条件分组不保存用户明细,需由分组服务实时判断当前用户是否命中活动范围。 + if (activity.getGroupId() != null + && !activityBasicScopeService.isUserInGroup(activity.getGroupId(), SecurityUtil.getUserId())) { + return Result.error("您无需参加此次调查,感谢您的关注!"); } String answerRecordId = null; diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/h5controller/H5QsvVoteController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/h5controller/H5QsvVoteController.java index d1498afc..3d04e5eb 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/h5controller/H5QsvVoteController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/h5controller/H5QsvVoteController.java @@ -4,7 +4,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONObject; import com.budwk.app.base.result.Result; import com.budwk.app.web.commons.auth.utils.SecurityUtil; -import com.budwk.app.zhgh.activity.basic.models.ActivityUserScope; +import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService; import com.budwk.app.zhgh.dayofficework.qsv.models.QsvActivity; import com.budwk.app.zhgh.dayofficework.qsv.models.QsvOption; import com.budwk.app.zhgh.dayofficework.qsv.models.QsvSubject; @@ -41,6 +41,8 @@ public class H5QsvVoteController { private Dao dao; @Inject private QsvUserAnswerRecordService qsvUserAnswerRecordService; + @Inject + private ActivityBasicScopeService activityBasicScopeService; @At("") @Ok("beetl:/platform/zhghh5/dayofficework/qsv/vote/index.html") @@ -172,9 +174,8 @@ public class H5QsvVoteController { if (activity.getGroupId() == null) { return null; } - int count = dao.count(ActivityUserScope.class, Cnd.where("groupId", "=", activity.getGroupId()) - .and("userId", "=", SecurityUtil.getUserId())); - if (count != 1) { + // SQL条件分组不保存 userId 明细,统一通过分组服务动态判断当前用户是否属于投票范围。 + if (!activityBasicScopeService.isUserInGroup(activity.getGroupId(), SecurityUtil.getUserId())) { return Result.error("\u60a8\u65e0\u9700\u53c2\u52a0\u6b64\u6b21\u6295\u7968\uff0c\u611f\u8c22\u60a8\u7684\u5173\u6ce8\uff01"); } return null; diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/controller/GuildHallMeetingController.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/controller/GuildHallMeetingController.java index 8034a468..6f9b3dae 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/controller/GuildHallMeetingController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/controller/GuildHallMeetingController.java @@ -7,6 +7,8 @@ import com.budwk.app.base.annotation.SLog; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.param.PageForm; import com.budwk.app.base.result.Result; +import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService; import com.budwk.app.zhgh.democratic.teachercongress.guildhall.models.GuildHall; import com.budwk.app.zhgh.democratic.teachercongress.guildhall.models.GuildHallMeeting; import com.budwk.app.zhgh.democratic.teachercongress.guildhall.models.GuildHallSeat; @@ -40,6 +42,9 @@ public class GuildHallMeetingController { @Inject private GuildHallMeetingService guildHallMeetingService; + @Inject + private ActivityBasicScopeService activityBasicScopeService; + @At("") @SaCheckPermission("guildHall.meeting") @Ok("beetl:/platform/zhgh/democratic/teachercongress/guildhall/meeting/index.html") @@ -109,6 +114,11 @@ public class GuildHallMeetingController { if(DateUtil.compare(DateUtil.date(), meeting.getEndTime()) > 0) { continue; } + // 配置参与组别后,仅向组内用户返回可选会议;未配置组别时默认全员可见。 + if (meeting.getGroupId() != null + && !activityBasicScopeService.isUserInGroup(meeting.getGroupId(), SecurityUtil.getUserId())) { + continue; + } NutMap nutMap = Lang.obj2nutmap(meeting); GuildHall hall = dao.fetch(GuildHall.class, meeting.getHallId()); nutMap.put("address", hall.getAddress()); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/controller/GuildHallSelectSeatController.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/controller/GuildHallSelectSeatController.java index 8e44d0a1..9ddf6cb3 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/controller/GuildHallSelectSeatController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/controller/GuildHallSelectSeatController.java @@ -3,13 +3,16 @@ package com.budwk.app.zhgh.democratic.teachercongress.guildhall.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import com.budwk.app.base.result.Result; import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService; import com.budwk.app.zhgh.democratic.teachercongress.guildhall.models.GuildHallMeeting; import com.budwk.app.zhgh.democratic.teachercongress.guildhall.models.GuildHallSeat; import com.budwk.app.zhgh.democratic.teachercongress.guildhall.models.GuildHallSeatSelect; import com.budwk.app.zhgh.democratic.teachercongress.guildhall.service.GuildHallService; import io.swagger.annotations.Api; +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.mvc.annotation.At; @@ -36,6 +39,8 @@ public class GuildHallSelectSeatController { private Dao dao; @Inject private GuildHallService guildHallService; + @Inject + private ActivityBasicScopeService activityBasicScopeService; @At("") @SaCheckPermission("guildHall.selectSeat") @@ -52,6 +57,11 @@ public class GuildHallSelectSeatController { @At @SaCheckPermission("guildHall.selectSeat") public Result loadSeats(@Param("meetingId") String meetingId) { + Result permissionResult = checkMeetingPermission(meetingId); + if (permissionResult != null) { + return permissionResult; + } + // 已选择情况 List selectedSeats = dao.query(GuildHallSeatSelect.class, Cnd.where("meetingId", "=", meetingId)); @@ -79,7 +89,13 @@ public class GuildHallSelectSeatController { @At @SaCheckPermission("guildHall.selectSeat") + @Aop(TransAop.READ_COMMITTED) public Result doSelect(@Param("meetingId") String meetingId, Integer rowNumber, Integer colNumber) { + Result permissionResult = checkMeetingPermission(meetingId); + if (permissionResult != null) { + return permissionResult; + } + GuildHallSeatSelect oldSeat = dao.fetch(GuildHallSeatSelect.class, Cnd.where("meetingId", "=", meetingId).and("userId", "=", SecurityUtil.getUserId())); if(oldSeat != null){ oldSeat.setUserId(null); @@ -94,4 +110,22 @@ public class GuildHallSelectSeatController { return Result.success(); } + + /** + * 校验当前用户是否可参与指定会议;未配置参与组别的会议默认允许选座。 + * + * @param meetingId 会议主键,用于查询会议的参与组别配置 + * @return 校验通过时返回 {@code null};会议不存在或用户不在参与组别时返回错误结果 + */ + private Result checkMeetingPermission(String meetingId) { + GuildHallMeeting meeting = dao.fetch(GuildHallMeeting.class, meetingId); + if (meeting == null) { + return Result.error("会议不存在或已删除"); + } + if (meeting.getGroupId() != null + && !activityBasicScopeService.isUserInGroup(meeting.getGroupId(), SecurityUtil.getUserId())) { + return Result.error("您不在本次会议参与组别内"); + } + return null; + } } diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/thirtyTeach/controller/ThirtyTeachController.java b/src/main/java/com/budwk/app/zhgh/staffmanage/thirtyTeach/controller/ThirtyTeachController.java index 3ffa505e..aee97061 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/thirtyTeach/controller/ThirtyTeachController.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/thirtyTeach/controller/ThirtyTeachController.java @@ -87,6 +87,7 @@ public class ThirtyTeachController { @ApiOperation("一键设置三十龄教工") @SaCheckPermission("thirtyTeach.manage") @SLog(type = "30龄教工-教职工管理", tag = "设置三十龄教工",msg = "设置三十龄教工设置教龄${args[0]}") + @Aop(TransAop.READ_COMMITTED) public Result setThirtyTeach(Integer setNum, boolean isFlag){ if (isFlag) { sysUserService.update(Chain.make("isThirtyTeach", 0), Cnd.NEW()); @@ -95,6 +96,8 @@ public class ThirtyTeachController { cnd.and("arrivalAtSchoolDate", "is not", null); cnd.and("arrivalAtSchoolDate", "!=", ""); cnd.and(TEACH_NUM_SQL, ">", setNum); + // 一键设置只标记已确认会员,确保设置范围与管理列表保持一致。 + cnd.and("member", "=", true); sysUserService.update(Chain.make("isThirtyTeach", 1), cnd); return Result.success(); } diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/thirtyTeach/service/impl/ThirtyTeachServiceImpl.java b/src/main/java/com/budwk/app/zhgh/staffmanage/thirtyTeach/service/impl/ThirtyTeachServiceImpl.java index 796b395f..7c522dc5 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/thirtyTeach/service/impl/ThirtyTeachServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/thirtyTeach/service/impl/ThirtyTeachServiceImpl.java @@ -55,6 +55,8 @@ public class ThirtyTeachServiceImpl extends BaseServiceImpl implements ThirtyTea sql.setVar("teachNumSql", new Static(TEACH_NUM_SQL)); Cnd cnd = Cnd.NEW(); cnd.and("isThirtyTeach", "=", 1); + // 三十年教龄名单仅展示已确认会员,避免非会员进入管理及导出范围。 + cnd.and("member", "=", true); if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { SqlExpressionGroup seg = new SqlExpressionGroup(); seg.orLike("loginname", pageForm.getSearchKeyword()); diff --git a/src/main/resources/static/components/module/activity/UserDataScope.vue b/src/main/resources/static/components/module/activity/UserDataScope.vue index 1786fce5..a187fed9 100644 --- a/src/main/resources/static/components/module/activity/UserDataScope.vue +++ b/src/main/resources/static/components/module/activity/UserDataScope.vue @@ -114,7 +114,7 @@
- 搜索 + 搜索
@@ -133,7 +133,8 @@ 删除{{ currentGroupName }} - +