From 6208ff36fe8111bbd4b907a5cf7d2406fcea6c89 Mon Sep 17 00:00:00 2001 From: JiaoTianBo Date: Wed, 1 Apr 2026 16:38:13 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=97=A5=E6=8A=A5=E5=88=86=E6=9E=90):=20?= =?UTF-8?q?=E5=9C=A8=E6=97=A5=E6=8A=A5=E5=88=86=E6=9E=90=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E4=B8=AD=E5=A2=9E=E5=8A=A0=E6=8F=90=E4=BA=A4=E8=80=85=E5=A7=93?= =?UTF-8?q?=E5=90=8D=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 submitterName 字段到 DailyReportWithAnalysisVO 以展示提交者真实姓名 重构分析结果解析逻辑,支持多种原始数据类型转换 优化用户信息查询,通过 ID 或用户名批量获取并缓存用户数据 --- .../domain/vo/DailyReportWithAnalysisVO.java | 2 + .../DailyReportSuggestionServiceImpl.java | 97 +++++++++++++++++-- 2 files changed, 93 insertions(+), 6 deletions(-) diff --git a/src/main/java/cn/yinlihupo/domain/vo/DailyReportWithAnalysisVO.java b/src/main/java/cn/yinlihupo/domain/vo/DailyReportWithAnalysisVO.java index a19a9cd..bfe3259 100644 --- a/src/main/java/cn/yinlihupo/domain/vo/DailyReportWithAnalysisVO.java +++ b/src/main/java/cn/yinlihupo/domain/vo/DailyReportWithAnalysisVO.java @@ -20,6 +20,8 @@ public class DailyReportWithAnalysisVO { private Long submitterId; + private String submitterName; + private String workContent; private String tomorrowPlan; diff --git a/src/main/java/cn/yinlihupo/service/analysis/impl/DailyReportSuggestionServiceImpl.java b/src/main/java/cn/yinlihupo/service/analysis/impl/DailyReportSuggestionServiceImpl.java index e2ba31c..9ddc8c2 100644 --- a/src/main/java/cn/yinlihupo/service/analysis/impl/DailyReportSuggestionServiceImpl.java +++ b/src/main/java/cn/yinlihupo/service/analysis/impl/DailyReportSuggestionServiceImpl.java @@ -8,6 +8,7 @@ import cn.yinlihupo.domain.entity.DailyReportAnalysisRecord; import cn.yinlihupo.domain.entity.DailyReportUpdateSuggestion; import cn.yinlihupo.domain.entity.ProjectDailyReport; import cn.yinlihupo.domain.entity.ProjectMilestone; +import cn.yinlihupo.domain.entity.SysUser; import cn.yinlihupo.domain.entity.Task; import cn.yinlihupo.domain.vo.DailyReportAnalysisSuggestionsVO; import cn.yinlihupo.domain.vo.DailyReportUpdateSuggestionVO; @@ -16,10 +17,12 @@ import cn.yinlihupo.mapper.DailyReportAnalysisRecordMapper; import cn.yinlihupo.mapper.DailyReportUpdateSuggestionMapper; import cn.yinlihupo.mapper.ProjectDailyReportMapper; import cn.yinlihupo.mapper.ProjectMilestoneMapper; +import cn.yinlihupo.mapper.SysUserMapper; import cn.yinlihupo.mapper.TaskMapper; import cn.yinlihupo.service.analysis.DailyReportSuggestionService; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import lombok.RequiredArgsConstructor; @@ -46,6 +49,7 @@ public class DailyReportSuggestionServiceImpl implements DailyReportSuggestionSe private final DailyReportUpdateSuggestionMapper dailyReportUpdateSuggestionMapper; private final TaskMapper taskMapper; private final ProjectMilestoneMapper projectMilestoneMapper; + private final SysUserMapper sysUserMapper; @Override public DailyReportAnalysisSuggestionsVO getLatestSuggestionsByReportId(Long projectId, Long reportId) { @@ -169,6 +173,36 @@ public class DailyReportSuggestionServiceImpl implements DailyReportSuggestionSe .filter(Objects::nonNull) .toList(); + List submitterIds = reports.stream() + .filter(Objects::nonNull) + .map(ProjectDailyReport::getSubmitterId) + .filter(Objects::nonNull) + .distinct() + .toList(); + + List submitterUsernames = reports.stream() + .filter(Objects::nonNull) + .map(ProjectDailyReport::getSubmitterUsername) + .filter(StringUtils::hasText) + .distinct() + .toList(); + + Map submitterById = submitterIds.isEmpty() + ? Collections.emptyMap() + : sysUserMapper.selectBatchIds(submitterIds).stream() + .filter(u -> u != null && u.getDeleted() != null && u.getDeleted() == 0) + .collect(Collectors.toMap(SysUser::getId, Function.identity(), (a, b) -> a)); + + Map submitterByUsername = submitterUsernames.isEmpty() + ? Collections.emptyMap() + : sysUserMapper.selectList( + new LambdaQueryWrapper() + .in(SysUser::getUsername, submitterUsernames) + .eq(SysUser::getDeleted, 0) + ).stream() + .filter(Objects::nonNull) + .collect(Collectors.toMap(SysUser::getUsername, Function.identity(), (a, b) -> a)); + Map latestAnalysisByReportId = new HashMap<>(); if (!reportIds.isEmpty()) { List analysisRecords = dailyReportAnalysisRecordMapper.selectList( @@ -222,6 +256,7 @@ public class DailyReportSuggestionServiceImpl implements DailyReportSuggestionSe vo.setReportDate(report.getReportDate()); vo.setSubmitterUsername(report.getSubmitterUsername()); vo.setSubmitterId(report.getSubmitterId()); + vo.setSubmitterName(resolveSubmitterName(report, submitterByUsername, submitterById)); vo.setWorkContent(report.getWorkContent()); vo.setTomorrowPlan(report.getTomorrowPlan()); vo.setWorkIntensity(report.getWorkIntensity()); @@ -234,8 +269,7 @@ public class DailyReportSuggestionServiceImpl implements DailyReportSuggestionSe vo.setAnalysisId(record.getId()); vo.setAnalysisStatus(record.getStatus()); if (record.getAnalysisResult() != null) { - DailyReportAnalysisResult analysisResult = OBJECT_MAPPER.convertValue(record.getAnalysisResult(), DailyReportAnalysisResult.class); - vo.setAnalysisResult(analysisResult); + vo.setAnalysisResult(parseAnalysisResult(record.getAnalysisResult())); } vo.setAnalysisSuggestions(record.getId() != null ? suggestionsByAnalysisId.getOrDefault(record.getId(), List.of()) : List.of()); } else { @@ -249,6 +283,36 @@ public class DailyReportSuggestionServiceImpl implements DailyReportSuggestionSe .setRecords(voList)); } + private String resolveSubmitterName(ProjectDailyReport report, + Map submitterByUsername, + Map submitterById) { + if (report == null) { + return null; + } + + SysUser user = null; + if (StringUtils.hasText(report.getSubmitterUsername())) { + user = submitterByUsername.get(report.getSubmitterUsername()); + } + if (user == null && report.getSubmitterId() != null) { + user = submitterById.get(report.getSubmitterId()); + } + + if (user != null) { + if (StringUtils.hasText(user.getRealName())) { + return user.getRealName(); + } + if (StringUtils.hasText(user.getNickname())) { + return user.getNickname(); + } + if (StringUtils.hasText(user.getUsername())) { + return user.getUsername(); + } + } + + return StringUtils.hasText(report.getSubmitterUsername()) ? report.getSubmitterUsername() : null; + } + @Override @Transactional(rollbackFor = Exception.class) public int applySuggestions(Long projectId, List suggestionIds, Long appliedBy) { @@ -387,10 +451,7 @@ public class DailyReportSuggestionServiceImpl implements DailyReportSuggestionSe } private DailyReportAnalysisSuggestionsVO buildSuggestionsVO(DailyReportAnalysisRecord record, String suggestionStatus) { - DailyReportAnalysisResult analysisResult = null; - if (record.getAnalysisResult() != null) { - analysisResult = OBJECT_MAPPER.convertValue(record.getAnalysisResult(), DailyReportAnalysisResult.class); - } + DailyReportAnalysisResult analysisResult = parseAnalysisResult(record.getAnalysisResult()); List suggestions = dailyReportUpdateSuggestionMapper.selectList( new LambdaQueryWrapper() @@ -469,6 +530,30 @@ public class DailyReportSuggestionServiceImpl implements DailyReportSuggestionSe return vo; } + private DailyReportAnalysisResult parseAnalysisResult(Object raw) { + if (raw == null) { + return null; + } + if (raw instanceof DailyReportAnalysisResult result) { + return result; + } + if (raw instanceof String json) { + if (!StringUtils.hasText(json)) { + return null; + } + try { + return OBJECT_MAPPER.readValue(json, DailyReportAnalysisResult.class); + } catch (JsonProcessingException e) { + return null; + } + } + try { + return OBJECT_MAPPER.convertValue(raw, DailyReportAnalysisResult.class); + } catch (IllegalArgumentException e) { + return null; + } + } + private List buildSuggestionVOList(Long projectId, List suggestions) { if (suggestions == null || suggestions.isEmpty()) { return List.of();