From 4eabb38d09d227182111bf8757fb78f491a9c208 Mon Sep 17 00:00:00 2001 From: = <=> Date: Tue, 7 Jul 2026 15:48:22 +0800 Subject: [PATCH] commit --- .../impl/SysDataUserAllUpdateServiceImpl.java | 41 +++++++++++++-- .../ProposalDashboardController.java | 52 +++++++++++++++---- 2 files changed, 78 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysDataUserAllUpdateServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysDataUserAllUpdateServiceImpl.java index f7b8f39..766a668 100644 --- a/src/main/java/com/budwk/app/sys/services/impl/SysDataUserAllUpdateServiceImpl.java +++ b/src/main/java/com/budwk/app/sys/services/impl/SysDataUserAllUpdateServiceImpl.java @@ -220,9 +220,13 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService if (user == null) { // 新增用户,初始化数据 + u.setId(R.UU32()); String salt = R.UU32(); u.setSalt(salt); u.setPassword(PwdUtil.getPassword(PwdUtil.generate(12), salt)); + if (isMember) { + addMemberUserIds.add(u.getId()); + } needInitUserList.add(u); } else { @@ -231,9 +235,9 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService // 检测会员状态变更 boolean currentIsMember = user.getMember() != null && user.getMember(); - if (isMember && !currentIsMember) { + if (isMember) { addMemberUserIds.add(user.getId()); - } else if (!isMember && currentIsMember) { + } else if (currentIsMember) { removeMemberUserIds.add(user.getId()); } @@ -351,13 +355,40 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService if (Lang.isNotEmpty(addMemberUserIds)) { executorService.execute(() -> { try { - log.info("添加会员角色: {} 个", addMemberUserIds.size()); - List roleList = addMemberUserIds.stream().map(id -> { + if (memberRole == null) { + log.warn("会员角色不存在,跳过会员角色补齐"); + return; + } + + List candidateMemberUserIds = addMemberUserIds.stream() + .filter(StrUtil::isNotBlank) + .distinct() + .collect(Collectors.toList()); + if (candidateMemberUserIds.isEmpty()) { + return; + } + + // 全量更新会重算会员身份,这里补齐新增会员和历史缺失的会员角色,避免重复插入已有关系。 + Set existingMemberRoleUserIds = new HashSet<>(); + List> queryBatches = ListUtil.split(candidateMemberUserIds, 500); + queryBatches.forEach(batch -> { + List existingRoles = dao.query(Sys_user_role.class, + Cnd.where("roleId", "=", memberRole.getId()).and("userId", "in", batch)); + existingMemberRoleUserIds.addAll(existingRoles.stream() + .map(Sys_user_role::getUserId) + .filter(StrUtil::isNotBlank) + .collect(Collectors.toSet())); + }); + + List roleList = candidateMemberUserIds.stream() + .filter(id -> !existingMemberRoleUserIds.contains(id)) + .map(id -> { Sys_user_role userRole = new Sys_user_role(); userRole.setRoleId(memberRole.getId()); userRole.setUserId(id); return userRole; }).collect(Collectors.toList()); + log.info("添加会员角色: 候选 {} 个, 实际新增 {} 个", candidateMemberUserIds.size(), roleList.size()); if (!roleList.isEmpty()) { // 分批处理角色分配 @@ -408,7 +439,7 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService log.info("全量更新用户数据完成,耗时: {} 毫秒", (endTime - startTime)); return "更新完成: 新增用户 " + needInitUserList.size() + " 个, 更新用户 " + needDoUpdateList.size() - + " 个, 待添加会员 " + addMemberUserIds.size() + " 个, 待移除会员 " + removeMemberUserIds.size() + " 个"; + + " 个, 会员角色补齐候选 " + addMemberUserIds.size() + " 个, 待移除会员 " + removeMemberUserIds.size() + " 个"; } /** diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/dashboard/ProposalDashboardController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/dashboard/ProposalDashboardController.java index 1f044b0..eb5036a 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/dashboard/ProposalDashboardController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/dashboard/ProposalDashboardController.java @@ -27,6 +27,7 @@ import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Param; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; @IocBean @@ -35,6 +36,22 @@ import java.util.List; @Ok("json:full") public class ProposalDashboardController { + private static final String MASTER_REPLY_TASK_NAME = "master_reply"; + private static final String OPINION_MASTER_REPLY_TASK_NAME = "opinion_master_reply"; + private static final List MERGED_MASTER_REPLY_TASK_NAMES = List.of(MASTER_REPLY_TASK_NAME, OPINION_MASTER_REPLY_TASK_NAME); + private static final List EXCLUDE_NODE_NAMES = List.of("撰写提案", "邀请附议人", "提案附议"); + private static final List DASHBOARD_TASK_NODE_ORDER = List.of( + "delegation", + "committee_member_review", + "committee", + "school_leader_instruction", + MASTER_REPLY_TASK_NAME, + "slave_reply", + "committee_director_opinion", + "school_leader", + "feedback" + ); + @Inject private ProposalCommonService proposalCommonService; @Inject @@ -63,12 +80,11 @@ public class ProposalDashboardController { ProcessModel processModel = processDefineService.processDefineToModel(define); List taskModels = processModel.getModels(TaskModel.class); - List excludeNodes = new ArrayList<>(3); - excludeNodes.add("撰写提案"); - excludeNodes.add("邀请附议人"); - excludeNodes.add("提案附议"); - - List taskNodes = taskModels.stream().filter(taskModel -> !excludeNodes.contains(taskModel.getDisplayName())) + List taskNodes = taskModels.stream() + .filter(taskModel -> !EXCLUDE_NODE_NAMES.contains(taskModel.getDisplayName())) + // 主办单位答复存在立案、建议两条流程编码,看板统一合并到 master_reply 统计。 + .filter(taskModel -> !OPINION_MASTER_REPLY_TASK_NAME.equals(taskModel.getName())) + .sorted(Comparator.comparingInt(taskModel -> getDashboardNodeOrder(taskModel.getName()))) .map(taskModel -> NutMap.NEW() .addv("name", taskModel.getDisplayName()) .addv("id", taskModel.getName()) @@ -106,9 +122,9 @@ public class ProposalDashboardController { for (NutMap node : nodes) { if (node.getString("type").equals("task")) { - long todoCount = todoTasks.stream().filter(task -> task.getInt("taskState") == ProcessTaskStateEnum.DOING.getCode() && task.getString("taskName").equals(node.getString("id"))).count(); + long todoCount = todoTasks.stream().filter(task -> task.getInt("taskState") == ProcessTaskStateEnum.DOING.getCode() && isDashboardTaskMatch(task, node.getString("id"))).count(); node.put("todoCount", todoCount); - long doneCount = todoTasks.stream().filter(task -> task.getInt("taskState") == ProcessTaskStateEnum.FINISHED.getCode() && task.getString("taskName").equals(node.getString("id"))).count(); + long doneCount = todoTasks.stream().filter(task -> task.getInt("taskState") == ProcessTaskStateEnum.FINISHED.getCode() && isDashboardTaskMatch(task, node.getString("id"))).count(); node.put("doneCount", doneCount); } else if (node.getString("type").equals("total")) { int count = dao.count(ProposalInfo.class, Cnd.where(ProposalInfo::getSessionId, "=", sessionId)); @@ -161,9 +177,13 @@ public class ProposalDashboardController { if (StrUtil.isNotBlank(selectNodeType) && StrUtil.isNotBlank(selectNodeId)) { switch (selectNodeType) { case "task": - cnd.and("t.taskName", "=", selectNodeId); + if (MASTER_REPLY_TASK_NAME.equals(selectNodeId)) { + cnd.and("t.taskName", "in", MERGED_MASTER_REPLY_TASK_NAMES); + } else { + cnd.and("t.taskName", "=", selectNodeId); + } - if (selectNodeMode.equals("todo")) { + if ("todo".equals(selectNodeMode)) { sql.setParam("taskState", ProcessTaskStateEnum.DOING.getCode()); } else { sql.setParam("taskState", ProcessTaskStateEnum.FINISHED.getCode()); @@ -183,5 +203,17 @@ public class ProposalDashboardController { return Result.success(pagination); } + private int getDashboardNodeOrder(String taskName) { + int index = DASHBOARD_TASK_NODE_ORDER.indexOf(taskName); + return index < 0 ? Integer.MAX_VALUE : index; + } + + private boolean isDashboardTaskMatch(NutMap task, String nodeId) { + String taskName = task.getString("taskName"); + if (MASTER_REPLY_TASK_NAME.equals(nodeId)) { + return MERGED_MASTER_REPLY_TASK_NAMES.contains(taskName); + } + return nodeId.equals(taskName); + } }