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