From 9503b5aa7355b5ec01583dcca24006a682af27e4 Mon Sep 17 00:00:00 2001 From: zhangrui Date: Tue, 25 Aug 2026 13:50:47 +0800 Subject: [PATCH 1/3] change --- .../app/flow/service/FlowCommonService.java | 7 +- .../app/sys/controller/SysConfController.java | 14 +- .../app/sys/controller/SysRoleController.java | 3 +- .../sys/controller/SysUnionController.java | 33 +- .../app/sys/services/SysConfigService.java | 14 + .../app/sys/services/SysUnionService.java | 13 + .../services/impl/SysConfigServiceImpl.java | 32 ++ .../services/impl/SysUnionServiceImpl.java | 52 +++ ...layManageUnionIncomeExpenseController.java | 13 + .../OutlayManageUnionUseDetailController.java | 13 + .../views/platform/sys/conf/index.html | 157 ++++++-- .../views/platform/sys/role/index.html | 342 ++++++++++++++---- .../platform/sys/union/branchUnionManage.js | 2 +- .../club/infoManage/auditManager/index.html | 15 +- .../zhgh/club/infoManage/change/index.html | 38 +- .../club/infoManage/exitManage/index.html | 15 +- .../club/infoManage/manage/clubInfoManage.js | 44 ++- .../zhgh/club/infoManage/manage/index.html | 133 ++++++- .../infoManage/manage/schoolClubManage.js | 44 ++- .../zhgh/club/infoManage/pay/index.html | 12 +- .../club/infoManage/refreshReport/index.html | 15 +- .../club/infoManage/ruleUpdate/index.html | 15 +- .../infoManage/schoolAuditReport/index.html | 15 +- .../infoManage/schoolAuditRule/index.html | 15 +- .../outlayManage/union/allocate/index.html | 22 +- .../union/incomeExpense/index.html | 83 ++++- .../outlayManage/union/manage/index.html | 13 +- .../outlayManage/union/useDetail/index.html | 77 +++- .../useDetail/quarterlyOutlayAllocate.js | 4 +- 29 files changed, 1035 insertions(+), 220 deletions(-) diff --git a/src/main/java/com/budwk/app/flow/service/FlowCommonService.java b/src/main/java/com/budwk/app/flow/service/FlowCommonService.java index 5cbb62ee..1230331c 100644 --- a/src/main/java/com/budwk/app/flow/service/FlowCommonService.java +++ b/src/main/java/com/budwk/app/flow/service/FlowCommonService.java @@ -11,6 +11,8 @@ import com.budwk.app.flow.engine.event.ProcessPublisher; import com.budwk.app.flow.entity.ProcessInstance; import com.budwk.app.flow.entity.ProcessTask; import com.budwk.app.flow.enums.*; +import com.budwk.app.sys.models.Sys_unit; +import com.budwk.app.sys.views.View_user; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Chain; @@ -22,6 +24,7 @@ import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.json.Json; import java.util.List; +import java.util.Optional; @IocBean public class FlowCommonService { @@ -61,11 +64,13 @@ public class FlowCommonService { args.put(FlowConst.SUBMIT_TYPE, submitType); + Sys_unit sysUnit = dao.fetch(Sys_unit.class, Cnd.where("id", "=", SecurityUtil.getUnitId())); + // 设置办理人信息到表单参数 args.put(FlowConst.TASK_FORM_DATA_PREFIX + "userName", SecurityUtil.getUserUsername()); args.put(FlowConst.TASK_FORM_DATA_PREFIX + "loginName", SecurityUtil.getUserLoginname()); args.put(FlowConst.TASK_FORM_DATA_PREFIX + "unitId", SecurityUtil.getUnitId()); - args.put(FlowConst.TASK_FORM_DATA_PREFIX + "unitName", SecurityUtil.getUnitId()); + args.put(FlowConst.TASK_FORM_DATA_PREFIX + "unitName", Optional.of(sysUnit).map(Sys_unit::getName).orElse("")); args.put(FlowConst.TASK_FORM_DATA_PREFIX + "unionId", SecurityUtil.getUnionId()); if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.ROLLBACK.getCode())) { diff --git a/src/main/java/com/budwk/app/sys/controller/SysConfController.java b/src/main/java/com/budwk/app/sys/controller/SysConfController.java index d6a0e76e..35788e11 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysConfController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysConfController.java @@ -4,7 +4,6 @@ import cn.dev33.satoken.annotation.SaCheckPermission; import com.budwk.app.base.annotation.SLog; import com.budwk.app.base.constant.RedisConstant; import com.budwk.app.base.result.Result; -import com.budwk.app.base.utils.PageUtil; import com.budwk.app.sys.models.Sys_config; import com.budwk.app.sys.services.SysConfigService; import com.budwk.app.web.commons.auth.utils.SecurityUtil; @@ -139,17 +138,18 @@ public class SysConfController { @At @Ok("json:full") @SaCheckPermission("sys.manager.conf") - public Object data(@Param("pageNumber") int pageNumber, @Param("pageSize") int pageSize, @Param("pageOrderName") String pageOrderName, @Param("pageOrderBy") String pageOrderBy) { + public Object data(@Param("pageNumber") int pageNumber, + @Param("pageSize") int pageSize, + @Param("pageOrderName") String pageOrderName, + @Param("pageOrderBy") String pageOrderBy, + @Param("configKey") String configKey) { try { ensureAppImageConfig("AppHomeImg", "PC首页轮播图"); ensureAppImageConfig("H5AppHomeImg", "移动端首页轮播图"); ensureAppImageConfig("AppFeaturedActivityImg", "精彩活动页顶部图片"); ensureAppImageConfig("AppFestivalBenefitImg", "节日福利页顶部图片"); - Cnd cnd = Cnd.NEW(); - if (Strings.isNotBlank(pageOrderName) && Strings.isNotBlank(pageOrderBy)) { - cnd.orderBy(pageOrderName, PageUtil.getOrder(pageOrderBy)); - } - return Result.success().addData(sysConfigService.listPage(pageNumber, pageSize, cnd)); + return Result.success().addData(sysConfigService.pageData( + pageNumber, pageSize, pageOrderName, pageOrderBy, configKey)); } catch (Exception e) { return Result.error(); } 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 8b3d9cf4..83de63fe 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysRoleController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysRoleController.java @@ -419,14 +419,13 @@ public class SysRoleController { public Object user(@Param("roleId") String roleId, @Param("searchName") String searchName, @Param("searchKeyword") String searchKeyword, @Param("pageNumber") int pageNumber, @Param("pageSize") int pageSize, @Param("pageOrderName") String pageOrderName, @Param("pageOrderBy") String pageOrderBy) { try { - Sql sql = Sqls.create("SELECT a.*,c.name as unitname FROM sys_user a,sys_user_role b,sys_unit c WHERE a.unitid=c.id and a.id=b.userId and b.roleId=@roleId $s $o"); + Sql sql = Sqls.create("SELECT a.*,c.name as unitname FROM sys_user a,sys_user_role b,sys_unit c WHERE a.unitid=c.id and a.id=b.userId and enable='1' and b.roleId=@roleId $s $o"); sql.params().set("roleId", roleId); if (Strings.isNotBlank(searchName) && Strings.isNotBlank(searchKeyword)) { sql.vars().set("s", " and a." + searchName + " like '%" + searchKeyword + "%'"); } if (Strings.isNotBlank(pageOrderName) && Strings.isNotBlank(pageOrderBy)) { sql.vars().set("o", " order by a." + pageOrderName + " " + PageUtil.getOrder(pageOrderBy)); - } return Result.success().addData(sysUserService.listPage(pageNumber, pageSize, sql)); } catch (Exception e) { diff --git a/src/main/java/com/budwk/app/sys/controller/SysUnionController.java b/src/main/java/com/budwk/app/sys/controller/SysUnionController.java index 7e2f49e4..e6607b1a 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysUnionController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysUnionController.java @@ -456,10 +456,16 @@ public class SysUnionController { unionCadre.setIsJoin(true); dao.insert(unionCadre); - // 去走工作流 + // 校级管理员新增普通干部时直接授权,不生成无实际审核意义的流程数据。 boolean isAdmin = AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name()); + if (isAdmin) { + sysUnionService.assignBranchUnionRole(userId, role.getId(), unionId, List.of()); + return Result.success(); + } + + // 非校级管理员仍按原业务发起基层干部授权审核流程。 Dict args = Dict.create(); - args.set("submit", isAdmin ? "admin" : "branch"); + args.set("submit", "branch"); args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode()); args.set(FlowConst.FORM_DATA, unionCadre); @@ -470,20 +476,12 @@ public class SysUnionController { flowEngine.executeProcessTask(task.getId(), SecurityUtil.getUserId(), args); } - if (isAdmin) { - // 如果是管理员,直接加角色 - sysRoleService.clear("sys_user_role", Cnd.where("roleId", "=", role.getId()).and("userId", "=", userId).and("unionId", "=", unionId)); - sysRoleService.insert("sys_user_role", Chain.make("roleId", role.getId()).add("userId", userId).add("unionId", unionId)); - sysRoleService.clearCache(); - sysUserService.clearCache(); - } - return Result.success(); } /** - * 发起二级党委书记授权审批。一个审批申请可关联当前分工会下的多个单位。 - * 审核通过后由流程拦截器按单位写入角色,避免影响普通分工会角色的授权方式。 + * 新增二级党委书记授权。校级管理员直接按单位授权,其他用户发起审批, + * 审核通过后由流程拦截器按单位写入角色。 * * @param userId 人员ID * @param unionId 分工会ID @@ -536,11 +534,18 @@ public class SysUnionController { unionCadre.setIsJoin(true); dao.insert(unionCadre); + boolean isAdmin = AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name()); + if (isAdmin) { + // 校级管理员直接按所选单位授权,不创建 JCGHWY 流程实例和审核任务。 + sysUnionService.assignBranchUnionRole(userId, role.getId(), unionId, distinctUnitIds); + return Result.success(); + } + + // 非校级管理员保留原审批流程,并将所选单位随表单传给审核通过拦截器。 JSONObject formData = JSONUtil.parseObj(unionCadre); formData.set("unitIds", distinctUnitIds); Dict args = Dict.create(); - boolean isAdmin = AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name()); - args.set("submit", isAdmin ? "admin" : "branch"); + args.set("submit", "branch"); args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode()); args.set(FlowConst.FORM_DATA, formData.toString()); ProcessInstance instance = flowEngine.startProcessInstanceByKey("JCGHWY", unionCadre.getId(), SecurityUtil.getUserId(), args); diff --git a/src/main/java/com/budwk/app/sys/services/SysConfigService.java b/src/main/java/com/budwk/app/sys/services/SysConfigService.java index 017974a9..04490ba7 100644 --- a/src/main/java/com/budwk/app/sys/services/SysConfigService.java +++ b/src/main/java/com/budwk/app/sys/services/SysConfigService.java @@ -1,5 +1,6 @@ package com.budwk.app.sys.services; +import com.budwk.app.base.page.Pagination; import com.budwk.app.sys.models.Sys_config; import com.budwk.app.base.service.BaseService; @@ -16,4 +17,17 @@ public interface SysConfigService extends BaseService { List getAllList(); Sys_config getValueByKey(String key); + + /** + * 分页查询系统参数,支持按参数名模糊查询和安全排序。 + * + * @param pageNumber 页码 + * @param pageSize 每页条数 + * @param pageOrderName 排序字段 + * @param pageOrderBy 排序方向 + * @param configKey 参数名关键字 + * @return 系统参数分页数据 + */ + Pagination pageData(int pageNumber, int pageSize, String pageOrderName, + String pageOrderBy, String configKey); } diff --git a/src/main/java/com/budwk/app/sys/services/SysUnionService.java b/src/main/java/com/budwk/app/sys/services/SysUnionService.java index 302a4769..dcfceb16 100644 --- a/src/main/java/com/budwk/app/sys/services/SysUnionService.java +++ b/src/main/java/com/budwk/app/sys/services/SysUnionService.java @@ -3,5 +3,18 @@ package com.budwk.app.sys.services; import com.budwk.app.base.service.BaseService; import com.budwk.app.sys.models.Sys_union; +import java.util.List; + public interface SysUnionService extends BaseService { + + /** + * 直接分配分工会干部角色。普通干部传空单位集合时按分工会写入一条角色关系; + * 二级党委书记传单位集合时按单位分别写入角色关系。 + * + * @param userId 用户ID + * @param roleId 角色ID + * @param unionId 分工会ID + * @param unitIds 授权单位ID集合,普通干部角色传空集合 + */ + void assignBranchUnionRole(String userId, String roleId, String unionId, List unitIds); } diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysConfigServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysConfigServiceImpl.java index 74b38ff4..d586bf68 100644 --- a/src/main/java/com/budwk/app/sys/services/impl/SysConfigServiceImpl.java +++ b/src/main/java/com/budwk/app/sys/services/impl/SysConfigServiceImpl.java @@ -1,15 +1,19 @@ package com.budwk.app.sys.services.impl; import com.budwk.app.base.exception.BaseException; +import com.budwk.app.base.page.Pagination; import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.base.utils.PageUtil; import com.budwk.app.sys.models.Sys_config; import com.budwk.app.sys.services.SysConfigService; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.Lang; +import org.nutz.lang.Strings; import java.util.List; +import java.util.Set; /** * Created by wizzer on 2016/12/23. @@ -32,4 +36,32 @@ public class SysConfigServiceImpl extends BaseServiceImpl implements } return sys_config; } + + /** + * 分页查询系统参数。参数名使用模糊匹配,排序字段限定在列表可展示字段内, + * 防止未经校验的前端字段直接进入排序 SQL。 + * + * @param pageNumber 页码 + * @param pageSize 每页条数 + * @param pageOrderName 排序字段 + * @param pageOrderBy 排序方向 + * @param configKey 参数名关键字 + * @return 系统参数分页数据 + */ + @Override + @SuppressWarnings("unchecked") + public Pagination pageData(int pageNumber, int pageSize, String pageOrderName, + String pageOrderBy, String configKey) { + Cnd cnd = Cnd.NEW(); + if (Strings.isNotBlank(configKey)) { + cnd.where().andLike("configKey", configKey.trim()); + } + Set sortableColumns = Set.of("configKey", "configValue", "note"); + if (sortableColumns.contains(pageOrderName) && Strings.isNotBlank(pageOrderBy)) { + cnd.orderBy(pageOrderName, PageUtil.getOrder(pageOrderBy)); + } else { + cnd.asc("configKey"); + } + return listPage(pageNumber, pageSize, cnd); + } } diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysUnionServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysUnionServiceImpl.java index 71a760ce..7efcc632 100644 --- a/src/main/java/com/budwk/app/sys/services/impl/SysUnionServiceImpl.java +++ b/src/main/java/com/budwk/app/sys/services/impl/SysUnionServiceImpl.java @@ -2,13 +2,65 @@ package com.budwk.app.sys.services.impl; import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.sys.models.Sys_union; +import com.budwk.app.sys.models.Sys_user_role; +import com.budwk.app.sys.services.SysRoleService; import com.budwk.app.sys.services.SysUnionService; +import com.budwk.app.sys.services.SysUserService; +import org.nutz.dao.Cnd; import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; +import java.util.List; + @IocBean(args = {"refer:dao"}) public class SysUnionServiceImpl extends BaseServiceImpl implements SysUnionService { + + @Inject + private SysRoleService sysRoleService; + + @Inject + private SysUserService sysUserService; + public SysUnionServiceImpl(Dao dao) { super(dao); } + + /** + * 直接分配分工会干部角色,并在授权完成后统一清理权限缓存。 + * 普通角色按分工会授权一次,包含单位的角色按每个单位分别授权。 + * + * @param userId 用户ID + * @param roleId 角色ID + * @param unionId 分工会ID + * @param unitIds 授权单位ID集合,普通干部角色传空集合 + */ + @Override + public void assignBranchUnionRole(String userId, String roleId, String unionId, List unitIds) { + // 先清理同一用户在当前分工会下的相同角色,保证重新授权后不存在重复关系。 + dao().clear(Sys_user_role.class, Cnd.where(Sys_user_role::getRoleId, "=", roleId) + .and(Sys_user_role::getUserId, "=", userId) + .and(Sys_user_role::getUnionId, "=", unionId)); + + if (unitIds == null || unitIds.isEmpty()) { + Sys_user_role userRole = new Sys_user_role(); + userRole.setRoleId(roleId); + userRole.setUserId(userId); + userRole.setUnionId(unionId); + dao().insert(userRole); + } else { + // 二级党委书记按选中的单位分别生成角色关系,供后续单位级权限判断使用。 + for (String unitId : unitIds) { + Sys_user_role userRole = new Sys_user_role(); + userRole.setRoleId(roleId); + userRole.setUserId(userId); + userRole.setUnionId(unionId); + userRole.setUnitId(unitId); + dao().insert(userRole); + } + } + + sysRoleService.clearCache(); + sysUserService.clearCache(); + } } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/union/controller/OutlayManageUnionIncomeExpenseController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/union/controller/OutlayManageUnionIncomeExpenseController.java index 53e6b90f..e67b7a43 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/union/controller/OutlayManageUnionIncomeExpenseController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/union/controller/OutlayManageUnionIncomeExpenseController.java @@ -14,6 +14,7 @@ import com.budwk.app.base.service.BaseService; import com.budwk.app.base.utils.CommonDownloadUtil; import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.zhgh.dayofficework.outlay.outlayManage.service.OutlayManageUnionStatisticsService; import com.budwk.app.zhgh.dayofficework.outlay.outlayManage.union.vo.OutlayUnionIncomeExpenseVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -44,6 +45,8 @@ public class OutlayManageUnionIncomeExpenseController { @Inject private BaseService baseService; + @Inject + private OutlayManageUnionStatisticsService outlayManageUnionStatisticsService; @At("") @Ok("beetl:/platform/zhgh/dayofficework/outlay/outlayManage/union/incomeExpense/index.html") @@ -60,6 +63,16 @@ public class OutlayManageUnionIncomeExpenseController { return Result.success(pagination); } + /** + * 查询当前筛选范围内全部分工会经费收支合计,不受分页参数影响。 + */ + @At + @ApiOperation("查询经费收支合计") + @SaCheckPermission("outlay.outlayManage.union.incomeExpense") + public Result summary(Integer year, String unionId) { + return Result.success(outlayManageUnionStatisticsService.queryIncomeExpenseSummary(year, unionId)); + } + @At @Ok("void") @ApiOperation("导出") diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/union/controller/OutlayManageUnionUseDetailController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/union/controller/OutlayManageUnionUseDetailController.java index c4948be5..6688cf76 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/union/controller/OutlayManageUnionUseDetailController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/union/controller/OutlayManageUnionUseDetailController.java @@ -12,6 +12,7 @@ import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.dayofficework.outlay.outlayManage.model.OutlayUseDetail; import com.budwk.app.zhgh.dayofficework.outlay.outlayManage.service.OutlayUseDetailService; +import com.budwk.app.zhgh.dayofficework.outlay.outlayManage.service.OutlayManageUnionStatisticsService; import com.budwk.app.zhgh.dayofficework.outlay.outlayManage.union.model.OutLayAllocateUnion; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -46,6 +47,8 @@ public class OutlayManageUnionUseDetailController { private BaseService baseService; @Inject private OutlayUseDetailService outlayUseDetailService; + @Inject + private OutlayManageUnionStatisticsService outlayManageUnionStatisticsService; @At("") @Ok("beetl:/platform/zhgh/dayofficework/outlay/outlayManage/union/useDetail/index.html") @@ -81,6 +84,16 @@ public class OutlayManageUnionUseDetailController { return Result.success(pagination); } + /** + * 查询当前筛选范围内全部分工会预算使用情况合计,不受分页参数影响。 + */ + @At + @ApiOperation("查询预算使用情况合计") + @SaCheckPermission("outlay.outlayManage.union.useDetail") + public Result summary(Integer year, String unionId) { + return Result.success(outlayManageUnionStatisticsService.queryUseDetailSummary(year, unionId)); + } + @At @ApiOperation("某个分工会预算使用详情") diff --git a/src/main/resources/views/platform/sys/conf/index.html b/src/main/resources/views/platform/sys/conf/index.html index bca250ff..0f6a7548 100644 --- a/src/main/resources/views/platform/sys/conf/index.html +++ b/src/main/resources/views/platform/sys/conf/index.html @@ -1,18 +1,54 @@ +
- - - - - 添加配置项 - - +
+ + + + + + - - + + + 新增 + + +
@@ -183,13 +220,18 @@ layout("/layouts/platform.html"){ return { addDialogVisible: false, editDialogVisible: false, + tableLoading: false, + tableHeight: 300, + tableResizeObserver: null, + pageRequestSequence: 0, tableData: [], pageForm: { pageSize: 10, pageNumber: 1, pageOrderName: "", pageOrderBy: "", - totalCount: 0 + totalCount: 0, + configKey: "" }, formData: { configKey: "", @@ -203,6 +245,10 @@ layout("/layouts/platform.html"){ } }, methods: { + doSearch: function () { + this.pageForm.pageNumber = 1 + this.pageData() + }, openAdd: function () { this.addDialogVisible = true this.formData = {} //打开新增窗口,表单先清空 @@ -317,24 +363,60 @@ layout("/layouts/platform.html"){ this.pageData() }, pageData: function () { - //加载分页数据 + // 查询期间清空旧页并显示加载状态,快速连续查询时仅接收最后一次响应。 var self = this - $.post( - base + "/platform/sys/conf/data", - self.pageForm, - function (data) { - if (data.code == 0) { - self.tableData = data.data.list - self.pageForm.totalCount = data.data.totalCount - } else { - self.$message({ - message: data.msg, - type: "error" - }) + var requestSequence = ++self.pageRequestSequence + self.tableData = [] + self.tableLoading = true + $.post(base + "/platform/sys/conf/data", self.pageForm).then(function (data) { + if (requestSequence != self.pageRequestSequence) { + return + } + if (data.code == 0) { + self.tableData = data.data.list || [] + self.pageForm.totalCount = data.data.totalCount || 0 + self.updateTableHeight() + } else { + self.$message({ + message: data.msg, + type: "error" + }) + } + }).always(function () { + if (requestSequence == self.pageRequestSequence) { + self.tableLoading = false + } + }) + }, + updateTableHeight: function () { + var self = this + this.$nextTick(function () { + var cardBody = self.$el.querySelector(".sys-conf-list-card > .el-card__body") + if (!cardBody || cardBody.clientHeight <= 0) { + return + } + var getOuterHeight = function (element) { + if (!element) { + return 0 } - }, - "json" - ) + var style = window.getComputedStyle(element) + return element.offsetHeight + + (parseFloat(style.marginTop) || 0) + + (parseFloat(style.marginBottom) || 0) + } + var bodyStyle = window.getComputedStyle(cardBody) + var bodyPadding = (parseFloat(bodyStyle.paddingTop) || 0) + + (parseFloat(bodyStyle.paddingBottom) || 0) + var tableTool = cardBody.querySelector(".ele-table-tool") + var pagination = cardBody.querySelector(".el-pagination-container") + var reservedHeight = bodyPadding + getOuterHeight(tableTool) + getOuterHeight(pagination) + self.tableHeight = Math.max(1, Math.floor(cardBody.clientHeight - reservedHeight)) + self.$nextTick(function () { + if (self.$refs.tableRef) { + self.$refs.tableRef.doLayout() + } + }) + }) }, dropdownCommand: function (command) { //监听下拉框事件 @@ -392,6 +474,29 @@ layout("/layouts/platform.html"){ }, created: function () { this.pageData() + }, + mounted: function () { + var self = this + this.updateTableHeight() + if (window.ResizeObserver) { + this.tableResizeObserver = new ResizeObserver(function () { + self.updateTableHeight() + }) + this.tableResizeObserver.observe(this.$el) + } else { + this.resizeHandler = function () { + self.updateTableHeight() + } + window.addEventListener("resize", this.resizeHandler) + } + }, + beforeDestroy: function () { + if (this.tableResizeObserver) { + this.tableResizeObserver.disconnect() + } + if (this.resizeHandler) { + window.removeEventListener("resize", this.resizeHandler) + } } }) diff --git a/src/main/resources/views/platform/sys/role/index.html b/src/main/resources/views/platform/sys/role/index.html index d2b0533a..4e452b42 100644 --- a/src/main/resources/views/platform/sys/role/index.html +++ b/src/main/resources/views/platform/sys/role/index.html @@ -9,10 +9,124 @@ layout("/layouts/platform.html"){ padding: 1px 2px; border-radius: 2px; } + + /* 关联用户弹窗固定占用可视区域,数据过多时仅表格内部滚动。 */ + .role-user-dialog { + display: flex; + flex-direction: column; + height: 90vh; + margin-bottom: 0; + overflow: hidden; + } + .role-user-dialog .el-dialog__header { + flex: 0 0 auto; + padding: 22px 30px 18px; + border-bottom: 1px solid #ebeef5; + } + .role-user-dialog .el-dialog__title { + color: #1f2d3d; + font-size: 18px; + font-weight: 600; + } + .role-user-dialog .el-dialog__body { + flex: 1 1 auto; + min-height: 0; + padding: 8px 30px 12px; + overflow: hidden; + } + .role-user-dialog .el-dialog__footer { + flex: 0 0 auto; + padding: 14px 30px 18px; + border-top: 1px solid #ebeef5; + } + .role-user-layout { + display: flex; + flex-direction: column; + height: 100%; + min-height: 0; + overflow: hidden; + } + .role-user-tip { + flex: 0 0 auto; + padding: 13px 16px; + color: #1677ff; + background: #f0f7ff; + border-radius: 4px; + } + .role-user-tip i { + margin-right: 8px; + } + .role-user-toolbar { + display: flex; + flex: 0 0 auto; + align-items: center; + gap: 12px; + margin: 16px 0; + } + .role-user-add-area, + .role-user-search-area { + display: flex; + align-items: center; + gap: 8px; + } + .role-user-remove-button { + margin-left: auto; + } + .role-user-table-wrap { + flex: 1 1 auto; + min-height: 0; + overflow: hidden; + } + .role-user-pagination { + flex: 0 0 auto; + margin-top: 16px; + } + .role-user-status-dot { + display: inline-block; + width: 8px; + height: 8px; + margin-right: 7px; + border-radius: 50%; + } + .role-user-status-dot.is-success { + background: #21c77a; + } + .role-user-status-dot.is-danger { + background: #f56c6c; + } + + /* 角色管理列表固定占满平台内容区,避免页面主体出现纵向滚动条。 */ + #app .role-manage-page { + display: flex; + flex-direction: column; + height: calc(100vh - 82px); + min-height: 0; + overflow: hidden; + } + #app .role-manage-query-card { + flex: 0 0 auto; + } + #app .role-manage-list-card { + flex: 1 1 auto; + min-height: 0; + overflow: hidden; + } + #app .role-manage-list-card > .el-card__body { + box-sizing: border-box; + display: flex; + flex-direction: column; + height: 100%; + min-height: 0; + overflow: hidden; + } + #app .role-manage-list-card .el-pagination-container { + flex: 0 0 auto; + }
- +
+ @@ -61,9 +175,11 @@ layout("/layouts/platform.html"){ - + +
@@ -274,71 +391,89 @@ layout("/layouts/platform.html"){ -
- - - - 将用户加入角色 -
- 从角色中移除 + custom-class="role-user-dialog" top="5vh" width="82%" @opened="updateUserTableHeight"> +
+
+
+ + + + 将用户加入角色 +
+
+ + + + + + + 查询 +
+ 从角色中移除
+
+ + + + + + + + + + + + +
+
- - - - - - - - - - - - - - - 关 闭 - @@ -388,6 +523,9 @@ layout("/layouts/platform.html"){ isLeaf: "leaf" }, tableData: [], + roleTableHeight: 300, + roleTableResizeObserver: null, + roleTableResizeHandler: null, moduleOptions: [], options: [], parentUnit: [], @@ -447,6 +585,8 @@ layout("/layouts/platform.html"){ doCmsForm: {}, userForm: { roleId: "", + searchName: "loginname", + searchKeyword: "", pageNumber: 1, pageSize: 10, totalCount: 0, @@ -454,6 +594,7 @@ layout("/layouts/platform.html"){ pageOrderBy: "" }, userTableData: [], + userTableHeight: 360, loading: false, dbUsers: [], //分配用户 selUsers: [], //分配选中的用户 @@ -575,6 +716,31 @@ layout("/layouts/platform.html"){ this.pageForm.pageNumber = 1 this.pageData() }, + // 根据角色列表卡片的剩余空间设置表格高度,分页区域始终保持可见。 + updateRoleTableHeight() { + this.$nextTick(() => { + const cardBody = this.$el.querySelector('.role-manage-list-card > .el-card__body') + if (!cardBody || cardBody.clientHeight <= 0) { + return + } + const pagination = cardBody.querySelector('.el-pagination-container') + const bodyStyle = window.getComputedStyle(cardBody) + const bodyPadding = (parseFloat(bodyStyle.paddingTop) || 0) + + (parseFloat(bodyStyle.paddingBottom) || 0) + const paginationStyle = pagination ? window.getComputedStyle(pagination) : null + const paginationHeight = pagination + ? pagination.offsetHeight + + (parseFloat(paginationStyle.marginTop) || 0) + + (parseFloat(paginationStyle.marginBottom) || 0) + : 0 + this.roleTableHeight = Math.max(1, Math.floor(cardBody.clientHeight - bodyPadding - paginationHeight)) + this.$nextTick(() => { + if (this.$refs.roleTableRef) { + this.$refs.roleTableRef.doLayout() + } + }) + }) + }, // 加载可选 PC 模块,创建、编辑和列表筛选共用同一数据源。 loadModuleOptions() { this.$axios.post("/platform/sys/role/listModule").then((res) => { @@ -624,6 +790,26 @@ layout("/layouts/platform.html"){ this.userForm.pageSize = val this.doUserLoad() }, + // 查询当前角色已关联用户,查询时从第一页重新加载。 + doUserSearch() { + this.userForm.pageNumber = 1 + this.doUserLoad() + }, + // 根据弹窗内表格容器的剩余空间计算高度,确保仅表格内部产生滚动条。 + updateUserTableHeight() { + this.$nextTick(() => { + const tableWrap = document.querySelector('.role-user-dialog .role-user-table-wrap') + if (!tableWrap || tableWrap.clientHeight <= 0) { + return + } + this.userTableHeight = Math.max(180, Math.floor(tableWrap.clientHeight)) + this.$nextTick(() => { + if (this.$refs.userTableRef) { + this.$refs.userTableRef.doLayout() + } + }) + }) + }, remoteMethod(query) { if (query !== "") { this.loading = true @@ -763,6 +949,7 @@ layout("/layouts/platform.html"){ this.userDialogVisible = true this.roleId = command.id this.userForm.roleId = command.id + this.userForm.pageNumber = 1 this.doUserLoad() } if ("enable" === command.type || "disable" === command.type) { @@ -903,6 +1090,31 @@ layout("/layouts/platform.html"){ this.loadModuleOptions() this.pageData() // await this.getMenuOptions() + }, + mounted() { + this.updateRoleTableHeight() + window.addEventListener("resize", this.updateUserTableHeight) + const page = this.$el.querySelector('.role-manage-page') + if (window.ResizeObserver && page) { + this.roleTableResizeObserver = new ResizeObserver(() => { + this.updateRoleTableHeight() + }) + this.roleTableResizeObserver.observe(page) + } else { + this.roleTableResizeHandler = () => { + this.updateRoleTableHeight() + } + window.addEventListener("resize", this.roleTableResizeHandler) + } + }, + beforeDestroy() { + window.removeEventListener("resize", this.updateUserTableHeight) + if (this.roleTableResizeObserver) { + this.roleTableResizeObserver.disconnect() + } + if (this.roleTableResizeHandler) { + window.removeEventListener("resize", this.roleTableResizeHandler) + } } }) diff --git a/src/main/resources/views/platform/sys/union/branchUnionManage.js b/src/main/resources/views/platform/sys/union/branchUnionManage.js index 8df135d5..a39abcd9 100644 --- a/src/main/resources/views/platform/sys/union/branchUnionManage.js +++ b/src/main/resources/views/platform/sys/union/branchUnionManage.js @@ -6,7 +6,7 @@ const branchUnionManage = { - 基层干部审核 + 基层干部审核 新建分工会 diff --git a/src/main/resources/views/platform/zhgh/club/infoManage/auditManager/index.html b/src/main/resources/views/platform/zhgh/club/infoManage/auditManager/index.html index ff21fb4f..459b8a48 100644 --- a/src/main/resources/views/platform/zhgh/club/infoManage/auditManager/index.html +++ b/src/main/resources/views/platform/zhgh/club/infoManage/auditManager/index.html @@ -1,12 +1,15 @@ - +
- - + +
From 368c0b2ec874ebed4c214d17bf3390eae82b555d Mon Sep 17 00:00:00 2001 From: zhangrui Date: Wed, 26 Aug 2026 13:55:08 +0800 Subject: [PATCH 2/3] change --- ...acherCongressDelegateManageController.java | 64 +----- .../TeacherCongressDelegateListener.java | 94 +------- .../TeacherCongressDelegateService.java | 25 +++ .../TeacherCongressDelegateServiceImpl.java | 148 +++++++++++++ .../TeacherCongressDelegationController.java | 86 +++---- .../TeacherCongressDelegationService.java | 50 ++++- .../TeacherCongressDelegationServiceImpl.java | 209 ++++++++++++++++++ .../TeacherCongressSessionServiceImpl.java | 22 +- .../info/MemberBatchMakeController.java | 29 ++- .../delegate/manage/index.html | 23 +- .../teachercongress/delegation/index.html | 21 +- .../teachercongress/delegation/partUnit.js | 64 +++--- .../delegation/partUnitTable.js | 37 ++-- 13 files changed, 605 insertions(+), 267 deletions(-) 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 44d7d89d..9411a930 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 @@ -197,34 +197,7 @@ public class TeacherCongressDelegateManageController { @At @SaCheckPermission("tc.delegate.manage") public Result publicUser(@Valid TeacherCongressDelegateManagePublicUserParam param) { - List units = dao.query(Teacher_congress_delegation_unit.class, Cnd.where("sessionId", "=", param.getSessionId()).and("delegationId", "=", param.getDelegationId())); - List unitIds = units.stream().map(Teacher_congress_delegation_unit::getUnitId).toList(); - if (ObjectUtil.isEmpty(unitIds)) { - return Result.error("代表团没有组成单位"); - } - - Sql sql = Sqls.create(""" - SELECT - t1.id, - t1.username AS userName, - t1.loginName AS loginName, - t2.NAME AS unitName - FROM - `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 ) - 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); - return Result.success(pagination.getList()); + return Result.success(teacherDelegateService.listPublicUsers(param)); } /** @@ -497,40 +470,7 @@ public class TeacherCongressDelegateManageController { @Aop(TransAop.READ_COMMITTED) @SaCheckPermission("tc.delegate.manage") public Result doAllocateDelegation(String sessionId) { - List delegateList = dao.query(Teacher_congress_delegate.class, - Cnd.where(Teacher_congress_delegate::getSessionId, "=", sessionId) - .and(Teacher_congress_delegate::getDelegationId, "is", null)); - - for (Teacher_congress_delegate delegate : delegateList) { - Teacher_congress_delegation_unit delegation_unit = dao.fetch(Teacher_congress_delegation_unit.class, - Cnd.where(Teacher_congress_delegation_unit::getUnitId, "=", delegate.getUnitId()) - .and(Teacher_congress_delegation_unit::getSessionId, "=", sessionId)); - if (ObjectUtil.isNotEmpty(delegation_unit)) { - delegate.setDelegationId(delegation_unit.getDelegationId()); - dao.update(delegate); - Sys_user_role userRole = new Sys_user_role(); - userRole.setTcDelegationId(delegation_unit.getDelegationId()); - userRole.setUserId(delegate.getUserId()); - userRole.setTcSessionId(sessionId); - Sys_role sys_role = dao.fetch(Sys_role.class, Cnd.where(Sys_role::getCode, "=", RoleConstant.TEACHER_CONGRESS_DELEGATE_FORMAL.name())); - - if (sys_role.getId().equals(delegate.getRoleId())) { - delegate.setRoleId(sys_role.getId()); - userRole.setRoleId(sys_role.getId()); - } - - Sys_role sys_role2 = dao.fetch(Sys_role.class, Cnd.where(Sys_role::getCode, "=", RoleConstant.TEACHER_CONGRESS_DELEGATE_ATTENDANCE.name())); - if (sys_role2.getId().equals(delegate.getRoleId())) { - delegate.setRoleId(sys_role2.getId()); - userRole.setRoleId(sys_role2.getId()); - } - userRole.setTcDelegationId(delegate.getDelegationId()); - teacherCongressSessionService.prepareSessionRole(userRole); - dao.insert(userRole); - } - sysUserService.clearCache(); - } - return Result.success(); + return Result.success(teacherDelegateService.allocateDelegations(sessionId)); } 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 f2b5b53d..77597c84 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 @@ -1,28 +1,14 @@ package com.budwk.app.zhgh.democratic.teachercongress.delegate.listener; -import cn.hutool.core.util.StrUtil; -import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.event.user.SysUserEvent; import com.budwk.app.base.event.user.SysUserEventListener; -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.sys.views.View_user; -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.democratic.teachercongress.delegate.service.TeacherCongressDelegateService; import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeType; +import lombok.extern.slf4j.Slf4j; import org.nutz.aop.interceptor.async.Async; -import org.nutz.dao.Cnd; -import org.nutz.dao.Dao; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; -import java.util.List; - /** * @version 1.0 * @Author zzr @@ -31,16 +17,11 @@ import java.util.List; * @注释 */ @IocBean +@Slf4j public class TeacherCongressDelegateListener implements SysUserEventListener { @Inject - private Dao dao; - @Inject - private SysUserService sysUserService; - @Inject - private SysRoleService sysRoleService; - @Inject - private TeacherCongressSessionService teacherCongressSessionService; + private TeacherCongressDelegateService teacherCongressDelegateService; @Override @Async @@ -49,68 +30,11 @@ public class TeacherCongressDelegateListener implements SysUserEventListener { return; } - // 人员单位变更只同步当前开启届次,防止误修改历史届次代表及角色关系。 - 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; + try { + // 保持原有事件范围,仅将监听器内部归团逻辑下沉到事务服务。 + teacherCongressDelegateService.refreshCurrentDelegateOrganization(event.getUserId()); + } catch (Exception e) { + log.error("刷新教代会代表组织信息失败,userId={}", event.getUserId(), e); } - String userId = event.getUserId(); - //查询校领导的单位 - ProposalConfig config = dao.fetch(ProposalConfig.class, Cnd.NEW()); - List schoolLeaderUnitIds = config.getSchoolLeaderUnitIds(); - - View_user user = dao.fetch(View_user.class, Cnd.where(View_user::getId, "=", userId)); - - //校领导排除在外 - if (StrUtil.isNotBlank(user.getUnitId()) && schoolLeaderUnitIds.contains(user.getUnitId())) { - return; - } - - //查询当前代表的信息 - Teacher_congress_delegate currentDelegate = dao.fetch(Teacher_congress_delegate.class, Cnd.where(Teacher_congress_delegate::getSessionId, "=", session.getId())); - if(currentDelegate == null){ - return; - } - - //查询当前分配的单位属于哪个代表团 - String unitId = user.getUnitId(); - Teacher_congress_delegation_unit unit = dao.fetch(Teacher_congress_delegation_unit.class, Cnd.where(Teacher_congress_delegation_unit::getSessionId, "=", session) - .and(Teacher_congress_delegation_unit::getUnitId, "=", unitId)); - String delegationId = unit.getDelegationId(); - - currentDelegate.setDelegationId(delegationId); - currentDelegate.setUnitId(user.getUnitId()); - currentDelegate.setUnitName(user.getUnitName()); - currentDelegate.setUnionId(user.getUnionId()); - currentDelegate.setUnionName(user.getUnionName()); - dao.updateIgnoreNull(currentDelegate); - - - //角色数据 - Sys_role delegateFormalRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATE_FORMAL.name()); - Sys_role delegateAttendanceRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATE_ATTENDANCE.name()); - Sys_role delegateSpeciallyInviteRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATE_SPECIALLY_INVITE.name()); - Sys_role delegationHeadRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD.name()); - - //删除权限 - //删除角色数据 - dao.clear(Sys_user_role.class, Cnd.where(Sys_user_role::getUserId, "=", userId) - .and(Sys_user_role::getRoleId, "in", List.of(delegateFormalRole.getId(), delegateAttendanceRole.getId(), delegateSpeciallyInviteRole.getId(), delegationHeadRole.getId())) - .and(Sys_user_role::getTcSessionId, "=", session.getId()) - ); - - //再加权限 - Sys_user_role sysUserRole = new Sys_user_role(); - sysUserRole.setUserId(userId); - sysUserRole.setTcSessionId(session.getId()); - sysUserRole.setTcDelegationId(currentDelegate.getDelegationId()); - sysUserRole.setRoleId(currentDelegate.getRoleId()); - teacherCongressSessionService.prepareSessionRole(sysUserRole); - dao.insert(sysUserRole); - - sysUserService.clearCache(); - sysRoleService.clearCache(); } } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/TeacherCongressDelegateService.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/TeacherCongressDelegateService.java index 26918d6b..2d1f2366 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/TeacherCongressDelegateService.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/TeacherCongressDelegateService.java @@ -4,6 +4,8 @@ import com.budwk.app.base.page.Pagination; import com.budwk.app.base.service.BaseService; import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.Teacher_congress_delegate; import com.budwk.app.zhgh.democratic.teachercongress.delegate.param.TeacherCongressDelegateManagePageParam; +import com.budwk.app.zhgh.democratic.teachercongress.delegate.param.TeacherCongressDelegateManagePublicUserParam; +import org.nutz.lang.util.NutMap; import javax.servlet.http.HttpServletResponse; import java.util.List; @@ -20,4 +22,27 @@ public interface TeacherCongressDelegateService extends BaseService listPublicUsers(TeacherCongressDelegateManagePublicUserParam param); + + /** + * 根据系统配置的单位或分工会组成关系,为尚未归团的代表自动分配代表团。 + * + * @param sessionId 届次ID + * @return 已分配、未分配数量及未分配人员名称 + */ + NutMap allocateDelegations(String sessionId); + + /** + * 人员组织变化后,按当前组成模式刷新其当前届次代表及角色归团信息。 + * + * @param userId 用户ID + */ + void refreshCurrentDelegateOrganization(String userId); } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/TeacherCongressDelegateServiceImpl.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/TeacherCongressDelegateServiceImpl.java index 42a9bf19..ec3df4ae 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/TeacherCongressDelegateServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/TeacherCongressDelegateServiceImpl.java @@ -12,13 +12,24 @@ import com.budwk.app.base.utils.CommonDownloadUtil; import com.budwk.app.base.utils.PageUtil; import com.budwk.app.base.utils.SysOfficeTemplateUtil; 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.sys.views.View_user; import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService; import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.Teacher_congress_delegate; import com.budwk.app.zhgh.democratic.teachercongress.delegate.param.TeacherCongressDelegateManagePageParam; +import com.budwk.app.zhgh.democratic.teachercongress.delegate.param.TeacherCongressDelegateManagePublicUserParam; import com.budwk.app.zhgh.democratic.teachercongress.delegate.vo.TeacherCongressDelegateExcelVO; 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.democratic.teachercongress.delegation.constant.TeacherCongressDelegationCompositionMode; +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.delegation.service.TeacherCongressDelegationService; +import com.budwk.app.zhgh.democratic.proposal.models.ProposalConfig; +import com.budwk.app.base.exception.BaseException; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy; @@ -30,6 +41,8 @@ import org.nutz.dao.sql.Sql; import org.nutz.dao.util.cri.SqlExpressionGroup; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.ioc.aop.Aop; +import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.lang.util.NutMap; import javax.servlet.http.HttpServletResponse; @@ -39,6 +52,8 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Set; +import java.util.HashSet; @IocBean(args = {"refer:dao"}) public class TeacherCongressDelegateServiceImpl extends BaseServiceImpl implements TeacherCongressDelegateService { @@ -52,6 +67,139 @@ public class TeacherCongressDelegateServiceImpl extends BaseServiceImpl listPublicUsers(TeacherCongressDelegateManagePublicUserParam param) { + TeacherCongressDelegationCompositionMode mode = teacherCongressDelegationService.getCompositionMode(); + List organizationIds; + if (mode == TeacherCongressDelegationCompositionMode.UNION) { + organizationIds = dao().query(Teacher_congress_delegation_union.class, + Cnd.where(Teacher_congress_delegation_union::getSessionId, "=", param.getSessionId()) + .and(Teacher_congress_delegation_union::getDelegationId, "=", param.getDelegationId())) + .stream().map(Teacher_congress_delegation_union::getUnionId).toList(); + } else { + organizationIds = dao().query(Teacher_congress_delegation_unit.class, + Cnd.where(Teacher_congress_delegation_unit::getSessionId, "=", param.getSessionId()) + .and(Teacher_congress_delegation_unit::getDelegationId, "=", param.getDelegationId())) + .stream().map(Teacher_congress_delegation_unit::getUnitId).toList(); + } + if (organizationIds.isEmpty()) { + throw new BaseException("代表团没有组成" + mode.getLabel()); + } + + String organizationColumn = mode == TeacherCongressDelegationCompositionMode.UNION ? "u.unionId" : "u.unitId"; + Sql sql = Sqls.create("SELECT u.id,u.username AS userName,u.loginname AS loginName,u.unitName,u.unionName " + + "FROM vw_user u WHERE u.id NOT IN (SELECT userId FROM teacher_congress_delegate WHERE sessionId=@sessionId) " + + "AND " + organizationColumn + " IN (@organizationIds) " + + "AND (u.loginname LIKE @keyword OR u.username LIKE @keyword) ORDER BY u.loginname LIMIT 50"); + sql.setParam("sessionId", param.getSessionId()); + sql.setParam("organizationIds", organizationIds); + sql.setParam("keyword", "%" + param.getKeyWord() + "%"); + return listMap(sql); + } + + /** + * 为当前届次未归团代表批量解析代表团,同时刷新其届次代表角色,避免重复生成角色关系。 + */ + @Override + @Aop(TransAop.READ_COMMITTED) + public NutMap allocateDelegations(String sessionId) { + List delegates = query(Cnd.where(Teacher_congress_delegate::getSessionId, "=", sessionId) + .and(Teacher_congress_delegate::getDelegationId, "is", null)); + List unassignedNames = new ArrayList<>(); + int assignedCount = 0; + for (Teacher_congress_delegate delegate : delegates) { + String delegationId = teacherCongressDelegationService.resolveDelegationId(sessionId, delegate.getUnitId(), delegate.getUnionId()); + if (StrUtil.isBlank(delegationId)) { + unassignedNames.add(delegate.getUserName() + "(" + delegate.getLoginName() + ")"); + continue; + } + delegate.setDelegationId(delegationId); + updateIgnoreNull(delegate); + replaceDelegateRole(delegate); + assignedCount++; + } + sysUserService.clearCache(); + return NutMap.NEW().addv("assignedCount", assignedCount) + .addv("unassignedCount", unassignedNames.size()).addv("unassignedNames", unassignedNames); + } + + /** + * 人员组织变更事件只处理当前开启届次;代表身份保留,代表团负责人角色在跨团时清理。 + */ + @Override + @Aop(TransAop.READ_COMMITTED) + public void refreshCurrentDelegateOrganization(String userId) { + 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; + } + View_user user = dao().fetch(View_user.class, Cnd.where(View_user::getId, "=", userId)); + if (user == null) { + return; + } + ProposalConfig config = dao().fetch(ProposalConfig.class, Cnd.NEW()); + if (config != null && config.getSchoolLeaderUnitIds() != null + && StrUtil.isNotBlank(user.getUnitId()) && config.getSchoolLeaderUnitIds().contains(user.getUnitId())) { + return; + } + Teacher_congress_delegate delegate = fetch(Cnd.where(Teacher_congress_delegate::getSessionId, "=", session.getId()) + .and(Teacher_congress_delegate::getUserId, "=", userId)); + if (delegate == null) { + return; + } + + String oldDelegationId = delegate.getDelegationId(); + String newDelegationId = teacherCongressDelegationService.resolveDelegationId(session.getId(), user.getUnitId(), user.getUnionId()); + delegate.setDelegationId(newDelegationId); + delegate.setUnitId(user.getUnitId()); + delegate.setUnitName(user.getUnitName()); + delegate.setUnionId(user.getUnionId()); + delegate.setUnionName(user.getUnionName()); + delegate.setMobile(user.getMobile()); + update(delegate); + replaceDelegateRole(delegate); + if (!java.util.Objects.equals(oldDelegationId, newDelegationId)) { + clearDelegationManagerRoles(userId, session.getId()); + } + sysUserService.clearCache(); + sysRoleService.clearCache(); + } + + /** 替换代表本届次的同一身份角色,确保角色中的代表团ID与代表表一致。 */ + private void replaceDelegateRole(Teacher_congress_delegate delegate) { + dao().clear(Sys_user_role.class, Cnd.where(Sys_user_role::getUserId, "=", delegate.getUserId()) + .and(Sys_user_role::getRoleId, "=", delegate.getRoleId()) + .and(Sys_user_role::getTcSessionId, "=", delegate.getSessionId())); + Sys_user_role role = new Sys_user_role(); + role.setUserId(delegate.getUserId()); + role.setRoleId(delegate.getRoleId()); + role.setTcSessionId(delegate.getSessionId()); + role.setTcDelegationId(delegate.getDelegationId()); + teacherCongressSessionService.prepareSessionRole(role); + dao().insert(role); + } + + /** 跨代表团后清理团长、副团长及联络人角色,避免保留原代表团管理权限。 */ + private void clearDelegationManagerRoles(String userId, String sessionId) { + Set roleIds = new HashSet<>(); + roleIds.add(sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD).getId()); + roleIds.add(sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_VICE_DELEGATION_HEAD).getId()); + roleIds.add(sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_CONTACT).getId()); + dao().clear(Sys_user_role.class, Cnd.where(Sys_user_role::getUserId, "=", userId) + .and(Sys_user_role::getTcSessionId, "=", sessionId) + .and(Sys_user_role::getRoleId, "in", roleIds)); + } @Override public Pagination pageData(TeacherCongressDelegateManagePageParam pageForm) { diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/controller/TeacherCongressDelegationController.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/controller/TeacherCongressDelegationController.java index a86d1a43..b2d138be 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/controller/TeacherCongressDelegationController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/controller/TeacherCongressDelegationController.java @@ -170,45 +170,18 @@ public class TeacherCongressDelegationController { @At @SaCheckPermission("tc.delegation") public Result partUnitTransferData(@Valid String delegationId, @Valid String sessionId) { - //找出本届次已经设置了代表团的所有单位 - List delegationUnits = dao.query(Teacher_congress_delegation_unit.class, Cnd.where("sessionId", "=", sessionId)); - List unitIds = delegationUnits.stream().map(Teacher_congress_delegation_unit::getUnitId).toList(); - - //找出本代表团的单位 - List selectUnitIds = delegationUnits.stream().filter(unit -> unit.getDelegationId().equals(delegationId)).map(Teacher_congress_delegation_unit::getUnitId).toList(); - - SqlExpressionGroup seg = new SqlExpressionGroup(); - seg.orEX("id", "not in", unitIds); - seg.orEX("id", "in", selectUnitIds); - -// Cnd cnd = Cnd.where("unitLevel", "=", 2); - Cnd cnd = Cnd.where("unitTypeCode", "=", "1"); - if (!seg.isEmpty()) { - cnd.and(seg); - } - cnd.asc("unitcode"); - - List units = dao.query(Sys_unit.class, cnd); - - NutMap transferData = NutMap.NEW().addv("selectUnitIds", selectUnitIds).addv("allUnits", units); - return Result.success(transferData); + NutMap data = teacherCongressDelegationService.getCompositionTransferData(sessionId, delegationId); + // 保留旧接口字段,兼容未同步更新的历史页面调用。 + data.put("selectUnitIds", data.get("selectedIds")); + data.put("allUnits", data.get("allItems")); + return Result.success(data); } @At @SaCheckPermission("tc.delegation") @Aop(TransAop.READ_COMMITTED) public Result partUnitSet(@Valid String delegationId, @Valid String sessionId, @Param("unitIds") String[] unitIds) { - dao.clear(Teacher_congress_delegation_unit.class, Cnd.where("delegationId", "=", delegationId).and("sessionId", "=", sessionId)); - - List insertData = Arrays.stream(unitIds).map(unitId -> { - Teacher_congress_delegation_unit delegationUnit = new Teacher_congress_delegation_unit(); - delegationUnit.setUnitId(unitId); - delegationUnit.setDelegationId(delegationId); - delegationUnit.setSessionId(sessionId); - return delegationUnit; - }).toList(); - - dao.insert(insertData); + teacherCongressDelegationService.saveComposition(sessionId, delegationId, unitIds); return Result.success(); } @@ -222,24 +195,35 @@ public class TeacherCongressDelegationController { @At @SaCheckPermission("tc.delegation") public Result partUnitPageData(@Valid PageForm pageForm, @Valid String sessionId, @Valid String delegationId) { - Sql sql = Sqls.create(""" - SELECT - t2.id, - t2.`name` - FROM - teacher_congress_delegation_unit t1 - LEFT JOIN sys_unit t2 ON t2.id = t1.unitId - $condition - """); - Cnd cnd = Cnd.NEW(); - cnd.and("t1.delegationId", "=", delegationId); - cnd.and("t1.sessionId", "=", sessionId); - if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { - cnd.where().andLike("t2.name", pageForm.getSearchKeyword()); - } - sql.setCondition(cnd); - Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); - return Result.success(pagination); + return Result.success(teacherCongressDelegationService.pageComposition(pageForm, sessionId, delegationId)); + } + + /** + * 获取当前配置模式下的代表团组成选择数据。 + */ + @At + @SaCheckPermission("tc.delegation") + public Result compositionTransferData(@Valid String delegationId, @Valid String sessionId) { + return Result.success(teacherCongressDelegationService.getCompositionTransferData(sessionId, delegationId)); + } + + /** + * 保存当前配置模式下的代表团组成关系。 + */ + @At + @SaCheckPermission("tc.delegation") + public Result compositionSet(@Valid String delegationId, @Valid String sessionId, @Param("itemIds") String[] itemIds) { + teacherCongressDelegationService.saveComposition(sessionId, delegationId, itemIds); + return Result.success(); + } + + /** + * 分页查询当前配置模式下的代表团组成关系。 + */ + @At + @SaCheckPermission("tc.delegation") + public Result compositionPageData(@Valid PageForm pageForm, @Valid String sessionId, @Valid String delegationId) { + return Result.success(teacherCongressDelegationService.pageComposition(pageForm, sessionId, delegationId)); } /** diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/service/TeacherCongressDelegationService.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/service/TeacherCongressDelegationService.java index 7d47a167..99b0a7e5 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/service/TeacherCongressDelegationService.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/service/TeacherCongressDelegationService.java @@ -1,6 +1,9 @@ package com.budwk.app.zhgh.democratic.teachercongress.delegation.service; import com.budwk.app.base.service.BaseService; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.param.PageForm; +import com.budwk.app.zhgh.democratic.teachercongress.delegation.constant.TeacherCongressDelegationCompositionMode; import com.budwk.app.zhgh.democratic.teachercongress.delegation.models.Teacher_congress_delegation; import org.nutz.lang.util.NutMap; @@ -11,6 +14,51 @@ import java.util.List; */ public interface TeacherCongressDelegationService extends BaseService { + /** + * 获取当前代表团组成模式。 + * + * @return 单位或分工会模式 + */ + TeacherCongressDelegationCompositionMode getCompositionMode(); + + /** + * 获取代表团组成选择器数据,已被其他代表团占用的数据不会返回。 + * + * @param sessionId 届次ID + * @param delegationId 代表团ID + * @return 组成模式、当前选中ID及可选项 + */ + NutMap getCompositionTransferData(String sessionId, String delegationId); + + /** + * 保存当前模式下的代表团组成关系。 + * + * @param sessionId 届次ID + * @param delegationId 代表团ID + * @param itemIds 单位ID或分工会ID + */ + void saveComposition(String sessionId, String delegationId, String[] itemIds); + + /** + * 分页查询当前模式下的代表团组成数据。 + * + * @param pageForm 分页查询参数 + * @param sessionId 届次ID + * @param delegationId 代表团ID + * @return 组成数据分页结果 + */ + Pagination pageComposition(PageForm pageForm, String sessionId, String delegationId); + + /** + * 按当前组成模式解析人员所属代表团。 + * + * @param sessionId 届次ID + * @param unitId 人员单位ID + * @param unionId 人员分工会ID + * @return 代表团ID,未配置时返回空 + */ + String resolveDelegationId(String sessionId, String unitId, String unionId); + /** * 按角色查询代表团负责人信息。 * @@ -41,4 +89,4 @@ public interface TeacherCongressDelegationService extends BaseService occupiedIds = new ArrayList<>(); + List selectedIds = new ArrayList<>(); + List allItems = new ArrayList<>(); + + if (mode == TeacherCongressDelegationCompositionMode.UNION) { + List relations = dao().query(Teacher_congress_delegation_union.class, + Cnd.where(Teacher_congress_delegation_union::getSessionId, "=", sessionId)); + relations.forEach(relation -> { + occupiedIds.add(relation.getUnionId()); + if (delegationId.equals(relation.getDelegationId())) { + selectedIds.add(relation.getUnionId()); + } + }); + Cnd cnd = buildAvailableCondition(occupiedIds, selectedIds); + cnd.asc(Sys_union::getUnionCode); + dao().query(Sys_union.class, cnd).forEach(item -> allItems.add(NutMap.NEW() + .addv("id", item.getId()).addv("name", item.getName()).addv("code", item.getUnionCode()))); + } else { + List relations = dao().query(Teacher_congress_delegation_unit.class, + Cnd.where(Teacher_congress_delegation_unit::getSessionId, "=", sessionId)); + relations.forEach(relation -> { + occupiedIds.add(relation.getUnitId()); + if (delegationId.equals(relation.getDelegationId())) { + selectedIds.add(relation.getUnitId()); + } + }); + Cnd cnd = Cnd.where(Sys_unit::getUnitTypeCode, "=", "1"); + appendAvailableCondition(cnd, occupiedIds, selectedIds); + cnd.asc(Sys_unit::getUnitcode); + dao().query(Sys_unit.class, cnd).forEach(item -> allItems.add(NutMap.NEW() + .addv("id", item.getId()).addv("name", item.getName()).addv("code", item.getUnitcode()))); + } + return NutMap.NEW().addv("mode", mode.getCode()).addv("label", mode.getLabel()) + .addv("selectedIds", selectedIds).addv("allItems", allItems); + } + + /** + * 保存当前组成模式对应的关联表,并在写入前校验跨代表团重复占用。 + */ + @Override + @Aop(TransAop.READ_COMMITTED) + public void saveComposition(String sessionId, String delegationId, String[] itemIds) { + validateDelegation(sessionId, delegationId); + List normalizedIds = itemIds == null ? Collections.emptyList() : Arrays.stream(itemIds) + .filter(StrUtil::isNotBlank).distinct().toList(); + TeacherCongressDelegationCompositionMode mode = getCompositionMode(); + if (mode == TeacherCongressDelegationCompositionMode.UNION) { + validateUnionIds(normalizedIds); + int occupied = normalizedIds.isEmpty() ? 0 : dao().count(Teacher_congress_delegation_union.class, + Cnd.where(Teacher_congress_delegation_union::getSessionId, "=", sessionId) + .and(Teacher_congress_delegation_union::getDelegationId, "!=", delegationId) + .and(Teacher_congress_delegation_union::getUnionId, "in", normalizedIds)); + if (occupied > 0) { + throw new BaseException("所选分工会已被其他代表团使用,请刷新后重试"); + } + dao().clear(Teacher_congress_delegation_union.class, Cnd.where(Teacher_congress_delegation_union::getSessionId, "=", sessionId) + .and(Teacher_congress_delegation_union::getDelegationId, "=", delegationId)); + normalizedIds.forEach(itemId -> { + Teacher_congress_delegation_union relation = new Teacher_congress_delegation_union(); + relation.setSessionId(sessionId); + relation.setDelegationId(delegationId); + relation.setUnionId(itemId); + dao().insert(relation); + }); + return; + } + + validateUnitIds(normalizedIds); + int occupied = normalizedIds.isEmpty() ? 0 : dao().count(Teacher_congress_delegation_unit.class, + Cnd.where(Teacher_congress_delegation_unit::getSessionId, "=", sessionId) + .and(Teacher_congress_delegation_unit::getDelegationId, "!=", delegationId) + .and(Teacher_congress_delegation_unit::getUnitId, "in", normalizedIds)); + if (occupied > 0) { + throw new BaseException("所选单位已被其他代表团使用,请刷新后重试"); + } + dao().clear(Teacher_congress_delegation_unit.class, Cnd.where(Teacher_congress_delegation_unit::getSessionId, "=", sessionId) + .and(Teacher_congress_delegation_unit::getDelegationId, "=", delegationId)); + normalizedIds.forEach(itemId -> { + Teacher_congress_delegation_unit relation = new Teacher_congress_delegation_unit(); + relation.setSessionId(sessionId); + relation.setDelegationId(delegationId); + relation.setUnitId(itemId); + dao().insert(relation); + }); + } + + /** + * 分页查询当前模式下的组成关系,统一向前端返回 id、name、code 字段。 + */ + @Override + public Pagination pageComposition(PageForm pageForm, String sessionId, String delegationId) { + validateDelegation(sessionId, delegationId); + boolean unionMode = getCompositionMode() == TeacherCongressDelegationCompositionMode.UNION; + String sqlText = unionMode + ? "SELECT t2.id,t2.name,t2.unionCode AS code FROM teacher_congress_delegation_union t1 LEFT JOIN sys_union t2 ON t2.id=t1.unionId $condition" + : "SELECT t2.id,t2.name,t2.unitcode AS code FROM teacher_congress_delegation_unit t1 LEFT JOIN sys_unit t2 ON t2.id=t1.unitId $condition"; + Sql sql = Sqls.create(sqlText); + Cnd cnd = Cnd.where("t1.sessionId", "=", sessionId).and("t1.delegationId", "=", delegationId); + if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { + cnd.where().andLike("t2.name", pageForm.getSearchKeyword()); + } + cnd.asc("code"); + sql.setCondition(cnd); + return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + } + + /** + * 按当前模式精确解析代表团;同一组织存在多条关系时拒绝随机匹配,避免代表被错误归团。 + */ + @Override + public String resolveDelegationId(String sessionId, String unitId, String unionId) { + TeacherCongressDelegationCompositionMode mode = getCompositionMode(); + if (mode == TeacherCongressDelegationCompositionMode.UNION) { + if (StrUtil.isBlank(unionId)) { + return null; + } + List relations = dao().query(Teacher_congress_delegation_union.class, + Cnd.where(Teacher_congress_delegation_union::getSessionId, "=", sessionId) + .and(Teacher_congress_delegation_union::getUnionId, "=", unionId)); + return resolveUniqueDelegation(relations.stream().map(Teacher_congress_delegation_union::getDelegationId).toList(), "分工会"); + } + if (StrUtil.isBlank(unitId)) { + return null; + } + List relations = dao().query(Teacher_congress_delegation_unit.class, + Cnd.where(Teacher_congress_delegation_unit::getSessionId, "=", sessionId) + .and(Teacher_congress_delegation_unit::getUnitId, "=", unitId)); + return resolveUniqueDelegation(relations.stream().map(Teacher_congress_delegation_unit::getDelegationId).toList(), "单位"); + } + + private Cnd buildAvailableCondition(List occupiedIds, List selectedIds) { + Cnd cnd = Cnd.NEW(); + appendAvailableCondition(cnd, occupiedIds, selectedIds); + return cnd; + } + + /** 当前代表团已选项允许继续显示,其余已占用项从选择器中排除。 */ + private void appendAvailableCondition(Cnd cnd, List occupiedIds, List selectedIds) { + if (occupiedIds.isEmpty()) { + return; + } + if (selectedIds.isEmpty()) { + cnd.and("id", "not in", occupiedIds); + return; + } + cnd.and(Cnd.exps("id", "not in", occupiedIds).or("id", "in", selectedIds)); + } + + /** 校验代表团确实属于当前届次,防止跨届次写入组成关系。 */ + private void validateDelegation(String sessionId, String delegationId) { + if (dao().count(Teacher_congress_delegation.class, Cnd.where(Teacher_congress_delegation::getId, "=", delegationId) + .and(Teacher_congress_delegation::getSessionId, "=", sessionId)) != 1) { + throw new BaseException("代表团或届次参数错误"); + } + } + + /** 校验提交的分工会ID均真实存在。 */ + private void validateUnionIds(List ids) { + if (!ids.isEmpty() && dao().count(Sys_union.class, Cnd.where(Sys_union::getId, "in", ids)) != ids.size()) { + throw new BaseException("所选分工会数据不存在,请刷新后重试"); + } + } + + /** 校验提交的单位ID均真实存在且属于代表团可用的单位类型。 */ + private void validateUnitIds(List ids) { + if (!ids.isEmpty() && dao().count(Sys_unit.class, Cnd.where(Sys_unit::getId, "in", ids) + .and(Sys_unit::getUnitTypeCode, "=", "1")) != ids.size()) { + throw new BaseException("所选单位数据不存在,请刷新后重试"); + } + } + + /** 对组织与代表团关系执行唯一性校验。 */ + private String resolveUniqueDelegation(List delegationIds, String label) { + if (delegationIds.isEmpty()) { + return null; + } + if (delegationIds.size() > 1) { + throw new BaseException(label + "存在重复代表团关系,请先检查代表团组成配置"); + } + return delegationIds.get(0); + } + /** * 按角色查询代表团负责人信息,副团长允许返回多条记录以兼容V3多副团长数据。 * diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/prepare/service/impl/TeacherCongressSessionServiceImpl.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/prepare/service/impl/TeacherCongressSessionServiceImpl.java index fb4aa6d1..3c3d33cd 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/prepare/service/impl/TeacherCongressSessionServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/prepare/service/impl/TeacherCongressSessionServiceImpl.java @@ -22,6 +22,7 @@ import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.Teacher_con 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.delegation.service.TeacherCongressDelegationService; 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.meetings.models.Teacher_congress_meeting; @@ -57,6 +58,8 @@ public class TeacherCongressSessionServiceImpl extends BaseServiceImpl sysUsers = dao.query(Sys_user.class, Cnd.where("id", "in", userIds)); + List sysUserHistoryStream = sysUsers.stream().map(e -> { + Sys_user_history sysUserHistory = new Sys_user_history(); + BeanUtil.copyProperties(e, sysUserHistory); + sysUserHistory.setChangeTypes(List.of(MemberChangeTypeName)); + sysUserHistory.setChangeTime(date); + NutMap change = NutMap.NEW(); + change.put("fieldName", "会员状态"); + change.put("field", "member"); + change.put("sourceValue", "否"); + change.put("newValue", "是"); + sysUserHistory.setChangeInfos(List.of(change)); + sysUserHistory.setChangeOrigin(MemberChangeOrigin.HAND_MOVEMENT.name()); + return sysUserHistory; + }).collect(Collectors.toList()); + dao.insert(sysUserHistoryStream); return Result.success(); } diff --git a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/manage/index.html b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/manage/index.html index be2588bb..a96b065a 100644 --- a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/manage/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/manage/index.html @@ -39,7 +39,7 @@ layout("/layouts/platform.html"){ - 根据单位分配代表团 + {{ allocateButtonText }} 导入代表 新增代表 @@ -138,19 +138,34 @@ layout("/layouts/platform.html"){ roleOptions: [], formRules: {}, - excelImportDialog: false + excelImportDialog: false, + compositionMode: "${config.dbtzc!'unit'}" + } + }, + computed: { + compositionLabel() { + return this.compositionMode === "union" ? "分工会" : "单位" + }, + allocateButtonText() { + return "根据" + this.compositionLabel + "分配代表团" } }, methods: { doAllocateDelegation() { - this.$confirm("确定要一键给没有代表团的代表,根据单位所在代表团设置代表团吗?", "提示", { + this.$confirm("确定要给尚未归团的代表,根据" + this.compositionLabel + "组成关系设置代表团吗?", "提示", { confirmButtonText: "确定", cancelButtonText: "取消", type: "info" }).then(() => { this.$axios.post(loc() + "/doAllocateDelegation", {sessionId: this.pageForm.sessionId}).then((res) => { if (res.code === 0) { - this.$message.success(res.msg) + let message = "已分配" + res.data.assignedCount + "人" + if (res.data.unassignedCount > 0) { + message += ",另有" + res.data.unassignedCount + "人未找到对应代表团" + this.$message.warning(message) + } else { + this.$message.success(message) + } this.doSearch() } }) diff --git a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegation/index.html b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegation/index.html index 735c3a3d..b1ce9208 100644 --- a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegation/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegation/index.html @@ -35,7 +35,7 @@ layout("/layouts/platform.html"){ 设置团长 - 设置组成单位 + {{ compositionButtonText }} 删除 @@ -46,11 +46,12 @@ layout("/layouts/platform.html"){