This commit is contained in:
2026-04-03 10:32:14 +08:00
parent 18236d8d1f
commit 765c715d28
37 changed files with 914 additions and 227 deletions
@@ -53,6 +53,8 @@ import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
@@ -67,6 +69,9 @@ import java.util.stream.Collectors;
@Slf4j
public class ActivityBasicScopeController {
private static final int GROUP_TYPE_RESULT = 1;
private static final int GROUP_TYPE_SQL = 2;
@Inject
private BaseService baseService;
@@ -135,51 +140,18 @@ public class ActivityBasicScopeController {
@SLog(tag = "活动人员设置", msg = "设置活动人员")
@SaCheckPermission("activity.basic.scope")
public Object doSetActivityUser(@Param("data") ActivityUserScopePageParam activityUserScopePageParam) {
Sql sql = Sqls.create("""
SELECT DISTINCT
( u.id ) AS userId
FROM
`vw_user` u
LEFT JOIN sys_user_role sur ON sur.userid = u.id
LEFT JOIN club_user clubuser ON clubuser.userid=u.id
$condition
""");
Cnd cnd = getCnd(activityUserScopePageParam);
sql.setCondition(cnd);
sql.setCallback(Sqls.callback.entities());
sql.setEntity(dao.getEntity(ActivityUserScope.class));
dao.execute(sql);
List<ActivityUserScope> list = sql.getList(ActivityUserScope.class);
String groupName = null;
int maxCount = 0;
if (activityUserScopePageParam.getSetGroupType() == 1) {
groupName = dao.execute(Sqls.fetchString("select groupName from activity_user_scope where groupId = @groupId").setParam("groupId", activityUserScopePageParam.getSetGroupId())).getString();
} else if (activityUserScopePageParam.getSetGroupType() == 2) {
maxCount = baseService.count(Sqls.create("select max(groupId) from activity_user_scope"));
Integer groupType = normalizeGroupType(activityUserScopePageParam.getGroupType());
if (activityUserScopePageParam.getSetGroupType() == null) {
return Result.error("请选择添加方式");
}
if (groupType == null) {
return Result.error("请选择分组保存方式");
}
for (ActivityUserScope userScope : list) {
if (activityUserScopePageParam.getSetGroupType() == 1) {
userScope.setGroupId(activityUserScopePageParam.getSetGroupId());
userScope.setGroupName(groupName);
} else if (activityUserScopePageParam.getSetGroupType() == 2) {
userScope.setGroupId(maxCount + 1);
userScope.setGroupName(activityUserScopePageParam.getSetGroupName());
}
userScope.setCreator(SecurityUtil.getUserId());
if (GROUP_TYPE_SQL == groupType) {
return saveSqlScopeGroup(activityUserScopePageParam);
}
if (list.size() < 500) {
dao.insert(list);
return Result.success(activityUserScopePageParam.getSetGroupType() == 1 ? activityUserScopePageParam.getSetGroupId() : maxCount + 1);
}
//多线程插入
activityBasicScopeService.largeDataInsert(list);
return Result.success(activityUserScopePageParam.getSetGroupType() == 1 ? activityUserScopePageParam.getSetGroupId() : maxCount + 1);
return saveResultScopeGroup(activityUserScopePageParam);
}
/**
@@ -192,7 +164,8 @@ public class ActivityBasicScopeController {
Sql sql = Sqls.create("""
SELECT
groupId,
groupName
groupName,
IFNULL(MAX(groupType), 1) AS groupType
FROM
activity_user_scope
$condition
@@ -208,7 +181,7 @@ public class ActivityBasicScopeController {
}
cnd.and("groupId", "IS NOT", null);
cnd.and("groupName", "IS NOT", null);
cnd.groupBy("groupId");
cnd.groupBy("groupId,groupName");
sql.setCondition(cnd);
return Result.success(baseService.listMap(sql));
}
@@ -222,8 +195,7 @@ public class ActivityBasicScopeController {
@At
public Object getScopeUser(String activityGroupId, @Param(value = "userId") String userId) {
String userid = StrUtil.isNotBlank(userId) ? userId : SecurityUtil.getUserId();
int count = dao.count(ActivityUserScope.class, Cnd.where("groupId", "=", activityGroupId).and("userId", "=", userid));
return Result.success(count);
return Result.success(activityBasicScopeService.isUserInGroup(Integer.valueOf(activityGroupId), userid) ? 1 : 0);
}
@At
@@ -340,7 +312,7 @@ public class ActivityBasicScopeController {
}
if (activityUserScopePageParam.getActivityGroupId() != null) {
Sql sqlx = Sqls.createf("SELECT userId FROM activity_user_scope where groupId = '%s'", activityUserScopePageParam.getActivityGroupId());
Sql sqlx = activityBasicScopeService.buildGroupUserIdSubSql(activityUserScopePageParam.getActivityGroupId());
cnd.and("u.id", activityUserScopePageParam.getReverseSelection() ? "IN" : "NOT IN", sqlx);
}
@@ -395,6 +367,271 @@ public class ActivityBasicScopeController {
}
/**
* 结果分组会把当前筛选出的用户快照保存下来,因此只落 userId 明细数据。
*/
private Result saveResultScopeGroup(ActivityUserScopePageParam activityUserScopePageParam) {
List<ActivityUserScope> matchedUserScopeList = queryMatchedUserScopeList(activityUserScopePageParam);
String creator = SecurityUtil.getUserId();
Integer groupId;
String groupName;
if (activityUserScopePageParam.getSetGroupType() == 1) {
if (activityUserScopePageParam.getSetGroupId() == null) {
return Result.error("请选择原有分组");
}
ActivityUserScope groupMeta = getGroupBaseInfo(activityUserScopePageParam.getSetGroupId());
if (groupMeta == null) {
return Result.error("未查询到原有分组");
}
if (!Objects.equals(normalizeGroupType(groupMeta.getGroupType()), GROUP_TYPE_RESULT)) {
return Result.error("结果分组只能添加到结果分组中");
}
groupId = groupMeta.getGroupId();
groupName = groupMeta.getGroupName();
} else {
if (StrUtil.isBlank(activityUserScopePageParam.getSetGroupName())) {
return Result.error("请输入新分组名称");
}
groupId = getNextGroupId();
groupName = activityUserScopePageParam.getSetGroupName();
}
Set<String> existsUserIdSet = dao.query(ActivityUserScope.class, Cnd.where("groupId", "=", groupId).and("userId", "IS NOT", null))
.stream()
.map(ActivityUserScope::getUserId)
.filter(StrUtil::isNotBlank)
.collect(Collectors.toSet());
List<ActivityUserScope> insertList = matchedUserScopeList.stream()
.filter(item -> StrUtil.isNotBlank(item.getUserId()) && !existsUserIdSet.contains(item.getUserId()))
.peek(item -> {
item.setGroupId(groupId);
item.setGroupName(groupName);
item.setGroupType(GROUP_TYPE_RESULT);
item.setGroupSql(null);
item.setCreator(creator);
})
.toList();
if (insertList.isEmpty()) {
return Result.success(groupId);
}
if (insertList.size() < 500) {
dao.insert(insertList);
} else {
activityBasicScopeService.largeDataInsert(insertList);
}
return Result.success(groupId);
}
/**
* SQL条件分组在 activity_user_scope 中只保存一条元数据记录。
* 后续所有按分组取人的地方统一通过 groupSql 动态解析,不再额外落 userId 快照。
*/
private Result saveSqlScopeGroup(ActivityUserScopePageParam activityUserScopePageParam) {
String currentGroupSql = buildGroupSql(activityUserScopePageParam);
if (StrUtil.isBlank(currentGroupSql)) {
return Result.error("未生成有效的SQL条件");
}
Integer groupId;
String groupName;
String creator = SecurityUtil.getUserId();
String mergedGroupSql = currentGroupSql;
if (activityUserScopePageParam.getSetGroupType() == 1) {
if (activityUserScopePageParam.getSetGroupId() == null) {
return Result.error("请选择原有分组");
}
ActivityUserScope groupMeta = getGroupBaseInfo(activityUserScopePageParam.getSetGroupId());
if (groupMeta == null) {
return Result.error("未查询到原有分组");
}
if (!Objects.equals(normalizeGroupType(groupMeta.getGroupType()), GROUP_TYPE_SQL)) {
return Result.error("SQL条件分组只能添加到SQL条件分组中");
}
groupId = groupMeta.getGroupId();
groupName = groupMeta.getGroupName();
creator = StrUtil.isNotBlank(groupMeta.getCreator()) ? groupMeta.getCreator() : creator;
if (StrUtil.isNotBlank(groupMeta.getGroupSql())) {
mergedGroupSql = "(" + groupMeta.getGroupSql() + ") OR (" + currentGroupSql + ")";
}
dao.clear(ActivityUserScope.class, Cnd.where("groupId", "=", groupId));
} else {
if (StrUtil.isBlank(activityUserScopePageParam.getSetGroupName())) {
return Result.error("请输入新分组名称");
}
groupId = getNextGroupId();
groupName = activityUserScopePageParam.getSetGroupName();
}
ActivityUserScope groupSqlMeta = new ActivityUserScope();
groupSqlMeta.setGroupId(groupId);
groupSqlMeta.setGroupName(groupName);
groupSqlMeta.setGroupType(GROUP_TYPE_SQL);
groupSqlMeta.setGroupSql(mergedGroupSql);
groupSqlMeta.setCreator(creator);
dao.insert(groupSqlMeta);
return Result.success(groupId);
}
private List<ActivityUserScope> queryMatchedUserScopeList(ActivityUserScopePageParam activityUserScopePageParam) {
Sql sql = Sqls.create("""
SELECT DISTINCT
( u.id ) AS userId
FROM
`vw_user` u
LEFT JOIN sys_user_role sur ON sur.userid = u.id
LEFT JOIN club_user clubuser ON clubuser.userid=u.id
$condition
""");
Cnd cnd = getCnd(activityUserScopePageParam);
sql.setCondition(cnd);
sql.setCallback(Sqls.callback.entities());
sql.setEntity(dao.getEntity(ActivityUserScope.class));
dao.execute(sql);
return sql.getList(ActivityUserScope.class);
}
private ActivityUserScope getGroupBaseInfo(Integer groupId) {
if (groupId == null) {
return null;
}
Sql sql = Sqls.create("""
SELECT
groupId,
groupName,
creator,
IFNULL(MAX(groupType), 1) AS groupType,
MAX(groupSql) AS groupSql
FROM activity_user_scope
WHERE groupId = @groupId
GROUP BY groupId, groupName, creator
LIMIT 1
""");
sql.setParam("groupId", groupId);
ActivityUserScope o = activityBasicScopeService.fetchVO(sql, ActivityUserScope.class);
return o;
}
private Integer getNextGroupId() {
Integer maxGroupId = baseService.count(Sqls.create("select max(groupId) from activity_user_scope"));
return maxGroupId == null ? 1 : maxGroupId + 1;
}
private Integer normalizeGroupType(Integer groupType) {
return groupType == null ? GROUP_TYPE_RESULT : groupType;
}
/**
* 把页面条件转换成可复用的 SQL 片段,后续同类分组追加时直接按 OR 拼接。
*/
private String buildGroupSql(ActivityUserScopePageParam activityUserScopePageParam) {
List<String> conditionList = new ArrayList<>();
boolean reverseSelection = Boolean.TRUE.equals(activityUserScopePageParam.getReverseSelection());
String inOrNotIn = reverseSelection ? "NOT IN" : "IN";
String eqOrNeq = reverseSelection ? "!=" : "=";
if (activityUserScopePageParam.getActivityGroupId() != null) {
conditionList.add("u.id " + (reverseSelection ? "IN" : "NOT IN") +
" (" + activityBasicScopeService.buildGroupUserIdSubSqlText(activityUserScopePageParam.getActivityGroupId()) + ")");
}
if (Lang.isNotEmpty(activityUserScopePageParam.getUserId())) {
conditionList.add("u.id " + inOrNotIn + " (" + buildSqlStringList(activityUserScopePageParam.getUserId()) + ")");
}
if (Lang.isNotEmpty(activityUserScopePageParam.getMemberTypes())) {
if (ArrayUtils.contains(activityUserScopePageParam.getMemberTypes(), "工会会员")) {
conditionList.add("u.member " + eqOrNeq + " 1");
}
if (ArrayUtils.contains(activityUserScopePageParam.getMemberTypes(), "福利会员")) {
conditionList.add("u.welfareMember " + eqOrNeq + " 1");
}
if (ArrayUtils.contains(activityUserScopePageParam.getMemberTypes(), "基金会员")) {
conditionList.add("u.loginname " + inOrNotIn + " (select loginname from sick_fund_member)");
}
}
if (!Lang.isEmptyArray(activityUserScopePageParam.getAge()) && activityUserScopePageParam.getAge().length >= 2
&& !"0".equals(activityUserScopePageParam.getAge()[1])) {
String ageBetweenSql = "TIMESTAMPDIFF(YEAR, u.birthday, CURDATE()) BETWEEN "
+ sanitizeNumber(activityUserScopePageParam.getAge()[0]) + " AND " + sanitizeNumber(activityUserScopePageParam.getAge()[1]);
conditionList.add(reverseSelection ? "NOT (" + ageBetweenSql + ")" : ageBetweenSql);
}
if (StrUtil.isNotBlank(activityUserScopePageParam.getExistsLoginNameRedisKey())) {
List<String> loginNames = redisService.lrange(activityUserScopePageParam.getExistsLoginNameRedisKey(), 0, -1);
if (Lang.isEmpty(loginNames)) {
conditionList.add("1 = 0");
} else {
conditionList.add("u.loginname IN (" + buildSqlStringList(loginNames.toArray(new String[0])) + ")");
}
}
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
conditionList.add("u.unionid = " + wrapSqlValue(SecurityUtil.getUnionId()));
}
addSingleValueCondition(conditionList, "u.unionid", eqOrNeq, activityUserScopePageParam.getUnionId());
addSingleValueCondition(conditionList, "u.unitid", eqOrNeq, activityUserScopePageParam.getUnitId());
addArrayCondition(conditionList, "u.personType", inOrNotIn, activityUserScopePageParam.getPersonTypes());
addArrayCondition(conditionList, "u.userState", inOrNotIn, activityUserScopePageParam.getUserStates());
addArrayCondition(conditionList, "u.sex", inOrNotIn, activityUserScopePageParam.getSexTypes());
addSingleValueCondition(conditionList, "sur.tcSessionId", eqOrNeq, activityUserScopePageParam.getSessionId());
addArrayCondition(conditionList, "sur.roleId", inOrNotIn, activityUserScopePageParam.getRoleIds());
addSingleValueCondition(conditionList, "clubuser.clubid", eqOrNeq, activityUserScopePageParam.getClubId());
return conditionList.isEmpty() ? "1 = 1" : String.join(" AND ", conditionList);
}
private List<String> queryUserIdListByGroupSql(String groupSql) {
Sql sql = Sqls.create("""
SELECT DISTINCT
u.id AS userId
FROM
`vw_user` u
LEFT JOIN sys_user_role sur ON sur.userid = u.id
LEFT JOIN club_user clubuser ON clubuser.userid = u.id
WHERE
""" + groupSql);
sql.setCallback(Sqls.callback.maps());
dao.execute(sql);
return sql.getList(NutMap.class).stream()
.map(item -> item.getString("userId"))
.filter(StrUtil::isNotBlank)
.collect(Collectors.toList());
}
private void addSingleValueCondition(List<String> conditionList, String columnName, String operator, String value) {
if (StrUtil.isNotBlank(value)) {
conditionList.add(columnName + " " + operator + " " + wrapSqlValue(value));
}
}
private void addArrayCondition(List<String> conditionList, String columnName, String operator, String[] values) {
if (Lang.isNotEmpty(values)) {
conditionList.add(columnName + " " + operator + " (" + buildSqlStringList(values) + ")");
}
}
private String buildSqlStringList(String[] values) {
return buildSqlStringList(List.of(values));
}
private String buildSqlStringList(List<String> values) {
return values.stream().filter(StrUtil::isNotBlank).map(this::wrapSqlValue).collect(Collectors.joining(","));
}
private String wrapSqlValue(String value) {
return "'" + StrUtil.replace(value, "'", "''") + "'";
}
private String sanitizeNumber(String value) {
return StrUtil.replace(value, "'", "");
}
@At
@Ok("void")
@@ -19,6 +19,7 @@ import com.budwk.app.base.utils.CommonDownloadUtil;
import com.budwk.app.base.utils.easyexcel.EasyExcelUtil;
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.activity.basic.template.UserTemp;
import io.swagger.annotations.ApiOperation;
import org.apache.poi.ss.formula.functions.T;
@@ -28,7 +29,6 @@ import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.dao.util.cri.Static;
import org.nutz.integration.jedis.RedisService;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
@@ -59,9 +59,14 @@ import java.util.stream.Collectors;
@Ok("json:full")
public class ActivityBasicScopeUserDataController {
private static final int GROUP_TYPE_SQL = 2;
@Inject
private BaseService baseService;
@Inject
private ActivityBasicScopeService activityBasicScopeService;
@Inject
private RedisService redisService;
@@ -81,9 +86,10 @@ public class ActivityBasicScopeUserDataController {
@Param(value = "userState") String userState,
@Param(value = "groupId") Integer groupId,
@Param(value = "existsLoginNameRedisKey") String existsLoginNameRedisKey) {
ActivityUserScope groupInfo = activityBasicScopeService.getGroupInfo(groupId);
Sql sql = Sqls.create("""
SELECT
aus.id,
u.id,
u.username AS userName,
u.loginname AS loginName,
u.sex,
@@ -93,15 +99,15 @@ public class ActivityBasicScopeUserDataController {
u.userState,
u.unitname AS unitName,
u.unionname AS unionName,
aus.groupId,
aus.groupName
@groupId AS groupId,
@groupName AS groupName
FROM
activity_user_scope aus
LEFT JOIN `vw_user` u ON u.id = aus.userId
`vw_user` u
$condition
""");
""").setParam("groupId", groupId).setParam("groupName", groupInfo == null ? "" : groupInfo.getGroupName());
Cnd cnd = Cnd.NEW();
cnd.and("u.id", "in", activityBasicScopeService.buildGroupUserIdSubSql(groupId));
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())){
SqlExpressionGroup group = new SqlExpressionGroup();
group.orLike("u.username", pageForm.getSearchKeyword());
@@ -111,15 +117,10 @@ public class ActivityBasicScopeUserDataController {
if (StrUtil.isNotBlank(pageForm.getPageOrderName()) && StrUtil.isNotBlank(pageForm.getPageOrderBy())) {
cnd.orderBy(pageForm.getPageOrderName(), pageForm.getPageOrderBy().equalsIgnoreCase("ascending") ? "ASC" : "DESC");
}
cnd.andEX("aus.groupId", "=", groupId);
cnd.andEX("u.unionid", "=", unionId);
cnd.andEX("u.unitid", "=", unitId);
cnd.andEX("u.personType", "=", personType);
cnd.andEX("u.userState", "=", userState);
if (!StpUtil.hasRole(RoleConstant.SYSADMIN.name()) &&
!StpUtil.hasRole(RoleConstant.SCHOOL_UNION_ADMIN.name())) {
cnd.and("aus.creator", "=", SecurityUtil.getUserId());
}
if (StrUtil.isNotBlank(existsLoginNameRedisKey)) {
List<String> loginNames = redisService.lrange(existsLoginNameRedisKey, 0, -1);
cnd.andEX("u.loginname", "in", loginNames);
@@ -159,32 +160,25 @@ public class ActivityBasicScopeUserDataController {
}
}
Sql sql = Sqls.create("select id from `vw_user` u $condition");
Cnd userCnd = Cnd.NEW();
if (StrUtil.isNotBlank(searchName) && StrUtil.isNotBlank(searchKeyword)) {
userCnd.and(Cnd.likeEX(searchName, searchKeyword));
List<String> targetUserIds = queryGroupUserIds(groupId, id, searchKeyword, searchName, unionId, unitId, personType, userState, existsLoginNames);
if (Lang.isEmpty(targetUserIds)) {
return Result.success();
}
userCnd.andEX("u.unionid", "=", unionId);
userCnd.andEX("u.unitid", "=", unitId);
userCnd.andEX("u.personType", "=", personType);
userCnd.andEX("u.userState", "=", userState);
userCnd.andEX("u.id", "=", id);
userCnd.andEX("u.loginname","in",existsLoginNames);
sql.setCondition(userCnd);
Cnd cnd = Cnd.NEW();
cnd.and("groupId", "=", groupId);
if (!StpUtil.hasRole(RoleConstant.SYSADMIN.name()) &&
!StpUtil.hasRole(RoleConstant.SCHOOL_UNION_ADMIN.name())) {
cnd.and("creator", "=", SecurityUtil.getUserId());
}
if (StrUtil.isNotBlank(id)) {
cnd.and("id", "=", id);
Integer groupType = activityBasicScopeService.getGroupType(groupId);
if (GROUP_TYPE_SQL == groupType) {
// SQL分组不落 userId 明细,删除人员时通过追加排除条件来持久化删除结果。
activityBasicScopeService.excludeUsersFromSqlGroup(groupId, targetUserIds);
} else {
cnd.and(new Static("userId in (" + sql + ")"));
Cnd cnd = Cnd.where("groupId", "=", groupId).and("userId", "in", targetUserIds);
cnd.and("userId", "IS NOT", null);
if (!StpUtil.hasRole(RoleConstant.SYSADMIN.name()) &&
!StpUtil.hasRole(RoleConstant.SCHOOL_UNION_ADMIN.name())) {
cnd.and("creator", "=", SecurityUtil.getUserId());
}
baseService.dao().clear(ActivityUserScope.class, cnd);
}
baseService.dao().clear(ActivityUserScope.class, cnd);
baseService.dao().clear(ActivityUserScope.class, Cnd.where(ActivityUserScope::getUserId, "not in", Sqls.create("select id from sys_user")));
baseService.dao().clear(ActivityUserScope.class, Cnd.where("userId", "IS NOT", null).and("userId", "not in", Sqls.create("select id from sys_user")));
return Result.success();
}
@@ -202,11 +196,12 @@ public class ActivityBasicScopeUserDataController {
SELECT
u.loginname
FROM
activity_user_scope aus
LEFT JOIN sys_user u ON u.id = aus.userId
sys_user u
WHERE
aus.groupId = @groupId
""").setParam("groupId", groupId);
u.id IN (
""" + activityBasicScopeService.buildGroupUserIdSubSqlText(Integer.valueOf(groupId)) + """
)
""");
baseService.execute(sql);
String[] sysLoginNames = (String[]) sql.getResult();
@@ -259,13 +254,12 @@ public class ActivityBasicScopeUserDataController {
u.unitname AS unitName,
u.unionName AS unionName
FROM
activity_user_scope aus
LEFT JOIN `vw_user` u ON u.id = aus.userId
`vw_user` u
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("aus.groupId", "=", groupId);
cnd.and("u.id", "in", activityBasicScopeService.buildGroupUserIdSubSql(groupId));
sql.setCondition(cnd);
List<NutMap> listMap = baseService.listMap(sql);
@@ -286,4 +280,34 @@ public class ActivityBasicScopeUserDataController {
}
}
/**
* 删除时需要先按页面当前筛选条件圈定目标人员,再根据分组类型删除对应存储表中的快照数据。
*/
private List<String> queryGroupUserIds(Integer groupId, String id, String searchKeyword, String searchName,
String unionId, String unitId, String personType, String userState,
List<String> existsLoginNames) {
Sql sql = Sqls.queryString("""
SELECT
u.id
FROM
`vw_user` u
$condition
""");
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));
}
cnd.andEX("u.unionid", "=", unionId);
cnd.andEX("u.unitid", "=", unitId);
cnd.andEX("u.personType", "=", personType);
cnd.andEX("u.userState", "=", userState);
cnd.andEX("u.id", "=", id);
cnd.andEX("u.loginname", "in", existsLoginNames);
sql.setCondition(cnd);
baseService.execute(sql);
String[] userIds = (String[]) sql.getResult();
return userIds == null ? new ArrayList<>() : List.of(userIds);
}
}
@@ -46,6 +46,16 @@ public class ActivityUserScope extends BaseModel implements Serializable {
@Comment("userid")
private String userId;
@Column
@ColDefine(type = ColType.INT, width = 2)
@Comment("分组类型 1.结果分组 2.SQL条件分组")
private Integer groupType;
@Column
@ColDefine(customType = "longtext")
@Comment("SQL条件分组保存的查询SQL")
private String groupSql;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("创建人")
@@ -32,6 +32,10 @@ public class ActivityUserScopePageParam extends PageForm {
private Integer setGroupType;
private Integer setGroupId;
private String setGroupName;
/**
* 分组保存方式 1.结果分组 2.SQL条件分组
*/
private Integer groupType;
// 教师会议id
private String sessionId;
// 角色id
@@ -21,4 +21,49 @@ public interface ActivityBasicScopeService extends BaseService<ActivityUserScope
*/
void largeDataInsert(List<ActivityUserScope> list) ;
/**
* 查询分组基础信息。
* SQL条件分组与结果分组都只从同一张 activity_user_scope 表读取。
*/
ActivityUserScope getGroupInfo(Integer groupId);
/**
* 查询分组类型,未配置时默认按结果分组处理。
*/
Integer getGroupType(Integer groupId);
/**
* 构造分组对应的人员ID子查询。
* 结果分组直接取 activity_user_scope.userIdSQL条件分组则按保存的 groupSql 动态生成查询。
*/
Sql buildGroupUserIdSubSql(Integer groupId);
/**
* 构造可直接拼接到业务SQL中的人员ID子查询文本。
* 仅用于已有大量原生SQL场景,避免每个模块重复拼接 groupSql 逻辑。
*/
String buildGroupUserIdSubSqlText(Integer groupId);
/**
* 查询分组当前命中的人员ID列表。
*/
List<String> listGroupUserIds(Integer groupId);
/**
* 判断指定用户是否在某个分组内。
* SQL条件分组会按保存的 groupSql 动态校验,而不是依赖落库的 userId 明细。
*/
boolean isUserInGroup(Integer groupId, String userId);
/**
* 批量过滤出当前用户可见的分组ID。
* 用于列表页先查活动、再按活动分组做二次权限过滤的场景。
*/
List<Integer> filterGroupIdsByUser(List<Integer> groupIds, String userId);
/**
* SQL条件分组删除人员时,不再删除主表记录,而是把排除条件追加到已保存的 groupSql 中。
*/
void excludeUsersFromSqlGroup(Integer groupId, List<String> userIds);
}
@@ -1,6 +1,7 @@
package com.budwk.app.zhgh.activity.basic.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.base.utils.DateUtil;
import com.budwk.app.zhgh.activity.basic.models.ActivityUserScope;
@@ -10,15 +11,18 @@ import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.impl.NutTxDao;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.Sqls;
import org.nutz.ioc.loader.annotation.IocBean;
import java.util.ArrayList;
import java.util.List;
import java.util.LinkedHashSet;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/**
* @author zxy
@@ -29,6 +33,7 @@ import java.util.concurrent.atomic.AtomicInteger;
@Slf4j
public class ActivityBasicScopeServiceImpl extends BaseServiceImpl<ActivityUserScope> implements ActivityBasicScopeService {
private static final int GROUP_TYPE_RESULT = 1;
public ActivityBasicScopeServiceImpl(Dao dao) {
super(dao);
@@ -80,4 +85,122 @@ public class ActivityBasicScopeServiceImpl extends BaseServiceImpl<ActivityUserS
}
log.info("结束时间" + DateUtil.getDateTime());
}
@Override
public ActivityUserScope getGroupInfo(Integer groupId) {
if (groupId == null) {
return null;
}
List<ActivityUserScope> list = dao().query(ActivityUserScope.class, Cnd.where("groupId", "=", groupId).desc("id"));
return CollectionUtil.isEmpty(list) ? null : list.get(0);
}
@Override
public Integer getGroupType(Integer groupId) {
ActivityUserScope userScope = getGroupInfo(groupId);
if (userScope == null || userScope.getGroupType() == null) {
return GROUP_TYPE_RESULT;
}
return userScope.getGroupType();
}
@Override
public Sql buildGroupUserIdSubSql(Integer groupId) {
return Sqls.create(buildGroupUserIdSubSqlText(groupId));
}
@Override
public String buildGroupUserIdSubSqlText(Integer groupId) {
ActivityUserScope groupInfo = getGroupInfo(groupId);
if (groupInfo == null) {
return "SELECT NULL AS userId WHERE 1 = 0";
}
if (GROUP_TYPE_RESULT == getGroupType(groupId)) {
return "SELECT userId FROM activity_user_scope WHERE groupId = " + groupId + " AND userId IS NOT NULL";
}
if (StrUtil.isBlank(groupInfo.getGroupSql())) {
return "SELECT NULL AS userId WHERE 1 = 0";
}
return """
SELECT DISTINCT
u.id AS userId
FROM
`vw_user` u
LEFT JOIN sys_user_role sur ON sur.userid = u.id
LEFT JOIN club_user clubuser ON clubuser.userid = u.id
WHERE
""" + groupInfo.getGroupSql();
}
@Override
public List<String> listGroupUserIds(Integer groupId) {
Sql sql = Sqls.queryString(buildGroupUserIdSubSqlText(groupId));
dao().execute(sql);
String[] userIds = (String[]) sql.getResult();
return userIds == null ? new ArrayList<>() : List.of(userIds);
}
@Override
public boolean isUserInGroup(Integer groupId, String userId) {
if (groupId == null || StrUtil.isBlank(userId)) {
return false;
}
if (GROUP_TYPE_RESULT == getGroupType(groupId)) {
return dao().count(ActivityUserScope.class, Cnd.where("groupId", "=", groupId).and("userId", "=", userId)) > 0;
}
ActivityUserScope groupInfo = getGroupInfo(groupId);
if (groupInfo == null || StrUtil.isBlank(groupInfo.getGroupSql())) {
return false;
}
Sql sql = Sqls.create("""
SELECT
COUNT(1)
FROM
`vw_user` u
LEFT JOIN sys_user_role sur ON sur.userid = u.id
LEFT JOIN club_user clubuser ON clubuser.userid = u.id
WHERE
u.id = @userId
AND
""" + "(" + groupInfo.getGroupSql() + ")");
sql.setParam("userId", userId);
return count(sql) > 0;
}
@Override
public List<Integer> filterGroupIdsByUser(List<Integer> groupIds, String userId) {
LinkedHashSet<Integer> result = new LinkedHashSet<>();
if (CollectionUtil.isEmpty(groupIds) || StrUtil.isBlank(userId)) {
return new ArrayList<>(result);
}
groupIds.stream()
.filter(groupId -> groupId != null)
.distinct()
.forEach(groupId -> {
if (isUserInGroup(groupId, userId)) {
result.add(groupId);
}
});
return new ArrayList<>(result);
}
@Override
public void excludeUsersFromSqlGroup(Integer groupId, List<String> userIds) {
ActivityUserScope groupInfo = getGroupInfo(groupId);
if (groupInfo == null || getGroupType(groupId) != 2 || CollectionUtil.isEmpty(userIds) || StrUtil.isBlank(groupInfo.getGroupSql())) {
return;
}
String excludeUserSql = userIds.stream()
.filter(StrUtil::isNotBlank)
.distinct()
.map(userId -> "'" + StrUtil.replace(userId, "'", "''") + "'")
.collect(Collectors.joining(","));
if (StrUtil.isBlank(excludeUserSql)) {
return;
}
// SQL分组只有一条主记录,删除人员时通过追加排除条件持久化删除结果。
String groupSql = "(" + groupInfo.getGroupSql() + ") AND u.id NOT IN (" + excludeUserSql + ")";
groupInfo.setGroupSql(groupSql);
dao().updateIgnoreNull(groupInfo);
}
}
@@ -12,7 +12,7 @@ import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.sys.views.View_user;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
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.activity.culture.models.ActivityTissue;
import com.budwk.app.zhgh.activity.culture.models.ActivityTissuePerson;
import com.budwk.app.zhgh.activity.culture.service.ActivityCultureApplyUserService;
@@ -21,6 +21,7 @@ import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
@@ -36,6 +37,9 @@ import java.util.Optional;
*/
@IocBean(args = {"refer:dao"})
public class ActivityCultureApplyUserServiceImpl extends BaseServiceImpl<ActivityTissuePerson> implements ActivityCultureApplyUserService {
@Inject
private ActivityBasicScopeService activityBasicScopeService;
public ActivityCultureApplyUserServiceImpl(Dao dao) {
super(dao);
}
@@ -100,23 +104,21 @@ public class ActivityCultureApplyUserServiceImpl extends BaseServiceImpl<Activit
cnd.and("tissue.applyEndTime", "<", DateUtil.now());
}
//针对活动组别内人员
cnd.and(new Static("""
EXISTS(
SELECT 1
FROM activity_user_scope
WHERE groupId = tissue.groupId
AND userId = '%s'
)
""".formatted(SecurityUtil.getUserId())));
//是否报名
cnd.and("atp.id", isEnrolled ? "IS NOT" : "IS", null);
cnd.groupBy("tissue.id");
sql.setCondition(cnd);
Pagination pagination = listPageMap(page.getPageNumber(), page.getPageSize(), sql);
return pagination;
List<NutMap> list = listMap(sql);
// SQL分组只保存条件,报名列表需要在业务层动态判断当前用户是否命中活动范围。
list = list.stream()
.filter(item -> activityBasicScopeService.isUserInGroup(item.getInt("groupId"), SecurityUtil.getUserId()))
.toList();
int total = list.size();
int start = Math.max((page.getPageNumber() - 1) * page.getPageSize(), 0);
int end = Math.min(start + page.getPageSize(), total);
List<NutMap> pageList = start >= total ? List.of() : list.subList(start, end);
return new Pagination<>(page.getPageNumber(), page.getPageSize(), total, pageList);
}
@Override
@@ -126,10 +128,7 @@ public class ActivityCultureApplyUserServiceImpl extends BaseServiceImpl<Activit
//通用限制
// 判断是否有权限报名
if (tissue.getGroupId() != null) {
int count = dao().count(ActivityUserScope.class,
Cnd.where(ActivityUserScope::getGroupId, "=", tissue.getGroupId())
.and(ActivityUserScope::getUserId, "=", SecurityUtil.getUserId()));
if (count == 0) {
if (!activityBasicScopeService.isUserInGroup(tissue.getGroupId(), SecurityUtil.getUserId())) {
throw new BaseException("您不在本次活动参加人员范围内!");
}
}
@@ -7,6 +7,7 @@ import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService;
import com.budwk.app.zhgh.activity.culture.models.ActivityTissue;
import com.budwk.app.zhgh.activity.culture.models.ActivityTissuePerson;
import com.budwk.app.zhgh.activity.culture.service.ActivityCultureService;
@@ -39,6 +40,8 @@ public class ActivityCultureServiceImpl extends BaseServiceImpl<ActivityTissue>
@Inject
private SysClubService sysClubService;
@Inject
private ActivityBasicScopeService activityBasicScopeService;
@Override
public List<NutMap> getUnionData(String activityScopeGroupId) {
@@ -60,7 +63,7 @@ public class ActivityCultureServiceImpl extends BaseServiceImpl<ActivityTissue>
SELECT
gh.id,
gh.name unionname,
( SELECT count( 1 ) FROM `user` WHERE id IN ( SELECT userid FROM activity_user_scope WHERE groupId = @activityScopeGroupId ) AND unionId = gh.id ) as teacherCount
( SELECT count( 1 ) FROM `user` WHERE id IN ( $scopeUserSql ) AND unionId = gh.id ) as teacherCount
FROM
sys_union gh
@@ -68,7 +71,7 @@ public class ActivityCultureServiceImpl extends BaseServiceImpl<ActivityTissue>
GROUP BY
gh.id
""");
sql.setParam("activityScopeGroupId", activityScopeGroupId);
sql.setVar("scopeUserSql", activityBasicScopeService.buildGroupUserIdSubSqlText(Integer.valueOf(activityScopeGroupId)));
return listMap(sql);
}
}
@@ -13,7 +13,7 @@ import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.sys.services.SysDictService;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
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.activity.family.models.*;
import com.budwk.app.zhgh.activity.family.service.FamilyActivityService;
import com.budwk.app.zhgh.activity.family.service.FamilyActivityStatisticsService;
@@ -55,6 +55,8 @@ public class FamilyActivityApplyController {
private FamilyActivityStatisticsService statisticsService;
@Inject
private Dao dao;
@Inject
private ActivityBasicScopeService activityBasicScopeService;
@At("/")
@SaCheckPermission("family.apply")
@@ -232,8 +234,7 @@ public class FamilyActivityApplyController {
}
//判断活动组别
int count = dao.count(ActivityUserScope.class, Cnd.where("groupId", "=", activity.getActivityGroupId()).and("userId", "=", SecurityUtil.getUserId()));
if(count == 0) {
if(!activityBasicScopeService.isUserInGroup(activity.getActivityGroupId(), SecurityUtil.getUserId())) {
return Result.error(99,"抱歉,您没有此次活动的权限");
}
@@ -7,6 +7,7 @@ import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.sys.models.Sys_home_activity;
import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService;
import com.budwk.app.zhgh.activity.family.models.*;
import com.budwk.app.zhgh.activity.family.service.FamilyActivityService;
import io.swagger.annotations.Api;
@@ -48,6 +49,8 @@ public class FamilyActivityController {
@Inject
private Dao dao;
@Inject
private ActivityBasicScopeService activityBasicScopeService;
@At("")
@SaCheckPermission("family.manage")
@@ -176,7 +179,7 @@ public class FamilyActivityController {
order by gh.unioncode
""");
if (StrUtil.isNotBlank(activityScopeId)) {
sql.setVar("cnd", "AND id in (select userId from activity_user_scope where groupId = '" + activityScopeId + "')");
sql.setVar("cnd", "AND id in (" + activityBasicScopeService.buildGroupUserIdSubSqlText(Integer.valueOf(activityScopeId)) + ")");
}
List<NutMap> list = familyActivityManageService.listMap(sql);
return Result.success().addData(list);
@@ -13,7 +13,7 @@ import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.sys.services.SysDictService;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
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.activity.fellowship.models.*;
import com.budwk.app.zhgh.activity.fellowship.service.FellowshipActivityService;
import com.budwk.app.zhgh.activity.fellowship.service.FellowshipActivityStatisticsService;
@@ -58,6 +58,8 @@ public class FellowshipApplyController {
private FellowshipActivityStatisticsService statisticsService;
@Inject
private Dao dao;
@Inject
private ActivityBasicScopeService activityBasicScopeService;
@At("/")
@SaCheckPermission("fellowship.apply")
@@ -236,8 +238,7 @@ public class FellowshipApplyController {
}
//判断活动组别
int count = dao.count(ActivityUserScope.class, Cnd.where("groupId", "=", activity.getActivityGroupId()).and("userId", "=", SecurityUtil.getUserId()));
if (count == 0) {
if (!activityBasicScopeService.isUserInGroup(activity.getActivityGroupId(), SecurityUtil.getUserId())) {
return Result.error("抱歉,您没有此次活动的权限");
}
@@ -7,6 +7,7 @@ import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.sys.models.Sys_home_activity;
import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService;
import com.budwk.app.zhgh.activity.fellowship.models.*;
import com.budwk.app.zhgh.activity.fellowship.service.FellowshipActivityService;
import io.swagger.annotations.Api;
@@ -47,6 +48,8 @@ public class FellowshipManageController {
private FellowshipActivityService fellowshipActivityManageService;
@Inject
private Dao dao;
@Inject
private ActivityBasicScopeService activityBasicScopeService;
@At("")
@SaCheckPermission("fellowship.manage")
@@ -175,7 +178,7 @@ public class FellowshipManageController {
order by gh.unioncode
""");
if (StrUtil.isNotBlank(activityScopeId)) {
sql.setVar("cnd", "AND id in (select userId from activity_user_scope where groupId = '" + activityScopeId + "')");
sql.setVar("cnd", "AND id in (" + activityBasicScopeService.buildGroupUserIdSubSqlText(Integer.valueOf(activityScopeId)) + ")");
}
List<NutMap> list = fellowshipActivityManageService.listMap(sql);
return Result.success().addData(list);
@@ -9,7 +9,7 @@ import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.basic.models.ActivityBasicUnion;
import com.budwk.app.zhgh.activity.basic.models.ActivityBasicUnit;
import com.budwk.app.zhgh.activity.basic.models.ActivityEvent;
import com.budwk.app.zhgh.activity.basic.models.ActivityUserScope;
import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService;
import com.budwk.app.zhgh.activity.sports.models.ActivitySchool;
import com.budwk.app.zhgh.activity.sports.models.ActivitySchoolApply;
import com.budwk.app.zhgh.activity.sports.models.ActivitySchoolEvent;
@@ -47,6 +47,8 @@ public class H5ActivitySportsApplyUserController {
@Inject
private Dao dao;
@Inject
private ActivityBasicScopeService activityBasicScopeService;
@At("/index")
@Ok("beetl:platform/zhghh5/activity/sports/applyUser.html")
@@ -102,10 +104,7 @@ public class H5ActivitySportsApplyUserController {
//判断是否在活动组别内
int count = dao.count(ActivityUserScope.class,
Cnd.where(ActivityUserScope::getGroupId, "=", activitySchool.getActivityGroupId())
.and(ActivityUserScope::getUserId, "=", SecurityUtil.getUserId()));
if (count == 0) {
if (!activityBasicScopeService.isUserInGroup(activitySchool.getActivityGroupId(), SecurityUtil.getUserId())) {
return Result.error("您没有权限参与该活动");
}
//如果不等于空代表是个人项目
@@ -9,6 +9,7 @@ import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService;
import com.budwk.app.zhgh.activity.basic.models.ActivityBasicUnion;
import com.budwk.app.zhgh.activity.basic.models.ActivityBasicUnit;
import com.budwk.app.zhgh.activity.sports.models.ActivitySchool;
@@ -25,6 +26,7 @@ import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.dao.util.cri.Static;
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;
import org.nutz.lang.Strings;
@@ -44,6 +46,9 @@ import java.util.stream.Collectors;
*/
@IocBean(args = {"refer:dao"})
public class ActivitySportsApplyUserServiceImpl extends BaseServiceImpl<ActivitySchoolApply> implements ActivitySportsApplyUserService {
@Inject
private ActivityBasicScopeService activityBasicScopeService;
public ActivitySportsApplyUserServiceImpl(Dao dao) {
super(dao);
}
@@ -99,12 +104,6 @@ public class ActivitySportsApplyUserServiceImpl extends BaseServiceImpl<Activity
""").setParam("unionId", pageParam.getUnionId()).setParam("userId", SecurityUtil.getUserId());
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(),
RoleConstant.BRANCH_UNION_CHAIRMAN.name())) {
// cnd.where().andLike("school.applyWay ", "1");
cnd.and(new Static("(SELECT COUNT(1) FROM activity_user_scope WHERE groupId=school.activityGroupId AND userId='%s') >0".formatted(SecurityUtil.getUserId())));
}
cnd.andEX("abs.`name`", "=", pageParam.getGroupName());
if (Strings.isNotBlank(pageParam.getIsAudit())) {
cnd.and(new Static("(SELECT COUNT(1) FROM activity_school_apply WHERE eventId = ase.eventId AND activityId = ase.activityId AND userId='%s')%s0".formatted(SecurityUtil.getUserId(), (pageParam.getIsAudit().equals("true") ? ">" : "="))));
@@ -116,8 +115,15 @@ public class ActivitySportsApplyUserServiceImpl extends BaseServiceImpl<Activity
cnd.groupBy("ase.id");
cnd.asc("abs.`code`");
sql.setCondition(cnd);
Pagination pagination = listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
return pagination;
List<NutMap> list = listMap(sql);
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.BRANCH_UNION_CHAIRMAN.name())) {
list = list.stream().filter(item -> activityBasicScopeService.isUserInGroup(item.getInt("activityGroupId"), SecurityUtil.getUserId())).toList();
}
int total = list.size();
int start = Math.max((pageParam.getPageNumber() - 1) * pageParam.getPageSize(), 0);
int end = Math.min(start + pageParam.getPageSize(), total);
List<NutMap> pageList = start >= total ? List.of() : list.subList(start, end);
return new Pagination<>(pageParam.getPageNumber(), pageParam.getPageSize(), total, pageList);
}
@Override
@@ -177,17 +183,15 @@ public class ActivitySportsApplyUserServiceImpl extends BaseServiceImpl<Activity
cnd.and(new Static("(SELECT COUNT(1) FROM activity_school_apply WHERE activityId=school.id AND userId='%s')>0".formatted(SecurityUtil.getUserId())));
}
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(),
RoleConstant.BRANCH_UNION_CHAIRMAN.name())) {
// cnd.and(new Static("JSON_CONTAINS(school.applyWay,JSON_ARRAY( 1))>0"));
cnd.and(new Static("(SELECT COUNT(1) FROM activity_user_scope WHERE groupId=school.activityGroupId AND userId='%s') >0".formatted(SecurityUtil.getUserId())));
}
cnd.and("YEAR(school.applyStartTime)", "=", year);
cnd.desc("school.applyStartTime");
sql.setCondition(cnd);
Pagination pagination = listPageMap(1, 50, sql);
return pagination;
List<NutMap> list = listMap(sql);
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.BRANCH_UNION_CHAIRMAN.name())) {
list = list.stream().filter(item -> activityBasicScopeService.isUserInGroup(item.getInt("activityGroupId"), SecurityUtil.getUserId())).toList();
}
return new Pagination<>(1, 50, list.size(), list.size() > 50 ? list.subList(0, 50) : list);
}
@Override
@@ -295,7 +299,7 @@ public class ActivitySportsApplyUserServiceImpl extends BaseServiceImpl<Activity
Cnd cnd = Cnd.NEW();
cnd.and(new Static("u.id not in (SELECT IFNULL(app.userId,'') from activity_school_apply app WHERE app.activityId = '" + applyUserPageParam.getActivityId() + "' AND app.eventId='" + applyUserPageParam.getEventId() + "')"));
cnd.and(new Static("u.id IN (SELECT userId FROM activity_user_scope aus WHERE aus.groupId='" + activity.getActivityGroupId() + "')"));
cnd.and("u.id", "in", activityBasicScopeService.buildGroupUserIdSubSql(activity.getActivityGroupId()));
cnd.and("un.unionid", "=", StrUtil.isNotBlank(applyUserPageParam.getUnionId()) ? applyUserPageParam.getUnionId() : getUnionId());
if (isMenWomen != null && isMenWomen == 1)
cnd.and("u.sex", "=", "男性");
@@ -13,8 +13,9 @@ import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.sys.services.SysDictService;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
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.activity.trainSignUp.models.*;
import com.budwk.app.zhgh.activity.trainSignUp.service.TrainSignUpAnnualLimitConfigService;
import com.budwk.app.zhgh.activity.trainSignUp.service.TrainSignUpActivityService;
import com.budwk.app.zhgh.activity.trainSignUp.service.TrainSignUpActivityStatisticsService;
import io.swagger.annotations.Api;
@@ -57,7 +58,11 @@ public class TrainSignUpApplyController {
@Inject
private TrainSignUpActivityStatisticsService statisticsService;
@Inject
private TrainSignUpAnnualLimitConfigService annualLimitConfigService;
@Inject
private Dao dao;
@Inject
private ActivityBasicScopeService activityBasicScopeService;
@At("/")
@SaCheckPermission("trainSignUp.apply")
@@ -212,6 +217,24 @@ public class TrainSignUpApplyController {
return Result.success(assortList);
}
@At
@ApiOperation("校验年度同活动类型报名次数")
@SaCheckPermission(value = {"trainSignUp.apply", "h5.trainSignUp.apply"}, mode = SaMode.OR)
public Result validateYearTrainTypeSignUp(@Param("activityId") String activityId) {
if (StrUtil.isBlank(activityId)) {
return Result.error("活动信息为空");
}
TrainSignUpActivity activity = dao.fetch(TrainSignUpActivity.class, activityId);
if (activity == null) {
return Result.error("未查询到活动信息");
}
Result annualLimitResult = validateAnnualTrainTypeSignUpLimit(activity);
if (annualLimitResult != null) {
return annualLimitResult;
}
return Result.success();
}
@At
@ApiOperation("验证是否能报名")
@SaCheckPermission(value = {"trainSignUp.apply", "h5.trainSignUp.apply"}, mode = SaMode.OR)
@@ -236,11 +259,15 @@ public class TrainSignUpApplyController {
}
//判断活动组别
int count = dao.count(ActivityUserScope.class, Cnd.where("groupId", "=", activity.getActivityGroupId()).and("userId", "=", SecurityUtil.getUserId()));
if (count == 0) {
if (!activityBasicScopeService.isUserInGroup(activity.getActivityGroupId(), SecurityUtil.getUserId())) {
return Result.error("抱歉,您没有此次活动的权限");
}
Result annualLimitResult = validateAnnualTrainTypeSignUpLimit(activity);
if (annualLimitResult != null) {
return annualLimitResult;
}
//判断是否报名
boolean courseByUser = trainSignUpActivityService.isSignCourseByUser(courseId, SecurityUtil.getUserId());
if (courseByUser) {
@@ -356,6 +383,11 @@ public class TrainSignUpApplyController {
//判断人数
int number = 0;
TrainSignUpCourse course = trainSignUpActivityService.dao().fetch(TrainSignUpCourse.class, trainSignUpUser.getCourseId());
TrainSignUpActivity activity = trainSignUpActivityService.dao().fetch(TrainSignUpActivity.class, course.getActivityId());
Result annualLimitResult = validateAnnualTrainTypeSignUpLimit(activity);
if (annualLimitResult != null) {
return annualLimitResult;
}
TrainSignUpType type = trainSignUpActivityService.dao().fetch(TrainSignUpType.class, course.getCourseType());
if (type != null) {
if (type.getIsBringFamily() && type.getIsAddFamily()) {
@@ -423,4 +455,18 @@ public class TrainSignUpApplyController {
.and("courseId", "=", courseId).and("userId", "=", userId));
return Result.success();
}
/**
* 年度同活动类型报名限制在活动维度统计,当前活动已报名过的用户继续报同活动其他课程时不重复占次数。
*/
private Result validateAnnualTrainTypeSignUpLimit(TrainSignUpActivity activity) {
if (activity == null) {
return Result.error("未查询到活动信息");
}
int annualLimitCount = annualLimitConfigService.getAnnualLimitCount(activity.getTrainType());
if (trainSignUpActivityService.hasReachedAnnualTrainTypeSignUpLimit(activity, SecurityUtil.getUserId(), annualLimitCount)) {
return Result.error("当前年度同活动类型最多可报名" + annualLimitCount + "");
}
return null;
}
}
@@ -11,6 +11,7 @@ import com.budwk.app.flow.enums.ProcessInstanceStateEnum;
import com.budwk.app.sys.models.Sys_home_activity;
import com.budwk.app.sys.models.Sys_union;
import com.budwk.app.sys.models.Sys_unit;
import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService;
import com.budwk.app.zhgh.activity.trainSignUp.models.*;
import com.budwk.app.zhgh.activity.trainSignUp.service.TrainSignUpActivityService;
import com.budwk.app.zhgh.club.model.SysClub;
@@ -47,6 +48,8 @@ import java.util.stream.Collectors;
@Api(tags = "活动管理")
@At("/platform/trainSignUp/manage")
public class TrainSignUpManageController {
@Inject
private ActivityBasicScopeService activityBasicScopeService;
@Inject
private TrainSignUpActivityService trainSignUpActivityManageService;
@@ -180,7 +183,7 @@ public class TrainSignUpManageController {
order by gh.unioncode
""");
if (StrUtil.isNotBlank(activityScopeId)) {
sql.setVar("cnd", "AND id in (select userId from activity_user_scope where groupId = '" + activityScopeId + "')");
sql.setVar("cnd", "AND id in (" + activityBasicScopeService.buildGroupUserIdSubSqlText(Integer.valueOf(activityScopeId)) + ")");
}
List<NutMap> list = trainSignUpActivityManageService.listMap(sql);
return Result.success().addData(list);
@@ -103,6 +103,17 @@ public interface TrainSignUpActivityService extends BaseService<TrainSignUpActiv
*/
boolean isSignCourse(TrainSignUpCourse course, TrainSignUpActivity activity);
/**
* 校验当前用户在同一年度、同一活动类型下是否已达到报名次数上限。
* 统计时会排除当前活动本身,避免同一活动下继续报名其他课程时被重复计次拦截。
*
* @param activity 当前报名所属活动
* @param userId 当前用户ID
* @param limitCount 年度同活动类型最大允许报名次数
* @return true 表示已达到上限,false 表示仍可继续报名
*/
boolean hasReachedAnnualTrainTypeSignUpLimit(TrainSignUpActivity activity, String userId, int limitCount);
/**
* 当前用户是否已报过该培训班
*
@@ -486,6 +486,34 @@ public class TrainSignUpActivityServiceImpl extends BaseServiceImpl<TrainSignUpA
return false;
}
@Override
public boolean hasReachedAnnualTrainTypeSignUpLimit(TrainSignUpActivity activity, String userId, int limitCount) {
if (activity == null || limitCount <= 0 || activity.getYear() == null || StrUtil.isBlank(activity.getTrainType()) || StrUtil.isBlank(userId)) {
return false;
}
Sql sql = Sqls.create("""
SELECT
COUNT(DISTINCT tsu.activityId)
FROM
train_sign_up_user tsu
INNER JOIN train_sign_up_activity tsa ON tsa.id = tsu.activityId
WHERE
tsu.userId = @userId
AND tsa.`year` = @year
AND tsa.trainType = @trainType
AND tsu.activityId <> @activityId
""");
sql.setParam("userId", userId);
sql.setParam("year", activity.getYear());
sql.setParam("trainType", activity.getTrainType());
sql.setParam("activityId", activity.getId());
// 同一活动下可能存在多个课程,这里按活动去重,避免同一活动重复消耗年度次数。
int annualSignUpCount = count(sql);
return annualSignUpCount >= limitCount;
}
@Override
public boolean isSignCourseByUser(String courseId, String userId) {
return dao().count(TrainSignUpUser.class, Cnd.where("courseId", "=", courseId).and("userId", "=", userId)) > 0;
@@ -12,7 +12,7 @@ import com.budwk.app.base.service.BaseService;
import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.sys.services.SysMsgService;
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.activity.workscollection.models.Activity_works_collection;
import com.budwk.app.zhgh.activity.workscollection.models.Activity_works_collection_upload;
import com.budwk.app.zhgh.activity.workscollection.models.Activity_works_subjectType;
@@ -48,6 +48,8 @@ public class ActivityWorksCollectionManageController {
private BaseService baseService;
@Inject
private SysMsgService sysMsgService;
@Inject
private ActivityBasicScopeService activityBasicScopeService;
@At("")
@Ok("beetl:/platform/zhgh/activity/workscollection/manage/index.html")
@@ -164,9 +166,10 @@ public class ActivityWorksCollectionManageController {
FROM
sys_user
WHERE
id IN (SELECT userId FROM activity_user_scope WHERE groupId = @groupId)
id IN (
""" + activityBasicScopeService.buildGroupUserIdSubSqlText(activityGroupId) + """
)
""");
sql.setParam("groupId", activityGroupId);
sql.setCallback(Sqls.callback.strList());
dao.execute(sql);
loginNames = sql.getList(String.class);
@@ -7,7 +7,7 @@ import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.sys.views.View_user;
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.activity.workscollection.models.Activity_works_collection;
import com.budwk.app.zhgh.activity.workscollection.models.Activity_works_collection_upload;
import io.swagger.annotations.ApiOperation;
@@ -40,6 +40,8 @@ public class ActivityWorksCollectionUploadController {
@Inject
private BaseService baseService;
@Inject
private ActivityBasicScopeService activityBasicScopeService;
@At("")
@Ok("beetl:/platform/zhgh/activity/workscollection/upload/index.html")
@@ -100,9 +102,7 @@ public class ActivityWorksCollectionUploadController {
return Result.error("活动已结束!");
}
if (activity.getActivityGroupId() != null) {
int count = dao.count(ActivityUserScope.class, Cnd.where(ActivityUserScope::getGroupId, "=", activity.getActivityGroupId())
.and(ActivityUserScope::getUserId, "=", SecurityUtil.getUserId()));
if (count == 0) {
if (!activityBasicScopeService.isUserInGroup(activity.getActivityGroupId(), SecurityUtil.getUserId())) {
return Result.error("您没有权限参与该活动");
}
}
@@ -161,13 +161,14 @@ public class ActivityWorksCollectionUploadController {
Dao extDao = Daos.ext(dao, FieldFilter.create(Activity_works_collection.class, "id|name|"));
Cnd cnd = Cnd.NEW();
cnd.and(Activity_works_collection::getEnable,"=",1);
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.or(Activity_works_collection::getActivityGroupId,"=","");
seg.or(Activity_works_collection::getActivityGroupId,"is",null);
seg.or(Activity_works_collection::getActivityGroupId,"in",Sqls.create("select groupId from activity_user_scope where userId = @userId").setParam("userId",SecurityUtil.getUserId()));
cnd.and(seg);
cnd.desc(Activity_works_collection::getStartDateTime);
List<Activity_works_collection> list = extDao.query(Activity_works_collection.class, cnd);
list = list.stream().filter(item -> {
if (item.getActivityGroupId() == null) {
return true;
}
return activityBasicScopeService.isUserInGroup(item.getActivityGroupId(), SecurityUtil.getUserId());
}).toList();
return Result.success(list);
}
@@ -7,6 +7,8 @@ import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
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 io.swagger.annotations.ApiOperation;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
@@ -15,10 +17,13 @@ import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.util.List;
/**
* 手机端作品征集
*/
@@ -32,6 +37,8 @@ public class H5ActivityWorksUploadCollectionController {
private BaseService baseService;
@Inject
private Dao dao;
@Inject
private ActivityBasicScopeService activityBasicScopeService;
@At("")
@Ok("beetl:/platform/zhghh5/activity/workscollection/upload/index.html")
@@ -50,13 +57,10 @@ public class H5ActivityWorksUploadCollectionController {
@Param(value = "activityType") Integer activityType) {
Sql sql = Sqls.create("""
SELECT
awc.*,
aus.groupName activityGroupName
awc.*
FROM
`activity_works_collection` awc
LEFT JOIN activity_user_scope aus ON aus.groupId = awc.activityGroupId
AND aus.userId = @userId
""").setParam("userId", SecurityUtil.getUserId());
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("YEAR(awc.startDateTime)", "=", year);
//查询报名中
@@ -71,8 +75,23 @@ public class H5ActivityWorksUploadCollectionController {
cnd.and("awc.enable", "=", 1);
cnd.and("awc.type", "=", 1);
sql.setCondition(cnd);
Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
// SQL分组只保存条件,列表页需要先查活动,再按当前用户动态过滤可参与范围。
List<NutMap> list = baseService.listMap(sql);
List<NutMap> filterList = list.stream().filter(item -> {
Integer groupId = item.getInt("activityGroupId");
return groupId == null || activityBasicScopeService.isUserInGroup(groupId, SecurityUtil.getUserId());
}).peek(item -> {
Integer groupId = item.getInt("activityGroupId");
if (groupId != null) {
ActivityUserScope groupInfo = activityBasicScopeService.getGroupInfo(groupId);
item.setv("activityGroupName", groupInfo == null ? "" : groupInfo.getGroupName());
}
}).toList();
int total = filterList.size();
int start = Math.max((pageForm.getPageNumber() - 1) * pageForm.getPageSize(), 0);
int end = Math.min(start + pageForm.getPageSize(), total);
List<NutMap> pageList = start >= total ? List.of() : filterList.subList(start, end);
return Result.success(new Pagination<>(pageForm.getPageNumber(), pageForm.getPageSize(), total, pageList));
}
@@ -17,6 +17,7 @@ import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService;
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;
@@ -53,6 +54,8 @@ public class CadreTrainingSignUpController {
private CadreTrainingActService cadreTrainingActService;
@Inject
private CadreTrainingSignUpService cadreTrainingSignUpService;
@Inject
private ActivityBasicScopeService activityBasicScopeService;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/cadreTraining/signUp/index.html")
@@ -74,18 +77,21 @@ public class CadreTrainingSignUpController {
$condition
""").setParam("userId", SecurityUtil.getUserId());
Cnd cnd = Cnd.NEW();
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(),
RoleConstant.BRANCH_UNION_CHAIRMAN.name())) {
cnd.and(new Static("(SELECT COUNT(1) FROM activity_user_scope WHERE groupId=activityGroupId AND userId='%s') >0".formatted(SecurityUtil.getUserId())));
}
cnd.andEX("year(signUpStartTime)", "=", year);
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
cnd.where().andLike(CadreTrainingAct::getName, pageForm.getSearchKeyword());
}
cnd.and("cts.id", isEnrolled ? "IS NOT" : "IS", null);
sql.setCondition(cnd);
Pagination pagination = cadreTrainingActService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
List<NutMap> list = cadreTrainingActService.listMap(sql);
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.BRANCH_UNION_CHAIRMAN.name())) {
list = list.stream().filter(item -> activityBasicScopeService.isUserInGroup(item.getInt("activityGroupId"), SecurityUtil.getUserId())).toList();
}
int total = list.size();
int start = Math.max((pageForm.getPageNumber() - 1) * pageForm.getPageSize(), 0);
int end = Math.min(start + pageForm.getPageSize(), total);
List<NutMap> pageList = start >= total ? List.of() : list.subList(start, end);
return Result.success(new Pagination<>(pageForm.getPageNumber(), pageForm.getPageSize(), total, pageList));
}
@At
@@ -14,6 +14,7 @@ import com.budwk.app.base.utils.CommonDownloadUtil;
import com.budwk.app.base.utils.ConditionGroupUtil;
import com.budwk.app.base.utils.ManyAddOrRenewUtil;
import com.budwk.app.sys.views.View_user;
import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService;
import com.budwk.app.zhgh.dayofficework.healthCheckup.model.HealthCheckupProject;
import com.budwk.app.zhgh.dayofficework.healthCheckup.model.HealthCheckupProjectSubject;
import com.budwk.app.zhgh.dayofficework.healthCheckup.model.HealthCheckupProjectSubjectMoney;
@@ -58,6 +59,8 @@ public class HealthCheckupSingleController {
@Inject
private HealthCheckupSingleService healthCheckupSingleService;
@Inject
private ActivityBasicScopeService activityBasicScopeService;
@Inject
private ManyAddOrRenewUtil manyAddOrRenewUtil;
@At("")
@@ -254,12 +257,11 @@ public class HealthCheckupSingleController {
u.idcard idCard,
u.mobile
FROM
`activity_user_scope` aus
LEFT JOIN `vw_user` u ON u.id = aus.userId
`vw_user` u
$projectCnd $condition
""");
cnd.and("aus.groupId", "=", project.getActivityGroupId());
cnd.and("u.id", "in", activityBasicScopeService.buildGroupUserIdSubSql(project.getActivityGroupId()));
sql.setVar("projectCnd", "AND u.id NOT IN ( SELECT selectUserId FROM `health_checkup_user_selection` WHERE projectId = '" + projectId + "' AND selectUserId IS NOT NULL )");
cnd.groupBy("u.loginname");
sql.setCondition(cnd);
@@ -13,7 +13,7 @@ import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.sys.services.SysDictService;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
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.literacy.models.*;
import com.budwk.app.zhgh.dayofficework.literacy.service.LiteracyActivityService;
import com.budwk.app.zhgh.dayofficework.literacy.service.LiteracyActivityStatisticsService;
@@ -58,6 +58,8 @@ public class LiteracyApplyController {
private LiteracyActivityStatisticsService statisticsService;
@Inject
private Dao dao;
@Inject
private ActivityBasicScopeService activityBasicScopeService;
@At("/")
@SaCheckPermission("literacy.apply")
@@ -236,8 +238,7 @@ public class LiteracyApplyController {
}
//判断活动组别
int count = dao.count(ActivityUserScope.class, Cnd.where("groupId", "=", activity.getActivityGroupId()).and("userId", "=", SecurityUtil.getUserId()));
if (count == 0) {
if (!activityBasicScopeService.isUserInGroup(activity.getActivityGroupId(), SecurityUtil.getUserId())) {
return Result.error("抱歉,您没有此次活动的权限");
}
@@ -7,6 +7,7 @@ import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.sys.models.Sys_home_activity;
import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService;
import com.budwk.app.zhgh.dayofficework.literacy.models.*;
import com.budwk.app.zhgh.dayofficework.literacy.service.LiteracyActivityService;
import io.swagger.annotations.Api;
@@ -42,6 +43,8 @@ public class LiteracyManageController {
private LiteracyActivityService literacyActivityManageService;
@Inject
private Dao dao;
@Inject
private ActivityBasicScopeService activityBasicScopeService;
@At("")
@SaCheckPermission("literacy.manage")
@@ -170,7 +173,7 @@ public class LiteracyManageController {
order by gh.unioncode
""");
if (StrUtil.isNotBlank(activityScopeId)) {
sql.setVar("cnd", "AND id in (select userId from activity_user_scope where groupId = '" + activityScopeId + "')");
sql.setVar("cnd", "AND id in (" + activityBasicScopeService.buildGroupUserIdSubSqlText(Integer.valueOf(activityScopeId)) + ")");
}
List<NutMap> list = literacyActivityManageService.listMap(sql);
return Result.success().addData(list);
@@ -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;
@@ -43,6 +43,8 @@ public class H5QsvQuizController {
@Inject
private Dao dao;
@Inject
private ActivityBasicScopeService activityBasicScopeService;
@Inject
private QsvUserAnswerRecordService qsvUserAnswerRecordService;
@Inject
private QsvQuizService qsvQuizService;
@@ -68,9 +70,7 @@ public class H5QsvQuizController {
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) {
if (!activityBasicScopeService.isUserInGroup(activity.getGroupId(), SecurityUtil.getUserId())) {
return Result.error("您无需参加此次答题,感谢您的关注!");
}
}
@@ -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;
@@ -32,6 +32,8 @@ public class H5QsvSurveyController {
@Inject
private Dao dao;
@Inject
private ActivityBasicScopeService activityBasicScopeService;
@Inject
private QsvUserAnswerRecordService qsvUserAnswerRecordService;
@At("")
@@ -43,9 +45,7 @@ public class H5QsvSurveyController {
public Result subjects(String activityId) {
QsvActivity activity = dao.fetch(QsvActivity.class, activityId);
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("您无需参加此次投票,感谢您的关注!");
}
@@ -52,8 +52,6 @@ public class HuiminManageController {
t1.*
FROM
huimin t1
LEFT JOIN activity_user_scope aus ON t1.groupId = aus.groupId
AND aus.userId = @userId
$condition
""");
Cnd cnd = Cnd.NEW();
@@ -7,6 +7,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.service.ActivityBasicScopeService;
import com.budwk.app.zhgh.staffbenefit.huimin.models.Huimin;
import com.budwk.app.zhgh.staffbenefit.huimin.service.HuiminService;
import io.swagger.annotations.Api;
@@ -16,9 +17,12 @@ import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.List;
@IocBean
@At("/platform/huimin/mine")
@Api(tags = "惠民服务-我的")
@@ -28,6 +32,8 @@ public class HuiminMineController {
@Inject
private HuiminService huiminService;
@Inject
private ActivityBasicScopeService activityBasicScopeService;
@At("")
@SaCheckPermission("huimin.mine")
@@ -50,8 +56,6 @@ public class HuiminMineController {
t1.*
FROM
huimin t1
LEFT JOIN activity_user_scope aus ON t1.groupId = aus.groupId
AND aus.userId = @userId
$condition
""");
Cnd cnd = Cnd.NEW();
@@ -61,12 +65,17 @@ public class HuiminMineController {
}
// 添加启用状态过滤(只显示启用的记录)
cnd.and("t1.enable", "=", true);
// 添加权限过滤
cnd.and(Cnd.exps("t1.groupId", "is", null).or("aus.groupId", "is not", null));
sql.params().set("userId", SecurityUtil.getUserId());
sql.setCondition(cnd);
Pagination pagination = huiminService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
List<NutMap> list = huiminService.listMap(sql);
List<NutMap> filterList = list.stream().filter(item -> {
Integer groupId = item.getInt("groupId");
return groupId == null || activityBasicScopeService.isUserInGroup(groupId, SecurityUtil.getUserId());
}).toList();
int total = filterList.size();
int start = Math.max((pageForm.getPageNumber() - 1) * pageForm.getPageSize(), 0);
int end = Math.min(start + pageForm.getPageSize(), total);
List<NutMap> pageList = start >= total ? List.of() : filterList.subList(start, end);
return Result.success(new Pagination<>(pageForm.getPageNumber(), pageForm.getPageSize(), total, pageList));
}
@@ -22,6 +22,7 @@ import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
import com.budwk.app.flow.service.FlowCommonService;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService;
import com.budwk.app.zhgh.dayofficework.exerciseCard.vo.ExercisePeopleImportVo;
import com.budwk.app.zhgh.staffbenefit.maternityLeave.models.MaternityLeave;
import com.budwk.app.zhgh.staffbenefit.mutualInsurance.model.MutualInsuranceProject;
@@ -82,6 +83,8 @@ public class MutualInsuranceApplyController {
private MutualInsuranceProjectService mutualInsuranceProjectService;
@Inject
private MutualInsuranceUserService mutualInsuranceUserService;
@Inject
private ActivityBasicScopeService activityBasicScopeService;
@At("/index")
@Ok("beetl:/platform/zhgh/staffbenefit/mutualInsurance/apply/index.html")
@@ -118,8 +121,9 @@ public class MutualInsuranceApplyController {
Cnd cnd = Cnd.NEW();
cnd.andEX("`year`", "=", year == null ? DateUtil.thisYear() : year);
cnd.and("isOpen", "=", true);
cnd.and(new Static("(SELECT COUNT(1) FROM activity_user_scope WHERE groupId=activityGroupId AND userId='%s') >0".formatted(SecurityUtil.getUserId())));
List<MutualInsuranceProject> query = mutualInsuranceProjectService.query(cnd);
List<MutualInsuranceProject> query = mutualInsuranceProjectService.query(cnd).stream()
.filter(item -> activityBasicScopeService.isUserInGroup(item.getActivityGroupId(), SecurityUtil.getUserId()))
.toList();
return Result.success(query);
}
@@ -14,6 +14,7 @@ import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.CommonDownloadUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService;
import com.budwk.app.zhgh.staffbenefit.recuperation.constant.RecuperationState;
import com.budwk.app.zhgh.staffbenefit.recuperation.model.RecuperationConfig;
import com.budwk.app.zhgh.staffbenefit.recuperation.model.RecuperationEnroll;
@@ -65,6 +66,8 @@ public class RecuperationSchoolUnionUserQueryController {
private Dao dao;
@Inject
private RecuperationEnrollService enrollService;
@Inject
private ActivityBasicScopeService activityBasicScopeService;
@At("")
@Ok("beetl:/platform/zhgh/staffbenefit/recuperation/schoolUnionUserQuery/index.html")
@@ -462,12 +465,11 @@ public class RecuperationSchoolUnionUserQueryController {
u.unitname as unitName,
u.unionname as unionName
from
activity_user_scope us
left join vw_user u on u.id = us.userId
vw_user u
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("us.groupId", "=", config.getActivityGroupId());
cnd.and("u.id", "in", activityBasicScopeService.buildGroupUserIdSubSql(config.getActivityGroupId()));
cnd.and(new Static(" u.loginname not in (select loginName from recuperation_enroll where year(signingUptime) = '%s' and isNormal = true)".formatted(DateUtil.thisYear())));
cnd.asc("unitcode");
sql.setCondition(cnd);
@@ -10,6 +10,7 @@ import com.budwk.app.sys.models.Sys_union;
import com.budwk.app.sys.models.Sys_user;
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.staffbenefit.recuperation.constant.*;
import com.budwk.app.zhgh.staffbenefit.recuperation.model.*;
import com.budwk.app.zhgh.staffbenefit.recuperation.service.RecuperationEnrollService;
@@ -46,6 +47,8 @@ public class RecuperationEnrollServiceImpl extends BaseServiceImpl<RecuperationE
@Inject
private RecuperationLineService lineService;
@Inject
private ActivityBasicScopeService activityBasicScopeService;
public RecuperationEnrollServiceImpl(Dao dao) {
super(dao);
@@ -419,9 +422,7 @@ public class RecuperationEnrollServiceImpl extends BaseServiceImpl<RecuperationE
Sys_user user = dao().fetch(Sys_user.class, Cnd.where("loginname", "=", loginName));
//判断是否在报名范围内
int count = dao().count("activity_user_scope", Cnd.NEW().and("groupId", "=", config.getActivityGroupId())
.and("userId", "=", user.getId() ));
if (count == 0) {
if (!activityBasicScopeService.isUserInGroup(config.getActivityGroupId(), user.getId())) {
return Map.of(false, "抱歉,您不在报名范围内!");
}
@@ -17,7 +17,7 @@
>
<el-option
v-for="item in activityGroupList"
:label="item.groupName"
:label="formatGroupDisplayName(item)"
:value="item.groupId"
:key="item.groupId"
></el-option>
@@ -257,11 +257,19 @@ module.exports = {
clearImportDialog() {
this.importDialogVisible = false
},
formatGroupDisplayName(group) {
if (Number(group.groupType) === 2) {
return group.groupName + "SQL条件)"
}
return group.groupName + "(人员结果)"
},
viewGroupName() {
if (this.pageForm?.groupId) {
if (this.pageForm.groupId) {
const group = this.activityGroupList.find((v) => v.groupId === this.pageForm.groupId)
this.currentGroupName = group.groupName + "人员"
return
if (group) {
this.currentGroupName = this.formatGroupDisplayName(group) + "人员"
return
}
}
this.currentGroupName = "全部人员"
},
@@ -288,6 +296,7 @@ module.exports = {
this.$emit("group_change")
} else {
}
return
}
},
async flushUnits() {
@@ -301,17 +310,19 @@ module.exports = {
},
async getActivityGroup(id) {
const resp = await $.get("/platform/activity/basic/scope/getActivityUserScopeGroup")
this.activityGroupList = resp.data
if (resp.data && resp.data.length > 0) {
this.activityGroupList = resp.data || []
if (this.activityGroupList.length > 0) {
if (id) {
if (this.activityGroupList.some((v) => v.groupId === id)) {
this.$set(this.pageForm, "groupId", id)
} else {
this.$set(this.pageForm, "groupId", resp.data[0].groupId)
this.$set(this.pageForm, "groupId", this.activityGroupList[0].groupId)
}
} else {
this.$set(this.pageForm, "groupId", resp.data[0].groupId)
this.$set(this.pageForm, "groupId", this.activityGroupList[0].groupId)
}
} else {
this.$set(this.pageForm, "groupId", null)
}
await this.doSearch()
},
@@ -301,7 +301,7 @@
导入XLSX设置分组
</el-button>
<el-button @click="doExportUser" size="medium" type="primary" icon="el-icon-download">导出查询人员</el-button>
<el-button @click="setDialogVisible = true" size="medium" type="primary">设置为活动人员</el-button>
<el-button @click="openSetDialog" size="medium" type="primary">设置为活动人员</el-button>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" border ref="userTable" stripe>
<el-table-column label="序号" type="index" width="80">
@@ -336,25 +336,32 @@
:close-on-click-modal="false">
<el-form :model="formData" :rules="rules" label-width="100px" ref="setForm">
<el-form-item label="添加方式" prop="setGroupType">
<el-radio-group size="small" v-model="formData.setGroupType">
<el-radio-group size="small" v-model="formData.setGroupType" @change="handleSetGroupModeChange">
<el-radio :label="1">添加至原有分组</el-radio>
<el-radio :label="2">添加到新分组</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="保存方式" prop="groupType">
<el-radio-group size="small" v-model="formData.groupType" @change="handleGroupTypeChange">
<el-radio :label="1">保存人员结果</el-radio>
<el-radio :label="2">保存SQL条件</el-radio>
</el-radio-group>
</el-form-item>
<el-row v-if="formData.setGroupType === 1">
<el-form-item label="原有分组" prop="setGroupId">
<el-radio-group size="small" v-model="formData.setGroupId">
<el-radio
:disabled="item.groupId != pageForm.activityGroupId"
:label="item.groupId"
:key="item.groupId"
border
v-for="item in activityGroupList"
v-for="item in sameTypeGroupList"
>
{{ item.groupName }}
{{ formatGroupDisplayName(item) }}
</el-radio>
</el-radio-group>
<div class="form-tip" v-if="sameTypeGroupList.length === 0">当前还没有同类型分组请先创建新分组</div>
</el-form-item>
</el-row>
<el-row v-if="formData.setGroupType === 2">
@@ -391,9 +398,12 @@ module.exports = {
clubOptions: [],
settingLoading: false,
setDialogVisible: false,
setGroupType: null,
setGroupId: null,
setGroupName: null,
formData: {
setGroupType: 2,
setGroupId: null,
setGroupName: "",
groupType: 1
},
personTypeOptions: [],
userStateOptions: [],
activityGroupList: [],
@@ -460,6 +470,7 @@ module.exports = {
],
rules: {
setGroupType: [{required: true, message: "请选择添加方式", trigger: ["blur", "change"]}],
groupType: [{required: true, message: "请选择保存方式", trigger: ["blur", "change"]}],
setGroupId: [{required: true, message: "请选择分组", trigger: ["blur", "change"]}],
setGroupName: [{required: true, message: "请输入分组名称", trigger: ["blur", "change"]}]
},
@@ -487,6 +498,9 @@ module.exports = {
},
unionid() {
return this.roleData.unionid
},
sameTypeGroupList() {
return this.activityGroupList.filter((item) => Number(item.groupType) === Number(this.formData.groupType))
}
},
components: {
@@ -494,6 +508,44 @@ module.exports = {
"activity-import-user": httpVueLoader("/components/module/activity/ActivityImportUser.vue?v=" + new Date().getTime())
},
methods: {
getDefaultFormData() {
return {
setGroupType: 2,
setGroupId: null,
setGroupName: "",
groupType: 1
}
},
openSetDialog() {
this.formData = this.getDefaultFormData()
this.setDialogVisible = true
this.$nextTick(() => {
if (this.$refs.setForm) {
this.$refs.setForm.clearValidate()
}
})
},
handleSetGroupModeChange() {
if (this.formData.setGroupType === 1) {
this.formData.setGroupName = ""
if (!this.sameTypeGroupList.some((item) => item.groupId === this.formData.setGroupId)) {
this.formData.setGroupId = null
}
return
}
this.formData.setGroupId = null
},
handleGroupTypeChange() {
if (!this.sameTypeGroupList.some((item) => item.groupId === this.formData.setGroupId)) {
this.formData.setGroupId = null
}
},
formatGroupDisplayName(group) {
if (Number(group.groupType) === 2) {
return group.groupName + "SQL条件)"
}
return group.groupName + "(人员结果)"
},
listSession() {
this.$axios.post("/platform/teacherCongress/common/listSession").then((res) => {
if (res.code === 0) {
@@ -595,7 +647,7 @@ module.exports = {
return
}
if (this.tableData.length === 0) {
if (this.formData.groupType !== 2 && this.tableData.length === 0) {
this.$message.warning("请先指定筛选条件!")
return
}
@@ -625,11 +677,7 @@ module.exports = {
await this.getActivityGroup()
this.doSearch()
this.$message.success(resp.msg)
this.formData = {
setGroupType: null,
setGroupId: null,
setGroupName: null
}
this.formData = this.getDefaultFormData()
} else {
this.$message.error(resp.msg)
}
@@ -640,12 +688,12 @@ module.exports = {
},
async getActivityGroup() {
const resp = await $.get("/platform/activity/basic/scope/getActivityUserScopeGroup")
this.activityGroupList = resp.data
this.activityGroupList = resp.data || []
this.activityGroupList2 = []
resp.data.forEach((v) => {
this.activityGroupList.forEach((v) => {
this.activityGroupList2.push({
groupId: v.groupId,
groupName: v.groupName + "范围之外人员"
groupName: this.formatGroupDisplayName(v) + "范围之外人员"
})
})
},
@@ -748,4 +796,11 @@ module.exports = {
.reverseCheckBox {
margin: 0 10px 0 0 !important;
}
.form-tip {
color: #909399;
font-size: 12px;
line-height: 20px;
margin-top: 8px;
}
</style>
@@ -144,10 +144,20 @@ layout("/layouts/platform.html"){
this.onView(row)
return
}
this.infoVisible = false
this.$nextTick(() => {
this.$refs.guava.view(() => {
this.$refs.courseListRef.onOpen(row)
// 先校验年度同活动类型报名次数,避免进入课程页后才提示不可报名。
this.$axios.post("/platform/trainSignUp/apply/validateYearTrainTypeSignUp", {activityId: row.id}).then((res) => {
if (res.code !== 0) {
this.$alert(res.msg, "提示", {
confirmButtonText: "确定",
type: "warning"
})
return
}
this.infoVisible = false
this.$nextTick(() => {
this.$refs.guava.view(() => {
this.$refs.courseListRef.onOpen(row)
})
})
})
},
@@ -24,6 +24,10 @@ layout("/layouts/platform.html"){
<el-card shadow="never" class="mt20">
<table-tool label="申请列表">
<el-button type="primary" plain size="small" @click="openAnnualLimit">
<i class="ti-settings"></i>
年度次数配置
</el-button>
<el-button type="primary" size="small" @click="openAdd">
<i class="ti-plus"></i>
新增类型
@@ -75,6 +79,9 @@ layout("/layouts/platform.html"){
}
})
},
openAnnualLimit() {
window.location.href = '/platform/trainSignUp/annualLimit'
},
openAdd() {
this.$refs.guava.edit(() => {
this.$refs.basicFormRef.initData()
@@ -131,7 +131,18 @@ layout("/layouts/platform_h5.html"){
this.onView(row)
return
}
this.$pjaxReplace('/platform/trainSignUp/apply/list/h5?id=' + row.id)
// 先校验年度同活动类型报名次数,避免进入课程页后才提示不可报名。
this.$axios.post('/platform/trainSignUp/apply/validateYearTrainTypeSignUp', {activityId: row.id}).then((res) => {
if (res.code !== 0) {
vant.Dialog.alert({
title: '提示',
message: res.msg,
confirmButtonColor: '#1867b0'
})
return
}
this.$pjaxReplace('/platform/trainSignUp/apply/list/h5?id=' + row.id)
})
},
fetchOne() {
this.$axios.post('/platform/trainSignUp/manage/findOne', {id: this.id}).then((res) => {