From 3e520a68b844997fa5a7588918ae6eaf8433efc0 Mon Sep 17 00:00:00 2001 From: = <=> Date: Sat, 16 May 2026 17:20:17 +0800 Subject: [PATCH] commit --- .../app/sys/controller/SysUnitController.java | 30 ++++---- .../app/sys/services/SysUnitService.java | 13 ++++ .../sys/services/impl/SysUnitServiceImpl.java | 71 +++++++++++++++++++ ...acherCongressDelegateManageController.java | 16 ++++- ...CongressDelegatePushZgAuditController.java | 25 +++++++ ...rCongressDelegateTransitionController.java | 8 +-- .../views/platform/sys/unit/unitLeader.js | 10 ++- 7 files changed, 151 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/budwk/app/sys/controller/SysUnitController.java b/src/main/java/com/budwk/app/sys/controller/SysUnitController.java index 3f385d7..28bd292 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysUnitController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysUnitController.java @@ -146,20 +146,22 @@ public class SysUnitController { @At @ApiOperation("按关键字查询单位下的人员") @Ok("json:{ignoreNull:true}") - public Result listUserSelect(@Valid String unitId, @Valid String keyWord) { - Sql sql = Sqls.create("select id,loginname,username,unitname from vw_user $condition"); - Cnd cnd = Cnd.NEW(); - cnd.and(View_user::getUnitId, "=", unitId); - SqlExpressionGroup seg = new SqlExpressionGroup(); - seg.orLike(View_user::getLoginname, keyWord, true); - seg.orLike(View_user::getUsername, keyWord, true); - cnd.and(seg); - cnd.limit(1, 10); - sql.setCondition(cnd); - sql.setCallback(Sqls.callback.entities()); - sql.setEntity(sysUnitService.dao().getEntity(View_user.class)); - sysUnitService.dao().execute(sql); - List list = sql.getList(View_user.class); + public Result listUserSelect(@Valid String unitId, @Valid String keyWord, @Valid String roleCode) { +// Sql sql = Sqls.create("select id,loginname,username,unitname from vw_user $condition"); +// Cnd cnd = Cnd.NEW(); +// cnd.and(View_user::getUnitId, "=", unitId); +// SqlExpressionGroup seg = new SqlExpressionGroup(); +// seg.orLike(View_user::getLoginname, keyWord, true); +// seg.orLike(View_user::getUsername, keyWord, true); +// cnd.and(seg); +// cnd.limit(1, 10); +// sql.setCondition(cnd); +// sql.setCallback(Sqls.callback.entities()); +// sql.setEntity(sysUnitService.dao().getEntity(View_user.class)); +// sysUnitService.dao().execute(sql); +// List list = sql.getList(View_user.class); + // 人员范围判断放到 service 层,便于按单位干部角色复用同一套查询规则。 + List list = sysUnitService.listUserSelect(unitId, keyWord, roleCode); return Result.success(list); } diff --git a/src/main/java/com/budwk/app/sys/services/SysUnitService.java b/src/main/java/com/budwk/app/sys/services/SysUnitService.java index 257cd73..7f6688f 100644 --- a/src/main/java/com/budwk/app/sys/services/SysUnitService.java +++ b/src/main/java/com/budwk/app/sys/services/SysUnitService.java @@ -2,6 +2,9 @@ package com.budwk.app.sys.services; import com.budwk.app.base.service.BaseService; import com.budwk.app.sys.models.Sys_unit; +import com.budwk.app.sys.views.View_user; + +import java.util.List; /** * Created by wizzer on 2016/12/22. @@ -22,6 +25,16 @@ public interface SysUnitService extends BaseService { */ void deleteAndChild(Sys_unit unit); + /** + * 按单位干部角色查询可选择人员。 + * + * @param unitId 当前单位ID + * @param keyWord 人员工号或姓名关键字 + * @param roleCode 当前选择的单位干部角色编码 + * @return 可选择人员列表 + */ + List listUserSelect(String unitId, String keyWord, String roleCode); + /** * 清空缓存 */ diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysUnitServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysUnitServiceImpl.java index 953e014..a483263 100644 --- a/src/main/java/com/budwk/app/sys/services/impl/SysUnitServiceImpl.java +++ b/src/main/java/com/budwk/app/sys/services/impl/SysUnitServiceImpl.java @@ -1,21 +1,27 @@ package com.budwk.app.sys.services.impl; import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.constant.RedisConstant; import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.sys.models.Sys_unit; import com.budwk.app.sys.services.SysUnitService; +import com.budwk.app.sys.views.View_user; 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.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.dao.util.cri.SqlExpressionGroup; import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.Strings; import org.nutz.plugins.wkcache.annotation.CacheDefaults; import org.nutz.plugins.wkcache.annotation.CacheRemoveAll; +import java.util.List; + /** * Created by wizzer on 2016/12/22. */ @@ -69,6 +75,71 @@ public class SysUnitServiceImpl extends BaseServiceImpl implements Sys } } + /** + * 按单位干部角色查询可选择人员。 + * 选择单位党委书记时,人员范围放大到当前单位所属分工会下所有单位的人员; + * 选择单位分管校领导时,查询已关联单位分管校领导角色的人员;其他角色保持当前单位范围。 + * + * @param unitId 当前单位ID + * @param keyWord 人员工号或姓名关键字 + * @param roleCode 当前选择的单位干部角色编码 + * @return 可选择人员列表 + */ + @Override + public List listUserSelect(String unitId, String keyWord, String roleCode) { + Sql sql; + Cnd cnd = Cnd.NEW(); + if ("UNIT_SCHOOL_LEADER".equals(roleCode)) { + sql = Sqls.create(""" + select distinct + u.id, + u.loginname, + u.username, + u.unitname + from vw_user u + inner join sys_user_role ur on ur.userId = u.id + inner join sys_role r on r.id = ur.roleId + $condition + """); + // 单位分管校领导从已绑定 UNIT_SCHOOL_LEADER 角色的人员中选择。 + cnd.and("r.code", "=", "UNIT_SCHOOL_LEADER"); + } else { + sql = Sqls.create("select id,loginname,username,unitname from vw_user $condition"); + } + if (RoleConstant.UNIT_PARTY_SECRETARY.name().equals(roleCode)) { + Sys_unit unit = this.fetch(unitId); + if (unit != null && Strings.isNotBlank(unit.getUnionId())) { + SqlExpressionGroup scopeGroup = new SqlExpressionGroup(); + // 单位党委书记可从当前单位所属分工会下选择人员,同时保留本单位人员兜底。 + scopeGroup.or(View_user::getUnionId, "=", unit.getUnionId()); + scopeGroup.or(View_user::getUnitId, "=", unitId); + cnd.and(scopeGroup); + } else { + // 当前单位未维护分工会时,至少保留本单位人员可选。 + cnd.and(View_user::getUnitId, "=", unitId); + } + } else if ("UNIT_SCHOOL_LEADER".equals(roleCode)) { + // 角色范围已经通过 sys_user_role 与 sys_role 关联限定,这里不再叠加单位范围。 + } else { + cnd.and(View_user::getUnitId, "=", unitId); + } + SqlExpressionGroup seg = new SqlExpressionGroup(); + if ("UNIT_SCHOOL_LEADER".equals(roleCode)) { + seg.orLike("u.loginname", keyWord, true); + seg.orLike("u.username", keyWord, true); + } else { + seg.orLike(View_user::getLoginname, keyWord, true); + seg.orLike(View_user::getUsername, keyWord, true); + } + cnd.and(seg); + cnd.limit(1, 10); + sql.setCondition(cnd); + sql.setCallback(Sqls.callback.entities()); + sql.setEntity(dao().getEntity(View_user.class)); + dao().execute(sql); + return sql.getList(View_user.class); + } + @CacheRemoveAll public void clearCache() { 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 98f21e8..9d06774 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 @@ -207,17 +207,29 @@ public class TeacherCongressDelegateManageController { `sys_user` t1 LEFT JOIN sys_unit t2 ON t2.id = t1.unitId WHERE - t1.id NOT IN ( SELECT userId FROM teacher_congress_delegate WHERE sessionId = @sessionId AND delegationId = @delegationId ) + -- 原逻辑只排除当前代表团已有人员:t1.id NOT IN ( SELECT userId FROM teacher_congress_delegate WHERE sessionId = @sessionId AND delegationId = @delegationId ) + t1.id NOT IN ( SELECT userId FROM teacher_congress_delegate WHERE sessionId = @sessionId ) AND t1.unitId in (@unitIds) AND (t1.loginname like @keyWord or username like @keyWord) """); sql.setParam("sessionId", param.getSessionId()); - sql.setParam("delegationId", param.getDelegationId()); sql.setParam("unitIds", unitIds); sql.setParam("keyWord", "%" + param.getKeyWord() + "%"); Pagination pagination = sysUserService.listPageMap(1, 50, sql); + if (ObjectUtil.isEmpty(pagination.getList())) { + // 可选人员为空时,额外检查当前关键字是否命中了已存在代表,给出重复新增提示。 + List repeatDelegates = dao.query(Teacher_congress_delegate.class, + Cnd.where(Teacher_congress_delegate::getSessionId, "=", param.getSessionId()) + .and(Cnd.exps(Teacher_congress_delegate::getLoginName, "like", "%" + param.getKeyWord() + "%") + .or(Teacher_congress_delegate::getUserName, "like", "%" + param.getKeyWord() + "%")) + .limit(1, 1)); + if (ObjectUtil.isNotEmpty(repeatDelegates)) { + Teacher_congress_delegate repeatDelegate = repeatDelegates.get(0); + return Result.error("工号" + repeatDelegate.getLoginName() + " " + repeatDelegate.getUserName() + "已是当前届次代表,不能重复新增"); + } + } return Result.success(pagination.getList()); } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushZgAuditController.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushZgAuditController.java index e0de9c6..c712cbb 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushZgAuditController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushZgAuditController.java @@ -21,6 +21,8 @@ import com.budwk.app.flow.service.FlowCommonService; import com.budwk.app.sys.models.Sys_role; import com.budwk.app.sys.models.Sys_user; 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.sys.views.View_user; import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.TeacherCongressDelegatePush; import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.Teacher_congress_delegate; @@ -66,6 +68,10 @@ public class TeacherCongressDelegatePushZgAuditController { @Inject private FlowCommonService flowCommonService; + @Inject + private SysUserService sysUserService; + @Inject + private SysRoleService sysRoleService; @At("") @Ok("beetl:/platform/zhgh/democratic/teachercongress/delegate/push/zcAudit.html") @@ -255,6 +261,8 @@ public class TeacherCongressDelegatePushZgAuditController { userRole.setTcSessionId(delegatePush.getSessionId()); baseService.dao().insert(delegate); // baseService.dao().insert(userRole); + // 资格审查通过进入代表库后,同步设置教代会代表角色,保证用户立即拥有正式/列席代表权限。 + insertDelegateUserRole(userRole); // 去改改用户表的手机号 baseService.dao().update( @@ -337,6 +345,8 @@ public class TeacherCongressDelegatePushZgAuditController { userRole.setTcSessionId(delegatePush.getSessionId()); baseService.dao().insert(delegate); + // 资格审查批量通过进入代表库后,同步设置教代会代表角色,保证用户立即拥有正式/列席代表权限。 + insertDelegateUserRole(userRole); // 去改改用户表的手机号 baseService.dao().update( @@ -358,4 +368,19 @@ public class TeacherCongressDelegatePushZgAuditController { return Result.success(); } + /** + * 同步代表角色关系。 + * 资格审查通过后代表库会新增记录,这里补充 sys_user_role,避免用户已是代表但没有代表角色。 + * + * @param userRole 待写入的代表角色关系,必须包含 userId、roleId、tcSessionId + */ + private void insertDelegateUserRole(Sys_user_role userRole) { + baseService.dao().clear(Sys_user_role.class, Cnd.where(Sys_user_role::getUserId, "=", userRole.getUserId()) + .and(Sys_user_role::getRoleId, "=", userRole.getRoleId()) + .and(Sys_user_role::getTcSessionId, "=", userRole.getTcSessionId())); + baseService.dao().insert(userRole); + sysUserService.clearCache(); + sysRoleService.clearCache(); + } + } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegateTransitionController.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegateTransitionController.java index 06ac2b3..4043778 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegateTransitionController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegateTransitionController.java @@ -190,8 +190,8 @@ public class TeacherCongressDelegateTransitionController { // 当前代表团 Teacher_congress_delegation delegation = dao.fetch(Teacher_congress_delegation.class, delegationId); - // 当前届次代表团代表 - List delegates = dao.query(Teacher_congress_delegate.class, Cnd.where(Teacher_congress_delegate::getSessionId, "=", sessionId).and(Teacher_congress_delegate::getDelegationId, "=", delegation.getId())); + // 当前届次全部代表。转出人员本届已不在当前代表团,必须用全部代表与上一届代表做对比。 + List delegates = dao.query(Teacher_congress_delegate.class, Cnd.where(Teacher_congress_delegate::getSessionId, "=", sessionId)); dao.fetchLinks(delegates, "delegation"); // 上一届次代表 @@ -240,8 +240,8 @@ public class TeacherCongressDelegateTransitionController { // 减少代表数据 (上一届次是代表 本届次不是代表) List reduceUser = delegateFull.stream().filter(delegate -> delegate.getString("lastDelegationCode").equals(delegation.getCode()) && StrUtil.isBlank(delegate.getString("delegationCode"))).toList(); - // 当前代表人数 - int currentCount = delegates.size(); + // 当前代表人数只统计本届仍在当前代表团的人员。 + long currentCount = delegateFull.stream().filter(delegate -> delegate.getString("delegationCode").equals(delegation.getCode())).count(); HashMap map = new HashMap<>(); map.put("addUser", addUser); diff --git a/src/main/resources/views/platform/sys/unit/unitLeader.js b/src/main/resources/views/platform/sys/unit/unitLeader.js index d558ec4..c1dc919 100644 --- a/src/main/resources/views/platform/sys/unit/unitLeader.js +++ b/src/main/resources/views/platform/sys/unit/unitLeader.js @@ -36,15 +36,17 @@ const UNIT_LEADER_MANAGE_TEMPLATE = { - + + +