From d2321929c20c4c1c421184a0ae6111f4c92928f0 Mon Sep 17 00:00:00 2001 From: zhangrui Date: Wed, 19 Aug 2026 16:43:18 +0800 Subject: [PATCH] change --- .../app/sys/controller/SysRoleController.java | 9 +- .../budwk/app/sys/models/Sys_user_role.java | 9 ++ .../app/sys/services/SysUserService.java | 13 +- .../sys/services/impl/SysUserServiceImpl.java | 128 ++++++++---------- .../UnionReimburseCollectController.java | 5 +- ...acherCongressDelegateManageController.java | 16 ++- .../TeacherCongressDelegateListener.java | 10 +- .../TeacherCongressDelegationServiceImpl.java | 86 +++++++++++- ...herCongressInstitutionUserServiceImpl.java | 7 + .../TeacherCongressSessionService.java | 25 ++++ .../TeacherCongressSessionServiceImpl.java | 100 ++++++++++++-- .../zhgh/dayofficework/unionReimburse/info.js | 9 +- .../teachercongress/delegation/headForm.js | 14 +- 13 files changed, 326 insertions(+), 105 deletions(-) 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 082d7c62..8b3d9cf4 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysRoleController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysRoleController.java @@ -42,7 +42,6 @@ import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; /** * Created by wizzer on 2016/6/28. @@ -555,12 +554,8 @@ public class SysRoleController { @Ok("json:full") @SaCheckLogin public Result getRoleNames(){ - // 首页只展示当前有效角色,历史教代会届次角色仍保留数据但不参与当前身份展示。 - String roleNames = sysUserService.getEffectiveRoles(SecurityUtil.getUserId()).stream() - .map(Sys_role::getName) - .filter(StrUtil::isNotBlank) - .distinct() - .collect(Collectors.joining(",")); + // 首页身份与菜单、接口权限使用同一启用角色集合。 + String roleNames = sysUserService.getEnabledRoleNames(SecurityUtil.getUserId()); return Result.success(NutMap.NEW().addv("roleNames", roleNames)); } diff --git a/src/main/java/com/budwk/app/sys/models/Sys_user_role.java b/src/main/java/com/budwk/app/sys/models/Sys_user_role.java index 5da88494..0e8420ee 100644 --- a/src/main/java/com/budwk/app/sys/models/Sys_user_role.java +++ b/src/main/java/com/budwk/app/sys/models/Sys_user_role.java @@ -16,6 +16,15 @@ public class Sys_user_role { @ColDefine(type = ColType.VARCHAR, width = 32) private String userId; + /** + * 用户角色关系是否启用。普通角色默认启用,教代会届次切换时按届次统一刷新。 + */ + @Column + @Comment("是否启用:1启用,0禁用") + @ColDefine(type = ColType.BOOLEAN) + @Default("1") + private Boolean enable = true; + @Column @ColDefine(type = ColType.VARCHAR, width = 32) private String unitId; diff --git a/src/main/java/com/budwk/app/sys/services/SysUserService.java b/src/main/java/com/budwk/app/sys/services/SysUserService.java index b4c46229..62746a26 100644 --- a/src/main/java/com/budwk/app/sys/services/SysUserService.java +++ b/src/main/java/com/budwk/app/sys/services/SysUserService.java @@ -33,13 +33,20 @@ public interface SysUserService extends BaseService { List getRoleCodeList(Sys_user user); /** - * 查询用户当前有效的角色。普通角色始终有效,教代会届次角色仅保留最新创建届次的数据。 + * 查询用户当前启用的角色关系对应角色,供菜单、接口权限和首页身份统一使用。 * * @param userId 用户ID - * @return 当前有效的系统角色列表,按角色排序倒序返回 + * @return 当前启用且角色本身未禁用的角色列表 */ - List getEffectiveRoles(String userId); + List getEnabledRoles(String userId); + /** + * 查询用户当前启用角色的显示名称。 + * + * @param userId 用户ID + * @return 去重并按角色顺序排列的角色名称 + */ + String getEnabledRoleNames(String userId); /** * 获取用户的菜单 diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java index 54b4e1c7..e4141107 100644 --- a/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java +++ b/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java @@ -65,16 +65,12 @@ public class SysUserServiceImpl extends BaseServiceImpl implements Sys private RedisService redisService; @Override - @CacheResult(cacheKey = "${userId}_getPermissionList_currentSession") + @CacheResult(cacheKey = "${userId}_getPermissionList") public List getPermissionList(String userId) { - if (this.fetch(userId) == null) { - return new ArrayList<>(); - } List permissionList = new ArrayList(); - for (Sys_role role : getEffectiveRoles(userId)) { - if (!role.isDisabled()) { - permissionList.addAll(sysRoleService.getPermissionList(role)); - } + // Sa-Token接口权限只汇总启用的用户角色关系,历史届次角色不再参与鉴权。 + for (Sys_role role : getEnabledRoles(userId)) { + permissionList.addAll(sysRoleService.getPermissionList(role)); } // 追加public公共角色权限 permissionList.addAll(sysRoleService.getPermissionList(sysRoleService.fetch(Cnd.where("code", "=", "public")))); @@ -87,45 +83,46 @@ public class SysUserServiceImpl extends BaseServiceImpl implements Sys * @param user * @return */ - @CacheResult(cacheKey = "${user.id}_getRoleCodeList_currentSession") + @CacheResult(cacheKey = "${user.id}_getRoleCodeList") public List getRoleCodeList(Sys_user user) { - List roleNameList = new ArrayList(); - for (Sys_role role : getEffectiveRoles(user.getId())) { - if (!role.isDisabled()) roleNameList.add(role.getCode()); + if (user == null) { + return new ArrayList<>(); } - return roleNameList; + // AuthUtil.hasRole与Sa-Token角色判断共用启用角色集合。 + return getEnabledRoles(user.getId()).stream() + .map(Sys_role::getCode) + .filter(StrUtil::isNotBlank) + .distinct() + .toList(); } /** - * 查询用户当前有效角色。tcSessionId 为空的普通角色不受届次影响;教代会角色只认创建时间最新的届次。 - * 历史届次关系继续保存在 sys_user_role 中,以便删除最新届次后自动恢复上一届身份。 + * 查询用户当前启用角色。用户角色关系和角色本身必须同时处于启用状态。 * * @param userId 用户ID - * @return 当前有效的角色实体列表 + * @return 当前启用角色列表 */ @Override - public List getEffectiveRoles(String userId) { + @CacheResult(cacheKey = "${userId}_getEnabledRoles") + public List getEnabledRoles(String userId) { + if (StrUtil.isBlank(userId) || fetch(userId) == null) { + return new ArrayList<>(); + } Sql sql = Sqls.create(""" SELECT DISTINCT - sr.* + role.* FROM - sys_role sr - INNER JOIN sys_user_role userRole ON userRole.roleId = sr.id + sys_role role + INNER JOIN sys_user_role userRole ON userRole.roleId = role.id WHERE userRole.userId = @userId - AND ( - userRole.tcSessionId IS NULL - OR userRole.tcSessionId = '' - OR userRole.tcSessionId = ( - SELECT tcs.id - FROM teacher_congress_session tcs - ORDER BY tcs.createdAt DESC, tcs.id DESC - LIMIT 1 - ) - ) - ORDER BY sr.sort DESC, sr.id + AND userRole.enable = @t + AND role.disabled = @f + ORDER BY role.sort DESC, role.id """); sql.setParam("userId", userId); + sql.setParam("t", true); + sql.setParam("f", false); sql.setCallback(Sqls.callback.entities()); sql.setEntity(dao().getEntity(Sys_role.class)); dao().execute(sql); @@ -133,16 +130,18 @@ public class SysUserServiceImpl extends BaseServiceImpl implements Sys } /** - * 查询用户当前有效且已启用的角色ID,供菜单和按钮权限查询统一复用。 + * 汇总用户当前启用角色名称,首页展示与菜单及接口权限保持相同数据口径。 * * @param userId 用户ID - * @return 有效角色ID列表 + * @return 逗号分隔的角色名称 */ - private List getEnabledEffectiveRoleIds(String userId) { - return getEffectiveRoles(userId).stream() - .filter(role -> !role.isDisabled()) - .map(Sys_role::getId) - .toList(); + @Override + public String getEnabledRoleNames(String userId) { + return getEnabledRoles(userId).stream() + .map(Sys_role::getName) + .filter(StrUtil::isNotBlank) + .distinct() + .collect(Collectors.joining(",")); } /** @@ -204,12 +203,9 @@ public class SysUserServiceImpl extends BaseServiceImpl implements Sys */ // @CacheResult(cacheKey = "${userId}_getMenus") public List getMenus(String userId) { - List roleIds = getEnabledEffectiveRoleIds(userId); - if (roleIds.isEmpty()) { - return new ArrayList<>(); - } - Sql sql = Sqls.create("select distinct a.* from sys_menu a,sys_role_menu b where a.id=b.menuId and " + " b.roleId in(@roleIds) and a.disabled=@f and a.showit=@t and a.type='menu' order by a.location ASC,a.path asc"); - sql.params().set("roleIds", roleIds); + // 菜单仅使用启用的用户角色关系,普通角色与当前开启届次角色保持原有权限。 + Sql sql = Sqls.create("select distinct a.* from sys_menu a,sys_role_menu b where a.id=b.menuId and " + " b.roleId in(select c.roleId from sys_user_role c,sys_role d where c.roleId=d.id and c.userId=@userId and c.enable=@t and d.disabled=@f) and a.disabled=@f and a.showit=@t and a.type='menu' order by a.location ASC,a.path asc"); + sql.params().set("userId", userId); sql.params().set("f", false); sql.params().set("t", true); return sysMenuService.listEntity(sql); @@ -223,13 +219,10 @@ public class SysUserServiceImpl extends BaseServiceImpl implements Sys */ // @CacheResult(cacheKey = "${userId}_getMenusAndButtons") public List getMenusAndButtons(String userId) { - List roleIds = getEnabledEffectiveRoleIds(userId); - if (roleIds.isEmpty()) { - return new ArrayList<>(); - } - Sql sql = Sqls.create("select distinct a.* from sys_menu a,sys_role_menu b where a.id=b.menuId and " + " b.roleId in(@roleIds) and a.disabled=@f order by a.location ASC,a.path asc"); - sql.params().set("roleIds", roleIds); + Sql sql = Sqls.create("select distinct a.* from sys_menu a,sys_role_menu b where a.id=b.menuId and " + " b.roleId in(select c.roleId from sys_user_role c,sys_role d where c.roleId=d.id and c.userId=@userId and c.enable=@t and d.disabled=@f) and a.disabled=@f order by a.location ASC,a.path asc"); + sql.params().set("userId", userId); sql.params().set("f", false); + sql.params().set("t", true); return sysMenuService.listEntity(sql); } @@ -244,15 +237,12 @@ public class SysUserServiceImpl extends BaseServiceImpl implements Sys * @param userId * @return */ - @CacheResult(cacheKey = "${userId}_getDatas_currentSession") + @CacheResult(cacheKey = "${userId}_getDatas") public List getDatas(String userId) { - List roleIds = getEnabledEffectiveRoleIds(userId); - if (roleIds.isEmpty()) { - return new ArrayList<>(); - } - Sql sql = Sqls.create("select distinct a.* from sys_menu a,sys_role_menu b where a.id=b.menuId and " + " b.roleId in(@roleIds) and a.disabled=@f and a.type='data' order by a.location ASC,a.path asc"); - sql.params().set("roleIds", roleIds); + Sql sql = Sqls.create("select distinct a.* from sys_menu a,sys_role_menu b where a.id=b.menuId and " + " b.roleId in(select c.roleId from sys_user_role c,sys_role d where c.roleId=d.id and c.userId=@userId and c.enable=@t and d.disabled=@f) and a.disabled=@f and a.type='data' order by a.location ASC,a.path asc"); + sql.params().set("userId", userId); sql.params().set("f", false); + sql.params().set("t", true); return sysMenuService.listEntity(sql); } @@ -285,15 +275,12 @@ public class SysUserServiceImpl extends BaseServiceImpl implements Sys * @param pid * @return */ - @CacheResult(cacheKey = "${userId}_${pid}_getRoleMenus_currentSession") + @CacheResult(cacheKey = "${userId}_${pid}_getRoleMenus") public List getRoleMenus(String userId, String pid) { - List roleIds = getEnabledEffectiveRoleIds(userId); - if (roleIds.isEmpty()) { - return new ArrayList<>(); - } - Sql sql = Sqls.create("select distinct a.* from sys_menu a,sys_role_menu b where a.id=b.menuId and " + "$m and b.roleId in(@roleIds) and a.disabled=@f order by a.location ASC,a.path asc"); - sql.params().set("roleIds", roleIds); + Sql sql = Sqls.create("select distinct a.* from sys_menu a,sys_role_menu b where a.id=b.menuId and " + "$m and b.roleId in(select c.roleId from sys_user_role c,sys_role d where c.roleId=d.id and c.userId=@userId and c.enable=@t and d.disabled=@f) and a.disabled=@f order by a.location ASC,a.path asc"); + sql.params().set("userId", userId); sql.params().set("f", false); + sql.params().set("t", true); if (Strings.isNotBlank(pid)) { sql.vars().set("m", "a.parentId='" + pid + "'"); } else { @@ -308,15 +295,12 @@ public class SysUserServiceImpl extends BaseServiceImpl implements Sys * @param pid * @return */ - @CacheResult(cacheKey = "${userId}_${pid}_hasChildren_currentSession") + @CacheResult(cacheKey = "${userId}_${pid}_hasChildren") public boolean hasChildren(String userId, String pid) { - List roleIds = getEnabledEffectiveRoleIds(userId); - if (roleIds.isEmpty()) { - return false; - } - Sql sql = Sqls.create("select count(*) from sys_menu a,sys_role_menu b where a.id=b.menuId and " + "$m and b.roleId in(@roleIds) and a.disabled=@f order by a.location ASC,a.path asc"); - sql.params().set("roleIds", roleIds); + Sql sql = Sqls.create("select count(*) from sys_menu a,sys_role_menu b where a.id=b.menuId and " + "$m and b.roleId in(select c.roleId from sys_user_role c,sys_role d where c.roleId=d.id and c.userId=@userId and c.enable=@t and d.disabled=@f) and a.disabled=@f order by a.location ASC,a.path asc"); + sql.params().set("userId", userId); sql.params().set("f", false); + sql.params().set("t", true); if (Strings.isNotBlank(pid)) { sql.vars().set("m", "a.parentId='" + pid + "'"); } else { @@ -450,6 +434,8 @@ public class SysUserServiceImpl extends BaseServiceImpl implements Sys user.setUnion(union); } user = this.fillMenu(user); + // 登录用户返回给前端的角色同样只保留启用关系,避免历史届次角色继续触发页面 hasRole 判断。 + user.setRoles(this.getEnabledRoles(userId)); user.setPermissions(this.getPermissionList(userId)); return user; } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/unionReimburse/controller/UnionReimburseCollectController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/unionReimburse/controller/UnionReimburseCollectController.java index deeea605..40e77654 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/unionReimburse/controller/UnionReimburseCollectController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/unionReimburse/controller/UnionReimburseCollectController.java @@ -85,9 +85,12 @@ public class UnionReimburseCollectController { @Param(value = "reimburseProject") String reimburseProject) { Sql sql = Sqls.create(""" SELECT - info.* + info.*, + ins.id AS instanceId, + ins.processDefineId AS instanceProcessDefineId FROM union_reimburse info + LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id $condition """); Cnd cnd = Cnd.NEW(); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegateManageController.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegateManageController.java index 98f21e8b..44d7d89d 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegateManageController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegateManageController.java @@ -27,6 +27,7 @@ import com.budwk.app.zhgh.democratic.teachercongress.delegate.service.TeacherCon import com.budwk.app.zhgh.democratic.teachercongress.delegation.models.Teacher_congress_delegation; import com.budwk.app.zhgh.democratic.teachercongress.delegation.models.Teacher_congress_delegation_union; import com.budwk.app.zhgh.democratic.teachercongress.delegation.models.Teacher_congress_delegation_unit; +import com.budwk.app.zhgh.democratic.teachercongress.prepare.service.TeacherCongressSessionService; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.usermodel.*; @@ -68,6 +69,8 @@ public class TeacherCongressDelegateManageController { private SysRoleService sysRoleService; @Inject private TeacherCongressDelegateService teacherDelegateService; + @Inject + private TeacherCongressSessionService teacherCongressSessionService; @At("") @Ok("beetl:/platform/zhgh/democratic/teachercongress/delegate/manage/index.html") @@ -123,12 +126,14 @@ public class TeacherCongressDelegateManageController { .and(Sys_user_role::getTcSessionId, "=", param.getSessionId()) .and(Sys_user_role::getRoleId, "=", param.getRoleId())); + boolean roleEnable = teacherCongressSessionService.isSessionRoleEnabled(param.getSessionId()); List userRoles = userIds.stream().map(userId -> { Sys_user_role role = new Sys_user_role(); role.setUserId(userId); role.setTcSessionId(param.getSessionId()); role.setTcDelegationId(param.getDelegationId()); role.setRoleId(param.getRoleId()); + role.setEnable(roleEnable); return role; }).toList(); dao.insert(userRoles); @@ -160,6 +165,7 @@ public class TeacherCongressDelegateManageController { role.setTcSessionId(param.getSessionId()); role.setTcDelegationId(param.getDelegationId()); role.setRoleId(param.getRoleId()); + teacherCongressSessionService.prepareSessionRole(role); dao.insert(role); sysUserService.clearCache(); @@ -330,12 +336,14 @@ public class TeacherCongressDelegateManageController { dao.insert(delegates); //插入权限 + boolean roleEnable = teacherCongressSessionService.isSessionRoleEnabled(sessionId); List sysUserRoles = delegates.stream().map(delegate -> { Sys_user_role sysUserRole = new Sys_user_role(); sysUserRole.setUserId(delegate.getUserId()); sysUserRole.setRoleId(delegate.getRoleId()); sysUserRole.setTcSessionId(sessionId); sysUserRole.setTcDelegationId(delegate.getDelegationId()); + sysUserRole.setEnable(roleEnable); return sysUserRole; }).toList(); dao.insert(sysUserRoles); @@ -464,7 +472,12 @@ public class TeacherCongressDelegateManageController { try { dao.insert(delegate); - dao.insert("sys_user_role", Chain.make("userId", delegate.getUserId()).add("roleId", delegate.getRoleId()).add("tcSessionId", sessionId).add("tcDelegationId", delegate.getDelegationId())); + // Excel导入也必须继承届次启用状态,避免向历史届次导入代表后恢复旧权限。 + dao.insert("sys_user_role", Chain.make("userId", delegate.getUserId()) + .add("roleId", delegate.getRoleId()) + .add("tcSessionId", sessionId) + .add("tcDelegationId", delegate.getDelegationId()) + .add("enable", teacherCongressSessionService.isSessionRoleEnabled(sessionId))); sysUserService.clearCache(); } catch (Exception e) { log.error("导入代表失败:{}", e.getMessage()); @@ -512,6 +525,7 @@ public class TeacherCongressDelegateManageController { userRole.setRoleId(sys_role2.getId()); } userRole.setTcDelegationId(delegate.getDelegationId()); + teacherCongressSessionService.prepareSessionRole(userRole); dao.insert(userRole); } sysUserService.clearCache(); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/listener/TeacherCongressDelegateListener.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/listener/TeacherCongressDelegateListener.java index 75aa26f9..f2b5b53d 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/listener/TeacherCongressDelegateListener.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/listener/TeacherCongressDelegateListener.java @@ -13,6 +13,7 @@ import com.budwk.app.zhgh.democratic.proposal.models.ProposalConfig; import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.Teacher_congress_delegate; import com.budwk.app.zhgh.democratic.teachercongress.delegation.models.Teacher_congress_delegation_unit; import com.budwk.app.zhgh.democratic.teachercongress.prepare.models.Teacher_congress_session; +import com.budwk.app.zhgh.democratic.teachercongress.prepare.service.TeacherCongressSessionService; import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeType; import org.nutz.aop.interceptor.async.Async; import org.nutz.dao.Cnd; @@ -38,6 +39,8 @@ public class TeacherCongressDelegateListener implements SysUserEventListener { private SysUserService sysUserService; @Inject private SysRoleService sysRoleService; + @Inject + private TeacherCongressSessionService teacherCongressSessionService; @Override @Async @@ -46,8 +49,10 @@ public class TeacherCongressDelegateListener implements SysUserEventListener { return; } - //查询当前最新届次 - Teacher_congress_session session = dao.fetch(Teacher_congress_session.class, Cnd.NEW().desc(Teacher_congress_session::getStartDate)); + // 人员单位变更只同步当前开启届次,防止误修改历史届次代表及角色关系。 + Teacher_congress_session session = dao.fetch(Teacher_congress_session.class, + Cnd.where(Teacher_congress_session::getEnable, "=", true) + .desc(Teacher_congress_session::getStartDate)); if (session == null) { return; } @@ -102,6 +107,7 @@ public class TeacherCongressDelegateListener implements SysUserEventListener { sysUserRole.setTcSessionId(session.getId()); sysUserRole.setTcDelegationId(currentDelegate.getDelegationId()); sysUserRole.setRoleId(currentDelegate.getRoleId()); + teacherCongressSessionService.prepareSessionRole(sysUserRole); dao.insert(sysUserRole); sysUserService.clearCache(); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/service/impl/TeacherCongressDelegationServiceImpl.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/service/impl/TeacherCongressDelegationServiceImpl.java index 6d539c7a..272d8d79 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/service/impl/TeacherCongressDelegationServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/service/impl/TeacherCongressDelegationServiceImpl.java @@ -8,8 +8,10 @@ import com.budwk.app.sys.models.Sys_role; import com.budwk.app.sys.models.Sys_user_role; import com.budwk.app.sys.services.SysRoleService; import com.budwk.app.sys.services.SysUserService; +import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.Teacher_congress_delegate; import com.budwk.app.zhgh.democratic.teachercongress.delegation.models.Teacher_congress_delegation; import com.budwk.app.zhgh.democratic.teachercongress.delegation.service.TeacherCongressDelegationService; +import com.budwk.app.zhgh.democratic.teachercongress.prepare.service.TeacherCongressSessionService; import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Chain; import org.nutz.dao.Cnd; @@ -23,6 +25,8 @@ import org.nutz.lang.util.NutMap; import java.util.Arrays; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; /** * 教代会代表团业务服务实现。 @@ -36,6 +40,9 @@ public class TeacherCongressDelegationServiceImpl extends BaseServiceImpl delegates = dao().query(Teacher_congress_delegate.class, + Cnd.where(Teacher_congress_delegate::getSessionId, "=", sessionId) + .and(Teacher_congress_delegate::getDelegationId, "=", delegationId) + .and(Teacher_congress_delegate::getRoleId, "=", formalDelegateRole.getId()) + .and(Teacher_congress_delegate::getUserId, "in", viceUserIds)); + Set validUserIds = delegates.stream() + .map(Teacher_congress_delegate::getUserId) + .collect(Collectors.toSet()); + if (validUserIds.size() != viceUserIds.length) { + throw new BaseException("副团长必须从当前届次、当前代表团的正式代表中选择"); + } + } + + /** + * 校验角色关系的实际保存数量,防止接口在数据未完整写入时返回成功。 + * + * @param sessionId 届次ID + * @param delegationId 代表团ID + * @param roleId 角色ID + * @param expected 预期保存数量 + */ + private void validateRoleUserCount(String sessionId, String delegationId, String roleId, int expected) { + int actual = dao().count(Sys_user_role.class, + Cnd.where(Sys_user_role::getTcSessionId, "=", sessionId) + .and(Sys_user_role::getTcDelegationId, "=", delegationId) + .and(Sys_user_role::getRoleId, "=", roleId)); + if (actual != expected) { + throw new BaseException("副团长设置失败,请刷新页面后重试"); + } + } +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/institution/service/impl/TeacherCongressInstitutionUserServiceImpl.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/institution/service/impl/TeacherCongressInstitutionUserServiceImpl.java index e2816eb9..24048d7b 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/institution/service/impl/TeacherCongressInstitutionUserServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/institution/service/impl/TeacherCongressInstitutionUserServiceImpl.java @@ -10,6 +10,7 @@ import com.budwk.app.sys.services.SysUserService; import com.budwk.app.zhgh.democratic.teachercongress.institution.models.Teacher_congress_institution; import com.budwk.app.zhgh.democratic.teachercongress.institution.models.Teacher_congress_institution_user; import com.budwk.app.zhgh.democratic.teachercongress.institution.service.TeacherCongressInstitutionUserService; +import com.budwk.app.zhgh.democratic.teachercongress.prepare.service.TeacherCongressSessionService; import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; @@ -25,6 +26,8 @@ public class TeacherCongressInstitutionUserServiceImpl extends BaseServiceImpl lastInstitutions = dao().query(Teacher_congress_institution.class, Cnd.where(Teacher_congress_institution::getSessionId, "=", lastSession.getId())); @@ -143,6 +145,7 @@ public class TeacherCongressSessionServiceImpl extends BaseServiceImpl - + - - + - {{viewData.loginName}} {{viewData.userName}} {{viewData.unitName}} @@ -37,7 +35,8 @@ const unionReimburseInfo = { {{ viewData.mobile }} - + + diff --git a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegation/headForm.js b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegation/headForm.js index 27ba148c..8c31612f 100644 --- a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegation/headForm.js +++ b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegation/headForm.js @@ -131,7 +131,19 @@ const HEAD_FORM_TEMPLATE = { doSubmitHead() { this.$refs.headFormRef.validate((valid) => { if (valid) { - this.$axios.post("/platform/teacherCongress/delegation/insertHead", this.formData).then((res) => { + // 多选数组必须使用同名参数重复提交,确保后端 String[] 能正确接收全部副团长ID。 + const submitData = new URLSearchParams() + submitData.append("delegationId", this.formData.delegationId) + submitData.append("sessionId", this.formData.sessionId) + submitData.append("userId", this.formData.userId) + if (this.formData.contactUserId) { + submitData.append("contactUserId", this.formData.contactUserId) + } + const viceUserIds = this.formData.viceUserIds || [] + viceUserIds.forEach((viceUserId) => { + submitData.append("viceUserIds", viceUserId) + }) + this.$axios.post("/platform/teacherCongress/delegation/insertHead", submitData).then((res) => { if (res.code === 0) { this.headDialogFormVisible = false this.$message.success(res.msg)