feat(日报分析): 在日报分析结果中增加提交者姓名显示
添加 submitterName 字段到 DailyReportWithAnalysisVO 以展示提交者真实姓名 重构分析结果解析逻辑,支持多种原始数据类型转换 优化用户信息查询,通过 ID 或用户名批量获取并缓存用户数据
This commit is contained in:
@@ -20,6 +20,8 @@ public class DailyReportWithAnalysisVO {
|
||||
|
||||
private Long submitterId;
|
||||
|
||||
private String submitterName;
|
||||
|
||||
private String workContent;
|
||||
|
||||
private String tomorrowPlan;
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user