commit
This commit is contained in:
+284
-47
@@ -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")
|
||||
|
||||
+65
-41
@@ -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
|
||||
|
||||
+45
@@ -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.userId,SQL条件分组则按保存的 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);
|
||||
|
||||
}
|
||||
|
||||
+123
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
+16
-17
@@ -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("您不在本次活动参加人员范围内!");
|
||||
}
|
||||
}
|
||||
|
||||
+5
-2
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
+4
-3
@@ -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,"抱歉,您没有此次活动的权限");
|
||||
}
|
||||
|
||||
|
||||
+4
-1
@@ -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);
|
||||
|
||||
+4
-3
@@ -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("抱歉,您没有此次活动的权限");
|
||||
}
|
||||
|
||||
|
||||
+4
-1
@@ -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);
|
||||
|
||||
+4
-5
@@ -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("您没有权限参与该活动");
|
||||
}
|
||||
//如果不等于空代表是个人项目
|
||||
|
||||
+20
-16
@@ -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", "=", "男性");
|
||||
|
||||
+49
-3
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+4
-1
@@ -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);
|
||||
|
||||
+11
@@ -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);
|
||||
|
||||
/**
|
||||
* 当前用户是否已报过该培训班
|
||||
*
|
||||
|
||||
+28
@@ -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;
|
||||
|
||||
+6
-3
@@ -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);
|
||||
|
||||
+10
-9
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
+26
-7
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
|
||||
+12
-6
@@ -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
|
||||
|
||||
+5
-3
@@ -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);
|
||||
|
||||
+4
-3
@@ -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("抱歉,您没有此次活动的权限");
|
||||
}
|
||||
|
||||
|
||||
+4
-1
@@ -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);
|
||||
|
||||
+4
-4
@@ -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
-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.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("您无需参加此次投票,感谢您的关注!");
|
||||
}
|
||||
|
||||
|
||||
-2
@@ -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();
|
||||
|
||||
+16
-7
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
|
||||
+6
-2
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
+5
-3
@@ -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);
|
||||
|
||||
+4
-3
@@ -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) => {
|
||||
|
||||
Reference in New Issue
Block a user