feat(日报分析): 在日报分析结果中增加提交者姓名显示

添加 submitterName 字段到 DailyReportWithAnalysisVO 以展示提交者真实姓名
重构分析结果解析逻辑,支持多种原始数据类型转换
优化用户信息查询,通过 ID 或用户名批量获取并缓存用户数据
This commit is contained in:
2026-04-01 16:38:13 +08:00
parent 9d1294d197
commit 6208ff36fe
2 changed files with 93 additions and 6 deletions

View File

@@ -20,6 +20,8 @@ public class DailyReportWithAnalysisVO {
private Long submitterId;
private String submitterName;
private String workContent;
private String tomorrowPlan;

View File

@@ -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<Long> submitterIds = reports.stream()
.filter(Objects::nonNull)
.map(ProjectDailyReport::getSubmitterId)
.filter(Objects::nonNull)
.distinct()
.toList();
List<String> submitterUsernames = reports.stream()
.filter(Objects::nonNull)
.map(ProjectDailyReport::getSubmitterUsername)
.filter(StringUtils::hasText)
.distinct()
.toList();
Map<Long, SysUser> 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<String, SysUser> submitterByUsername = submitterUsernames.isEmpty()
? Collections.emptyMap()
: sysUserMapper.selectList(
new LambdaQueryWrapper<SysUser>()
.in(SysUser::getUsername, submitterUsernames)
.eq(SysUser::getDeleted, 0)
).stream()
.filter(Objects::nonNull)
.collect(Collectors.toMap(SysUser::getUsername, Function.identity(), (a, b) -> a));
Map<Long, DailyReportAnalysisRecord> latestAnalysisByReportId = new HashMap<>();
if (!reportIds.isEmpty()) {
List<DailyReportAnalysisRecord> 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<String, SysUser> submitterByUsername,
Map<Long, SysUser> 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<Long> 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<DailyReportUpdateSuggestion> suggestions = dailyReportUpdateSuggestionMapper.selectList(
new LambdaQueryWrapper<DailyReportUpdateSuggestion>()
@@ -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<DailyReportUpdateSuggestionVO> buildSuggestionVOList(Long projectId, List<DailyReportUpdateSuggestion> suggestions) {
if (suggestions == null || suggestions.isEmpty()) {
return List.of();