This commit is contained in:
=
2026-07-07 15:48:22 +08:00
parent 578289a2cc
commit 4eabb38d09
2 changed files with 78 additions and 15 deletions
@@ -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<Sys_user_role> roleList = addMemberUserIds.stream().map(id -> {
if (memberRole == null) {
log.warn("会员角色不存在,跳过会员角色补齐");
return;
}
List<String> candidateMemberUserIds = addMemberUserIds.stream()
.filter(StrUtil::isNotBlank)
.distinct()
.collect(Collectors.toList());
if (candidateMemberUserIds.isEmpty()) {
return;
}
// 全量更新会重算会员身份,这里补齐新增会员和历史缺失的会员角色,避免重复插入已有关系。
Set<String> existingMemberRoleUserIds = new HashSet<>();
List<List<String>> queryBatches = ListUtil.split(candidateMemberUserIds, 500);
queryBatches.forEach(batch -> {
List<Sys_user_role> 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<Sys_user_role> 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() + "";
}
/**
@@ -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<String> MERGED_MASTER_REPLY_TASK_NAMES = List.of(MASTER_REPLY_TASK_NAME, OPINION_MASTER_REPLY_TASK_NAME);
private static final List<String> EXCLUDE_NODE_NAMES = List.of("撰写提案", "邀请附议人", "提案附议");
private static final List<String> 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<TaskModel> taskModels = processModel.getModels(TaskModel.class);
List<String> excludeNodes = new ArrayList<>(3);
excludeNodes.add("撰写提案");
excludeNodes.add("邀请附议人");
excludeNodes.add("提案附议");
List<NutMap> taskNodes = taskModels.stream().filter(taskModel -> !excludeNodes.contains(taskModel.getDisplayName()))
List<NutMap> 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);
}
}