!60 czh-20260630-优化查询;防止清空日期

Merge pull request !60 from 陈志浩/fix/tasklist-20260630
This commit is contained in:
陈志浩
2026-06-30 06:13:29 +00:00
committed by Gitee
2 changed files with 159 additions and 56 deletions
@@ -20,12 +20,16 @@ import org.springframework.transaction.annotation.Transactional;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import lombok.extern.slf4j.Slf4j;
import java.util.Set;
import com.alibaba.fastjson.JSONObject;
@Service
public class TaskListDetialServiceImpl extends ServiceImpl<TaskListDetialMapper, TaskListDetial> implements ITaskListDetialService {
@@ -204,19 +208,16 @@ public class TaskListDetialServiceImpl extends ServiceImpl<TaskListDetialMapper,
task.setFollowersName("");
}
}
boolean clearStartTime = task.getStartTime() == null && existing.getStartTime() != null;
boolean clearEndTime = task.getEndTime() == null && existing.getEndTime() != null;
// 前端没传日期则保留原值,避免局部更新时意外清除
if (task.getStartTime() == null) {
task.setStartTime(existing.getStartTime());
}
if (task.getEndTime() == null) {
task.setEndTime(existing.getEndTime());
}
taskListDetialMapper.updateById(task);
if (clearStartTime || clearEndTime) {
UpdateWrapper<TaskListDetial> uw = new UpdateWrapper<>();
uw.eq("id", task.getId());
if (clearStartTime) uw.set("start_time", null);
if (clearEndTime) uw.set("end_time", null);
taskListDetialMapper.update(null, uw);
}
taskListDetialMapper.appendAssigner(task.getId(), userId, loginUser.getRealname());
}
@@ -544,43 +545,108 @@ public class TaskListDetialServiceImpl extends ServiceImpl<TaskListDetialMapper,
if (list == null || list.isEmpty()) {
return;
}
// 1. 收集所有唯一的用户名和用户ID
Set<String> allUsernames = new LinkedHashSet<>();
Set<String> allUserIds = new LinkedHashSet<>();
for (TaskListDetial task : list) {
if (oConvertUtils.isNotEmpty(task.getCreateBy())) {
List<com.alibaba.fastjson.JSONObject> users = sysBaseAPI.queryUsersByUsernames(task.getCreateBy());
if (users != null && !users.isEmpty()) {
task.setCreateByName(users.get(0).getString("realname"));
allUsernames.add(task.getCreateBy());
}
collectUserIds(task.getAssigneeId(), allUserIds);
collectUserIds(task.getParticipantId(), allUserIds);
collectUserIds(task.getFollowersId(), allUserIds);
}
// 2. 批量查询,构建映射表
Map<String, String> usernameToRealname = new HashMap<>();
if (!allUsernames.isEmpty()) {
List<JSONObject> users = sysBaseAPI.queryUsersByUsernames(String.join(",", allUsernames));
if (users != null) {
for (JSONObject u : users) {
usernameToRealname.put(u.getString("username"), u.getString("realname"));
}
}
}
Map<String, String> idToRealname = new HashMap<>();
if (!allUserIds.isEmpty()) {
List<JSONObject> users = sysBaseAPI.queryUsersByIds(String.join(",", allUserIds));
if (users != null) {
for (JSONObject u : users) {
idToRealname.put(u.getString("id"), u.getString("realname"));
}
}
}
// 3. 从映射表填充,无需再查数据库
for (TaskListDetial task : list) {
if (oConvertUtils.isNotEmpty(task.getCreateBy())) {
String name = usernameToRealname.get(task.getCreateBy());
if (name != null) {
task.setCreateByName(name);
}
}
if (oConvertUtils.isNotEmpty(task.getAssigneeId()) && oConvertUtils.isEmpty(task.getAssigneeName())) {
task.setAssigneeName(translateUserIdsToNames(task.getAssigneeId()));
task.setAssigneeName(buildNamesFromMap(task.getAssigneeId(), idToRealname));
}
if (oConvertUtils.isNotEmpty(task.getParticipantId()) && oConvertUtils.isEmpty(task.getParticipantName())) {
task.setParticipantName(translateUserIdsToNames(task.getParticipantId()));
task.setParticipantName(buildNamesFromMap(task.getParticipantId(), idToRealname));
}
if (oConvertUtils.isNotEmpty(task.getFollowersId()) && oConvertUtils.isEmpty(task.getFollowersName())) {
task.setFollowersName(translateUserIdsToNames(task.getFollowersId()));
task.setFollowersName(buildNamesFromMap(task.getFollowersId(), idToRealname));
}
}
}
private void collectUserIds(String idsStr, Set<String> idSet) {
if (oConvertUtils.isEmpty(idsStr)) {
return;
}
for (String id : idsStr.split(",")) {
String trimmed = id.trim();
if (oConvertUtils.isNotEmpty(trimmed)) {
idSet.add(trimmed);
}
}
}
private String buildNamesFromMap(String idsStr, Map<String, String> idToRealname) {
if (oConvertUtils.isEmpty(idsStr) || idToRealname.isEmpty()) {
return null;
}
StringBuilder sb = new StringBuilder();
for (String id : idsStr.split(",")) {
String trimmed = id.trim();
if (oConvertUtils.isNotEmpty(trimmed)) {
String name = idToRealname.get(trimmed);
if (name != null) {
if (sb.length() > 0) {
sb.append(",");
}
sb.append(name);
}
}
}
return sb.length() > 0 ? sb.toString() : null;
}
private String translateUserIdsToNames(String ids) {
if (oConvertUtils.isEmpty(ids)) {
return null;
}
String[] idArr = ids.split(",");
StringBuilder names = new StringBuilder();
for (String id : idArr) {
if (oConvertUtils.isNotEmpty(id)) {
LoginUser user = sysBaseAPI.getUserById(id.trim());
if (user != null) {
if (names.length() > 0) {
names.append(",");
}
names.append(user.getRealname());
}
}
List<JSONObject> users = sysBaseAPI.queryUsersByIds(ids);
if (users == null || users.isEmpty()) {
return null;
}
return names.length() > 0 ? names.toString() : null;
StringBuilder names = new StringBuilder();
for (JSONObject user : users) {
if (names.length() > 0) {
names.append(",");
}
names.append(user.getString("realname"));
}
return names.toString();
}
private String mergeIds(String existingIds, String newIds) {
@@ -28,9 +28,15 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.Objects;
import java.util.stream.Collectors;
import com.alibaba.fastjson.JSONObject;
/**
* @Description: 任务清单表
@@ -549,42 +555,62 @@ public class TaskListServiceImpl extends ServiceImpl<TaskListMapper, TaskList> i
}
private List<TaskList> enrichListSummaries(List<TaskList> lists, String currentUserId) {
if (lists == null || lists.isEmpty()) {
return lists;
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for (TaskList list : lists) {
if (list.getCreateTime() != null) {
list.setCreateTimeStr(sdf.format(list.getCreateTime()));
}
}
LambdaQueryWrapper<TaskListPermission> ownerQuery = new LambdaQueryWrapper<>();
ownerQuery.eq(TaskListPermission::getMainId, list.getId());
ownerQuery.eq(TaskListPermission::getPermission, "1");
TaskListPermission owner = taskListPermissionMapper.selectOne(ownerQuery);
if (owner != null) {
LoginUser ownerUser = sysBaseAPI.getUserById(owner.getUserId());
if (ownerUser != null) {
list.setOwnerName(ownerUser.getRealname());
}
if (currentUserId != null && currentUserId.equals(owner.getUserId())) {
list.setMyPermission("1");
// 1. 收集所有清单ID,批量查询权限表
List<String> mainIds = lists.stream().map(TaskList::getId).collect(Collectors.toList());
List<TaskListPermission> allPerms = taskListPermissionMapper.selectList(
new LambdaQueryWrapper<TaskListPermission>().in(TaskListPermission::getMainId, mainIds)
);
// 2. 收集所有用户ID,批量查询用户
java.util.Set<String> allUserIds = new java.util.LinkedHashSet<>();
for (TaskListPermission perm : allPerms) {
allUserIds.add(perm.getUserId());
}
Map<String, String> idToName = new HashMap<>();
if (!allUserIds.isEmpty()) {
List<JSONObject> users = sysBaseAPI.queryUsersByIds(String.join(",", allUserIds));
if (users != null) {
for (JSONObject u : users) {
idToName.put(u.getString("id"), u.getString("realname"));
}
}
}
LambdaQueryWrapper<TaskListPermission> collabQuery = new LambdaQueryWrapper<>();
collabQuery.eq(TaskListPermission::getMainId, list.getId());
collabQuery.ne(TaskListPermission::getPermission, "1");
List<TaskListPermission> collabs = taskListPermissionMapper.selectList(collabQuery);
if (!collabs.isEmpty()) {
List<String> collabUserIds = collabs.stream().map(TaskListPermission::getUserId).collect(java.util.stream.Collectors.toList());
List<String> collabNames = new java.util.ArrayList<>();
for (String collabUserId : collabUserIds) {
LoginUser collabUser = sysBaseAPI.getUserById(collabUserId);
if (collabUser != null && collabUser.getRealname() != null) {
collabNames.add(collabUser.getRealname());
// 3. 按清单分组,从映射表填充
Map<String, List<TaskListPermission>> permByMainId = allPerms.stream()
.collect(Collectors.groupingBy(TaskListPermission::getMainId));
for (TaskList list : lists) {
List<TaskListPermission> perms = permByMainId.getOrDefault(list.getId(), java.util.Collections.emptyList());
List<String> collabNames = new ArrayList<>();
for (TaskListPermission perm : perms) {
String name = idToName.get(perm.getUserId());
if (name == null) continue;
if ("1".equals(perm.getPermission())) {
list.setOwnerName(name);
if (currentUserId != null && currentUserId.equals(perm.getUserId())) {
list.setMyPermission("1");
}
} else {
collabNames.add(name);
}
}
if (!collabNames.isEmpty()) {
list.setCollaboratorNames(String.join(", ", collabNames));
}
}
return lists;
}
@@ -595,16 +621,27 @@ public class TaskListServiceImpl extends ServiceImpl<TaskListMapper, TaskList> i
query.orderByAsc(TaskListPermission::getCreateTime);
List<TaskListPermission> perms = taskListPermissionMapper.selectList(query);
List<CollaboratorVO> result = new java.util.ArrayList<>();
if (perms.isEmpty()) {
return java.util.Collections.emptyList();
}
// 批量查询所有协作用户
String userIds = perms.stream().map(TaskListPermission::getUserId).collect(Collectors.joining(","));
Map<String, String> idToName = new HashMap<>();
List<JSONObject> users = sysBaseAPI.queryUsersByIds(userIds);
if (users != null) {
for (JSONObject u : users) {
idToName.put(u.getString("id"), u.getString("realname"));
}
}
List<CollaboratorVO> result = new ArrayList<>();
for (TaskListPermission perm : perms) {
CollaboratorVO vo = new CollaboratorVO();
vo.setPermissionId(perm.getId());
vo.setUserId(perm.getUserId());
vo.setPermission(perm.getPermission());
LoginUser user = sysBaseAPI.getUserById(perm.getUserId());
if (user != null) {
vo.setUsername(user.getRealname());
}
vo.setUsername(idToName.getOrDefault(perm.getUserId(), null));
result.add(vo);
}
return result;