From a9fc3d9690779ece155fa0d8d0b1a39e86242195 Mon Sep 17 00:00:00 2001 From: = <=> Date: Tue, 28 Apr 2026 17:33:16 +0800 Subject: [PATCH] commit --- src/main/java/io/v/nutz/base/utils/Roles.java | 2 + .../nutz/sys/services/SysClubUserService.java | 21 ++ .../services/impl/SysClubUserServiceImpl.java | 192 ++++++++++++++++++ .../web/commons/proc/NutShiroProcessor.java | 6 +- .../platform/sys/club/ClubInController.java | 58 ++++++ .../platform/sys/club/SysClubCon.java | 26 ++- .../platform/sys/club/SysClubUserCon.java | 90 +++++++- .../platform/sys/club/SysClubUserShCon.java | 23 ++- .../views/platform/sys/club/clubIn.html | 155 +++++++++++++- .../views/platform/sys/club/clubMange.html | 11 +- 10 files changed, 552 insertions(+), 32 deletions(-) diff --git a/src/main/java/io/v/nutz/base/utils/Roles.java b/src/main/java/io/v/nutz/base/utils/Roles.java index d71d3a8..493288a 100644 --- a/src/main/java/io/v/nutz/base/utils/Roles.java +++ b/src/main/java/io/v/nutz/base/utils/Roles.java @@ -31,6 +31,8 @@ public interface Roles { */ String CLUB_FZR = "c17d7a777dd24d36b4b268037b959faf"; + String CLUB_JBR_CODE = "xhjbr"; + /** * 代表团团长 */ diff --git a/src/main/java/io/v/nutz/sys/services/SysClubUserService.java b/src/main/java/io/v/nutz/sys/services/SysClubUserService.java index 5b4947d..d15ac51 100644 --- a/src/main/java/io/v/nutz/sys/services/SysClubUserService.java +++ b/src/main/java/io/v/nutz/sys/services/SysClubUserService.java @@ -1,8 +1,29 @@ package io.v.nutz.sys.services; import cn.wizzer.framework.base.service.BaseService; +import io.v.nutz.web.controllers.platform.sys.club.ClubUserImportFeature; import io.v.nutz.sys.models.Sys_club_user; +import org.nutz.lang.util.NutMap; +import org.nutz.mvc.upload.TempFile; + +import java.util.List; public interface SysClubUserService extends BaseService { + /** + * 批量导入协会成员。 + * 导入过程中按行校验并逐行入库,单行失败不会中断整批导入。 + * + * @param file 导入文件 + * @return 导入结果统计及错误缓存标识 + */ + NutMap importClubMembers(TempFile file); + + /** + * 根据缓存标识获取导入错误记录,用于前端下载错误信息表格。 + * + * @param cacheKey 错误缓存标识 + * @return 错误记录列表 + */ + List getImportErrorList(String cacheKey); } diff --git a/src/main/java/io/v/nutz/sys/services/impl/SysClubUserServiceImpl.java b/src/main/java/io/v/nutz/sys/services/impl/SysClubUserServiceImpl.java index fc66da8..a930ba3 100644 --- a/src/main/java/io/v/nutz/sys/services/impl/SysClubUserServiceImpl.java +++ b/src/main/java/io/v/nutz/sys/services/impl/SysClubUserServiceImpl.java @@ -1,16 +1,208 @@ package io.v.nutz.sys.services.impl; +import cn.afterturn.easypoi.excel.ExcelImportUtil; import cn.wizzer.framework.base.service.BaseServiceImpl; +import io.v.nutz.base.utils.DateUtil; +import io.v.nutz.sys.models.Sys_club; import io.v.nutz.sys.models.Sys_club_user; +import io.v.nutz.sys.models.Sys_user; +import io.v.nutz.sys.services.SysClubService; import io.v.nutz.sys.services.SysClubUserService; +import io.v.nutz.sys.services.SysUserService; +import io.v.nutz.web.controllers.platform.sys.club.ClubUserImportFeature; +import org.nutz.dao.Cnd; import org.nutz.dao.Dao; +import org.nutz.integration.jedis.RedisService; import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.json.Json; +import org.nutz.lang.Lang; +import org.nutz.lang.Strings; +import org.nutz.lang.random.R; +import org.nutz.lang.util.NutMap; + +import org.nutz.mvc.upload.TempFile; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; @IocBean(args = {"refer:dao"}) public class SysClubUserServiceImpl extends BaseServiceImpl implements SysClubUserService { + @Inject + private SysClubService sysClubService; + + @Inject + private SysUserService sysUserService; + + @Inject + private RedisService redisService; + public SysClubUserServiceImpl(Dao dao) { super(dao); } + + @Override + public NutMap importClubMembers(TempFile file) { + List importRows = ExcelImportUtil.importExcel(file.getFile(), + ClubUserImportFeature.ImportRow.class, new cn.afterturn.easypoi.excel.entity.ImportParams()); + List errorRows = new ArrayList<>(); + + if (Lang.isEmpty(importRows)) { + return NutMap.NEW().setv("totalCount", 0) + .setv("successCount", 0) + .setv("errorCount", 0) + .setv("cacheKey", ""); + } + + List clubCodes = importRows.stream() + .map(ClubUserImportFeature.ImportRow::getClubCode) + .filter(Strings::isNotBlank) + .map(String::trim) + .distinct() + .collect(Collectors.toList()); + List loginNames = importRows.stream() + .map(ClubUserImportFeature.ImportRow::getLoginname) + .filter(Strings::isNotBlank) + .map(String::trim) + .distinct() + .collect(Collectors.toList()); + + Map clubMap = Lang.isEmpty(clubCodes) ? Collections.emptyMap() + : sysClubService.query(Cnd.where("code", "in", clubCodes)).stream() + .collect(Collectors.toMap(v -> v.getCode().trim(), Function.identity(), (o1, o2) -> o1)); + Map userMap = Lang.isEmpty(loginNames) ? Collections.emptyMap() + : sysUserService.query(Cnd.where("loginname", "in", loginNames)).stream() + .collect(Collectors.toMap(v -> v.getLoginname().trim(), Function.identity(), (o1, o2) -> o1)); + + List clubIds = clubMap.values().stream().map(Sys_club::getId).collect(Collectors.toList()); + List userIds = userMap.values().stream().map(Sys_user::getId).collect(Collectors.toList()); + Set existsMemberKeys; + if (Lang.isEmpty(clubIds) || Lang.isEmpty(userIds)) { + existsMemberKeys = new HashSet<>(); + } else { + existsMemberKeys = this.query(Cnd.where("clubid", "in", clubIds).and("userid", "in", userIds).and("isNormal", "=", true)) + .stream() + .map(v -> v.getClubid() + "_" + v.getUserid()) + .collect(Collectors.toSet()); + } + + Set importMemberKeys = new HashSet<>(); + int successCount = 0; + for (ClubUserImportFeature.ImportRow importRow : importRows) { + ClubUserImportFeature.ErrorRow errorRow = buildErrorRow(importRow); + try { + String clubCode = Strings.sNull(importRow.getClubCode()).trim(); + String loginname = Strings.sNull(importRow.getLoginname()).trim(); + String username = Strings.sNull(importRow.getUsername()).trim(); + + if (Strings.isBlank(clubCode)) { + errorRow.setErrorMessage("协会编码不能为空"); + errorRows.add(errorRow); + continue; + } + if (Strings.isBlank(loginname)) { + errorRow.setErrorMessage("工号不能为空"); + errorRows.add(errorRow); + continue; + } + if (Strings.isBlank(username)) { + errorRow.setErrorMessage("姓名不能为空"); + errorRows.add(errorRow); + continue; + } + + Sys_club club = clubMap.get(clubCode); + if (club == null) { + errorRow.setErrorMessage("未找到对应的协会编码"); + errorRows.add(errorRow); + continue; + } + + Sys_user user = userMap.get(loginname); + if (user == null) { + errorRow.setErrorMessage("未找到对应的工号用户"); + errorRows.add(errorRow); + continue; + } + + if (!username.equals(Strings.sNull(user.getUsername()).trim())) { + errorRow.setErrorMessage("姓名与系统中的用户姓名不一致"); + errorRows.add(errorRow); + continue; + } + + String importKey = clubCode + "_" + loginname; + if (!importMemberKeys.add(importKey)) { + errorRow.setErrorMessage("导入文件中存在重复的协会编码和工号"); + errorRows.add(errorRow); + continue; + } + + String dbKey = club.getId() + "_" + user.getId(); + if (existsMemberKeys.contains(dbKey)) { + errorRow.setErrorMessage("该用户已存在于该协会成员表中"); + errorRows.add(errorRow); + continue; + } + + // Only persist the current system's membership relation fields here. + Sys_club_user clubUser = new Sys_club_user(); + clubUser.setClubid(club.getId()); + clubUser.setUserid(user.getId()); + clubUser.setJoin_time(DateUtil.getDateTime()); + clubUser.setSf(2); + clubUser.setStatus(5); + clubUser.setIsNormal(true); + this.insert(clubUser); + existsMemberKeys.add(dbKey); + successCount++; + } catch (Exception e) { + errorRow.setErrorMessage(Strings.isBlank(e.getMessage()) ? "导入失败,请联系管理员处理" : e.getMessage()); + errorRows.add(errorRow); + } + } + + String cacheKey = ""; + if (Lang.isNotEmpty(errorRows)) { + cacheKey = R.UU32(); + redisService.setex(cacheKey, 60 * 60 * 5, Json.toJson(errorRows)); + } + + return NutMap.NEW().setv("totalCount", importRows.size()) + .setv("successCount", successCount) + .setv("errorCount", errorRows.size()) + .setv("cacheKey", cacheKey); + } + + @Override + public List getImportErrorList(String cacheKey) { + if (Strings.isBlank(cacheKey)) { + return Collections.emptyList(); + } + String json = redisService.get(cacheKey); + if (Strings.isBlank(json)) { + return Collections.emptyList(); + } + return Json.fromJsonAsList(ClubUserImportFeature.ErrorRow.class, json); + } + + /** + * Build one exportable error row from the original import row. + */ + private ClubUserImportFeature.ErrorRow buildErrorRow(ClubUserImportFeature.ImportRow importRow) { + ClubUserImportFeature.ErrorRow errorRow = new ClubUserImportFeature.ErrorRow(); + errorRow.setIndex(importRow.getIndex()); + errorRow.setClubCode(importRow.getClubCode()); + errorRow.setLoginname(importRow.getLoginname()); + errorRow.setUsername(importRow.getUsername()); + return errorRow; + } } diff --git a/src/main/java/io/v/nutz/web/commons/proc/NutShiroProcessor.java b/src/main/java/io/v/nutz/web/commons/proc/NutShiroProcessor.java index 0bee766..8c8560d 100644 --- a/src/main/java/io/v/nutz/web/commons/proc/NutShiroProcessor.java +++ b/src/main/java/io/v/nutz/web/commons/proc/NutShiroProcessor.java @@ -74,12 +74,12 @@ public class NutShiroProcessor extends AbstractProcessor { //不需要认证授权的url String[] authIgnoreUrlArr = Lang.array("/", "/sso/login", - "/platform/login", +// "/platform/login", "/platform/login(/doLogin|/logout|/captcha)", "/platform/qywechat/.*", "/platform/wechat/.*", "/platform/home/(500|403|404|UnknownAccountError|LockedAccountError)", - "/mobile/login", +// "/mobile/login", "/mobile/login/doLogin" ); if (Arrays.stream(authIgnoreUrlArr).noneMatch(v -> Pattern.compile(v).matcher(requestURI).matches())) { @@ -218,4 +218,4 @@ public class NutShiroProcessor extends AbstractProcessor { } } -} \ No newline at end of file +} diff --git a/src/main/java/io/v/nutz/web/controllers/platform/sys/club/ClubInController.java b/src/main/java/io/v/nutz/web/controllers/platform/sys/club/ClubInController.java index bac23d3..74d407d 100644 --- a/src/main/java/io/v/nutz/web/controllers/platform/sys/club/ClubInController.java +++ b/src/main/java/io/v/nutz/web/controllers/platform/sys/club/ClubInController.java @@ -1,12 +1,29 @@ package io.v.nutz.web.controllers.platform.sys.club; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; +import cn.wizzer.framework.base.Result; +import io.v.nutz.annontation.ViReturn; import io.v.nutz.sys.services.SysClubService; +import io.v.nutz.sys.services.SysClubUserService; +import io.v.nutz.util.ViTool; +import org.apache.poi.ss.usermodel.Workbook; import org.apache.shiro.authz.annotation.RequiresAuthentication; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Strings; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.AdaptBy; +import org.nutz.mvc.annotation.Param; +import org.nutz.mvc.upload.TempFile; +import org.nutz.mvc.upload.UploadAdaptor; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Collections; /** * @Author JyuHsin @@ -22,9 +39,50 @@ public class ClubInController { @Inject private SysClubService sysClubService; + @Inject + private SysClubUserService sysClubUserService; + @At("") @Ok("beetl:/platform/sys/club/clubIn.html") @RequiresPermissions("sys.club.clubIn") public void index() { } + + @At + @Ok("void") + @RequiresPermissions("sys.club.clubIn") + public void downloadImportTemplate(HttpServletResponse response) throws IOException { + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + Workbook workbook = ExcelExportUtil.exportExcel(exportParams, ClubUserImportFeature.ImportRow.class, Collections.emptyList()); + ViTool.excelResponse(response, "协会成员导入模板.xlsx"); + workbook.write(response.getOutputStream()); + } + + @At + @ViReturn + @AdaptBy(type = UploadAdaptor.class, args = {"ioc:fileUpload"}) + @RequiresPermissions("sys.club.clubIn") + public Object doImportMember(@Param("file") TempFile file) { + if (file == null) { + return Result.error("请先选择导入文件"); + } + try { + return Result.success(sysClubUserService.importClubMembers(file)); + } catch (Exception e) { + return Result.error(Strings.isBlank(e.getMessage()) ? "导入失败" : e.getMessage()); + } + } + + @At + @Ok("void") + @RequiresPermissions("sys.club.clubIn") + public void exportImportErrors(HttpServletResponse response, String cacheKey) throws IOException { + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + Workbook workbook = ExcelExportUtil.exportExcel(exportParams, ClubUserImportFeature.ErrorRow.class, + sysClubUserService.getImportErrorList(cacheKey)); + ViTool.excelResponse(response, "协会成员导入错误信息.xlsx"); + workbook.write(response.getOutputStream()); + } } diff --git a/src/main/java/io/v/nutz/web/controllers/platform/sys/club/SysClubCon.java b/src/main/java/io/v/nutz/web/controllers/platform/sys/club/SysClubCon.java index 7351f94..def1c13 100644 --- a/src/main/java/io/v/nutz/web/controllers/platform/sys/club/SysClubCon.java +++ b/src/main/java/io/v/nutz/web/controllers/platform/sys/club/SysClubCon.java @@ -72,12 +72,16 @@ public class SysClubCon { @At @ViReturn public Object updateSf(String userid, Integer sf, String clubId) { - sysClubUserService.update(Chain.make("sf", sf), Cnd.where("userid", "=", userid)); - sysUserRoleService.clear(Cnd.where("userid", "=", userid).and("roleid", "=", Roles.CLUB_FZR)); - if (sf == 1 || sf == 3 || sf == 4 || sf == 5) { + sysClubUserService.update(Chain.make("sf", sf), Cnd.where("userid", "=", userid).and("clubid", "=", clubId)); + clearClubManageRole(userid, clubId); + if (sf == 1 || sf == 3 || sf == 4 || sf == 5 || sf == 6) { + String roleId = sf == 6 ? getClubJbrRoleId() : Roles.CLUB_FZR; + if (Strings.isBlank(roleId)) { + return Result.error("未找到协会经办人角色"); + } Sys_user_role sys_user_role = new Sys_user_role(); sys_user_role.setUserId(userid); - sys_user_role.setRoleId(Roles.CLUB_FZR); + sys_user_role.setRoleId(roleId); sys_user_role.setStid(clubId); sysUserRoleService.insert(sys_user_role); } @@ -248,7 +252,7 @@ public class SysClubCon { "\tLEFT JOIN sys_user u ON scu.userid = u.id\n" + "\tLEFT JOIN sys_unit unit ON u.unitid = unit.id\n" + "\tWHERE scu.clubid = @clubid and scu.status = 5\n" + - "\tORDER BY FIELD( scu.sf, 1, 3,4,5, 2 ),scu.join_time DESC").setParam("clubid", id))); + "\tORDER BY FIELD( scu.sf, 1, 3,4,5,6, 2 ),scu.join_time DESC").setParam("clubid", id))); record.set("files", baseService.dao().query("sys_file", Cnd.where("reid", "=", id))); return record; } @@ -284,6 +288,18 @@ public class SysClubCon { } } + private String getClubJbrRoleId() { + Sys_role role = sysRoleService.fetch(Cnd.where("code", "=", Roles.CLUB_JBR_CODE)); + return role == null ? "" : role.getId(); + } + + private void clearClubManageRole(String userId, String clubId) { + sysUserRoleService.clear(Cnd.where("userid", "=", userId) + .and("stid", "=", clubId) + .and(new Static("roleid IN (SELECT id FROM sys_role WHERE id = '" + Roles.CLUB_FZR + + "' OR code = '" + Roles.CLUB_JBR_CODE + "')"))); + } + @At @ViReturn public Object dissolve(String id, Boolean isjs) { diff --git a/src/main/java/io/v/nutz/web/controllers/platform/sys/club/SysClubUserCon.java b/src/main/java/io/v/nutz/web/controllers/platform/sys/club/SysClubUserCon.java index 9176c5e..05e3194 100644 --- a/src/main/java/io/v/nutz/web/controllers/platform/sys/club/SysClubUserCon.java +++ b/src/main/java/io/v/nutz/web/controllers/platform/sys/club/SysClubUserCon.java @@ -64,7 +64,13 @@ public class SysClubUserCon { if (ShiroUtil.hasAnyRoles(new String[]{"sysadmin", "A06"})) { return sysClubService.query(Cnd.where("isjs", "=", false).asc("create_time")); } - return sysClubService.query(Cnd.where("fzr", "=", ShiroUtil.getPrincipalProperty("id")).and("isjs", "=", false).asc("create_time")); + return sysClubService.query(Cnd.where("isjs", "=", false) + .and(new org.nutz.dao.util.cri.Static("(fzr = '" + ShiroUtil.getPrincipalProperty("id") + + "' OR id IN (SELECT stid FROM sys_user_role WHERE userid = '" + + ShiroUtil.getPrincipalProperty("id") + + "' AND roleid IN (SELECT id FROM sys_role WHERE id = '" + Roles.CLUB_FZR + + "' OR code = '" + Roles.CLUB_JBR_CODE + "')))")) + .asc("create_time")); } /** @@ -78,7 +84,7 @@ public class SysClubUserCon { if (Strings.isBlank(clubid)) { return new ArrayList<>(); } - String orderStr = " ORDER BY FIELD( sf, 1, 3,4,5, 2 ),scu.join_time DESC"; + String orderStr = " ORDER BY FIELD( sf, 1, 3,4,5,6, 2 ),scu.join_time DESC"; if (type == 2 && radioType == 2) { orderStr = " order by field(status, 1, 3, 5),scu.join_time DESC"; } else if (type == 3 && radioType == 2) { @@ -133,8 +139,10 @@ public class SysClubUserCon { public Object delUser(String clubid, String userid) { sysClubUserService.clear(Cnd.where("clubid", "=", clubid).and("userid", "=", userid)); //删除协会负责人的角色 - sysUserRoleService.clear(Cnd.NEW().and("userId", "=", ShiroUtil.getPrincipalProperty("id")) - .and("roleId", "=", Roles.CLUB_FZR).and("stid", "=", clubid)); + sysUserRoleService.clear(Cnd.NEW().and("userId", "=", userid) + .and("stid", "=", clubid) + .and(new org.nutz.dao.util.cri.Static("roleId IN (SELECT id FROM sys_role WHERE id = '" + Roles.CLUB_FZR + + "' OR code = '" + Roles.CLUB_JBR_CODE + "')"))); sysRoleService.clearCache(); sysUserService.clearCache(); return null; @@ -149,7 +157,31 @@ public class SysClubUserCon { "\tsys_user u\n" + "\tLEFT JOIN sys_unit unit ON u.unitid = unit.id\n" + "\tLEFT JOIN sys_union un ON unit.unionid = un.id\n" + - "\tWHERE (u.username LIKE @query or u.loginname like @query) and u.id not in (SELECT userid from sys_club_user WHERE clubid = @clubid) LIMIT 50").setParam("query", "%" + query + "%").setParam("clubid", clubid); + "\tWHERE (u.username LIKE @query or u.loginname like @query) and u.id not in (SELECT userid from sys_club_user WHERE clubid = @clubid and isNormal = true) LIMIT 50").setParam("query", "%" + query + "%").setParam("clubid", clubid); + return sysClubService.list(sql); + } + + /** + * 设置理事机构时,只允许从当前协会已通过的普通成员中选择,避免把协会外人员设为理事机构。 + */ + @At + @ViReturn + public Object queryClubMemberForManage(String clubid, String query) { + if (Strings.isBlank(clubid)) { + return new ArrayList<>(); + } + Sql sql = Sqls.create("SELECT\n" + + "\tu.id,u.username,unit.name as unitname,u.loginname \n" + + "FROM\n" + + "\tsys_club_user scu\n" + + "\tLEFT JOIN sys_user u ON scu.userid = u.id\n" + + "\tLEFT JOIN sys_unit unit ON u.unitid = unit.id\n" + + "\tWHERE scu.clubid = @clubid\n" + + "\tAND scu.isNormal = 1\n" + + "\tAND scu.status = 5\n" + + "\tAND scu.sf = 2\n" + + "\tAND (u.username LIKE @query or u.loginname like @query)\n" + + "\tLIMIT 50").setParam("query", "%" + query + "%").setParam("clubid", clubid); return sysClubService.list(sql); } @@ -160,13 +192,44 @@ public class SysClubUserCon { //type=1协会信息管理菜单,操作为录入理事机构,此时状态直接为通过5 //type=2社团录入菜单,操作为录入成员,此时需要校工会审核,状态为3 //type=3校工会录入菜单,操作为录入成员,此时状态直接为通过5 - int status = type == 1 || type == 3 ? 5 : 3; + int status = 5; for (String user : users) { + if (type != null && type == 1) { + Sys_club_user sysClubUser = sysClubUserService.fetch(Cnd.where("clubid", "=", clubid) + .and("userid", "=", user) + .and("isNormal", "=", true) + .and("status", "=", 5)); + if (sysClubUser == null) { + return cn.wizzer.framework.base.Result.error("只能从本协会已通过成员中设置理事机构"); + } + clearClubManageRole(user, clubid); + if (sf != 2) { + String roleId = sf == 6 ? getClubJbrRoleId() : Roles.CLUB_FZR; + if (Strings.isBlank(roleId)) { + return cn.wizzer.framework.base.Result.error("未找到协会经办人角色"); + } + Sys_user_role sys_user_role = new Sys_user_role(); + sys_user_role.setUserId(user); + sys_user_role.setRoleId(roleId); + sys_user_role.setStid(clubid); + sysUserRoleService.insert(sys_user_role); + sysUserService.clearCache(); + sysRoleService.clearCache(); + } + // 设置理事机构是调整本协会已有成员身份,不新增成员记录,避免出现重复协会成员。 + sysClubUserService.update(Chain.make("sf", sf), Cnd.where("id", "=", sysClubUser.getId())); + continue; + } + if (sf != 2) { + String roleId = sf == 6 ? getClubJbrRoleId() : Roles.CLUB_FZR; + if (Strings.isBlank(roleId)) { + return cn.wizzer.framework.base.Result.error("未找到协会经办人角色"); + } Sys_user_role sys_user_role = new Sys_user_role(); sys_user_role.setUserId(user); - sys_user_role.setRoleId(Roles.CLUB_FZR); + sys_user_role.setRoleId(roleId); sys_user_role.setStid(clubid); sysUserRoleService.insert(sys_user_role); sysUserService.clearCache(); @@ -180,9 +243,22 @@ public class SysClubUserCon { sys_club_user.setJoin_time(DateUtil.getDate()); sys_club_user.setSf(sf); sys_club_user.setStatus(status); + sys_club_user.setIsNormal(true); sysClubUserService.insert(sys_club_user); } return null; } + + private String getClubJbrRoleId() { + io.v.nutz.sys.models.Sys_role role = sysRoleService.fetch(Cnd.where("code", "=", Roles.CLUB_JBR_CODE)); + return role == null ? "" : role.getId(); + } + + private void clearClubManageRole(String userid, String clubid) { + sysUserRoleService.clear(Cnd.NEW().and("userId", "=", userid) + .and("stid", "=", clubid) + .and(new org.nutz.dao.util.cri.Static("roleId IN (SELECT id FROM sys_role WHERE id = '" + Roles.CLUB_FZR + + "' OR code = '" + Roles.CLUB_JBR_CODE + "')"))); + } } diff --git a/src/main/java/io/v/nutz/web/controllers/platform/sys/club/SysClubUserShCon.java b/src/main/java/io/v/nutz/web/controllers/platform/sys/club/SysClubUserShCon.java index 91d4563..811ba2f 100644 --- a/src/main/java/io/v/nutz/web/controllers/platform/sys/club/SysClubUserShCon.java +++ b/src/main/java/io/v/nutz/web/controllers/platform/sys/club/SysClubUserShCon.java @@ -121,13 +121,11 @@ public class SysClubUserShCon { cnd.and("sf", "=", 2); cnd.and("isNormal", "=", true); - cnd.andEX("scu.clubid", "=", clubid); + cnd.andEX("scu.clubid", "=", clubid); if (!ShiroUtil.hasAnyRoles(new String[]{"sysadmin", "A06"})) { - if (ShiroUtil.hasAnyRoles("club01, club02, club03, club04, H02")) { - cnd.and(new Static(""" - scu.clubid IN ( SELECT stid FROM sys_user_role WHERE roleid = '%s' AND userid = '%s' AND stid IS NOT NULL ) - """.formatted(Roles.CLUB_FZR, ShiroUtil.getPrincipalProperty("id")))); + if (ShiroUtil.hasAnyRoles("club01, club02, club03, club04, H02, xhjbr")) { + cnd.and(new Static(getClubAuditRoleCnd("scu.clubid"))); } } @@ -205,7 +203,7 @@ public class SysClubUserShCon { cnd.and("isjs", "=", false); if (!ShiroUtil.hasAnyRoles(new String[]{"sysadmin", "A06"})) { - cnd.and("club.fzr", "=", ShiroUtil.getPrincipalProperty("id")); + cnd.and(new Static("(club.fzr = '" + ShiroUtil.getPrincipalProperty("id") + "' OR " + getClubAuditRoleCnd("club.id") + ")")); } if (StrUtil.isNotBlank(clubType)) { cnd.and("club.type", "=", clubType); @@ -263,10 +261,8 @@ public class SysClubUserShCon { cnd.andEX("scu.clubid", "=", id); if (!ShiroUtil.hasAnyRoles(new String[]{"sysadmin", "A06"})) { - if (ShiroUtil.hasRole("H02")) { - cnd.and(new Static(""" - scu.clubid IN ( SELECT stid FROM sys_user_role WHERE roleid = '%s' AND userid = '%s' AND stid IS NOT NULL ) - """.formatted(Roles.CLUB_FZR, ShiroUtil.getPrincipalProperty("id")))); + if (ShiroUtil.hasAnyRoles("H02, xhjbr, club01, club02, club03, club04")) { + cnd.and(new Static(getClubAuditRoleCnd("scu.clubid"))); } } sql.setCondition(cnd); @@ -289,4 +285,11 @@ public class SysClubUserShCon { } return list; } + + private String getClubAuditRoleCnd(String clubIdColumn) { + return clubIdColumn + " IN ( SELECT stid FROM sys_user_role WHERE userid = '" + + ShiroUtil.getPrincipalProperty("id") + + "' AND stid IS NOT NULL AND roleid IN (SELECT id FROM sys_role WHERE id = '" + + Roles.CLUB_FZR + "' OR code = '" + Roles.CLUB_JBR_CODE + "') )"; + } } diff --git a/src/main/resources/views/platform/sys/club/clubIn.html b/src/main/resources/views/platform/sys/club/clubIn.html index 2636d76..ca18e4a 100644 --- a/src/main/resources/views/platform/sys/club/clubIn.html +++ b/src/main/resources/views/platform/sys/club/clubIn.html @@ -121,6 +121,9 @@ layout("/layouts/platform.html"){ 创建协会 <!–#}#–> --> +
+ 导入成员 +
@@ -646,6 +649,57 @@ layout("/layouts/platform.html"){ + + + + + 下载模板 + + + + + + + + 选择文件 + +
+ 只能上传 xls/xlsx 文件 +
+
+
+
+ + +
+ 本次导入共 {{importResult.totalCount}} 条,成功 {{importResult.successCount}} 条,失败 {{importResult.errorCount}} 条 +
+
+ 下载错误信息表格 +
+
+
+
+ + + 取 消 + 确 定 + +
+ \ No newline at end of file +#--> diff --git a/src/main/resources/views/platform/sys/club/clubMange.html b/src/main/resources/views/platform/sys/club/clubMange.html index 88b44a6..778c325 100644 --- a/src/main/resources/views/platform/sys/club/clubMange.html +++ b/src/main/resources/views/platform/sys/club/clubMange.html @@ -292,6 +292,7 @@ layout("/layouts/platform.html"){ 副会长 秘书长 副秘书长 + 协会经办人 @@ -325,6 +326,10 @@ layout("/layouts/platform.html"){ @click.native="updateSf(row,5)" class="text-primary">设置副秘书长 + 设置协会经办人 + 删除 @@ -567,6 +572,7 @@ layout("/layouts/platform.html"){ 副会长 秘书长 副秘书长 + 协会经办人 副会长 秘书长 副秘书长 + 协会经办人 @@ -791,7 +798,7 @@ layout("/layouts/platform.html"){ }); }, async userQueryUser(clubid, query) { - const {data} = await $.get("/platform/sys/club/users/queryUser", {clubid, query}) + const {data} = await $.get("/platform/sys/club/users/queryClubMemberForManage", {clubid, query}) return data }, async userUserRemoteMethod(query) { @@ -1258,4 +1265,4 @@ layout("/layouts/platform.html"){ \ No newline at end of file +#-->