feat(日报分析): 在日报分析结果中增加提交者姓名显示
添加 submitterName 字段到 DailyReportWithAnalysisVO 以展示提交者真实姓名 重构分析结果解析逻辑,支持多种原始数据类型转换 优化用户信息查询,通过 ID 或用户名批量获取并缓存用户数据
This commit is contained in:
@@ -20,6 +20,8 @@ public class DailyReportWithAnalysisVO {
|
|||||||
|
|
||||||
private Long submitterId;
|
private Long submitterId;
|
||||||
|
|
||||||
|
private String submitterName;
|
||||||
|
|
||||||
private String workContent;
|
private String workContent;
|
||||||
|
|
||||||
private String tomorrowPlan;
|
private String tomorrowPlan;
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import cn.yinlihupo.domain.entity.DailyReportAnalysisRecord;
|
|||||||
import cn.yinlihupo.domain.entity.DailyReportUpdateSuggestion;
|
import cn.yinlihupo.domain.entity.DailyReportUpdateSuggestion;
|
||||||
import cn.yinlihupo.domain.entity.ProjectDailyReport;
|
import cn.yinlihupo.domain.entity.ProjectDailyReport;
|
||||||
import cn.yinlihupo.domain.entity.ProjectMilestone;
|
import cn.yinlihupo.domain.entity.ProjectMilestone;
|
||||||
|
import cn.yinlihupo.domain.entity.SysUser;
|
||||||
import cn.yinlihupo.domain.entity.Task;
|
import cn.yinlihupo.domain.entity.Task;
|
||||||
import cn.yinlihupo.domain.vo.DailyReportAnalysisSuggestionsVO;
|
import cn.yinlihupo.domain.vo.DailyReportAnalysisSuggestionsVO;
|
||||||
import cn.yinlihupo.domain.vo.DailyReportUpdateSuggestionVO;
|
import cn.yinlihupo.domain.vo.DailyReportUpdateSuggestionVO;
|
||||||
@@ -16,10 +17,12 @@ import cn.yinlihupo.mapper.DailyReportAnalysisRecordMapper;
|
|||||||
import cn.yinlihupo.mapper.DailyReportUpdateSuggestionMapper;
|
import cn.yinlihupo.mapper.DailyReportUpdateSuggestionMapper;
|
||||||
import cn.yinlihupo.mapper.ProjectDailyReportMapper;
|
import cn.yinlihupo.mapper.ProjectDailyReportMapper;
|
||||||
import cn.yinlihupo.mapper.ProjectMilestoneMapper;
|
import cn.yinlihupo.mapper.ProjectMilestoneMapper;
|
||||||
|
import cn.yinlihupo.mapper.SysUserMapper;
|
||||||
import cn.yinlihupo.mapper.TaskMapper;
|
import cn.yinlihupo.mapper.TaskMapper;
|
||||||
import cn.yinlihupo.service.analysis.DailyReportSuggestionService;
|
import cn.yinlihupo.service.analysis.DailyReportSuggestionService;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
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.ObjectMapper;
|
||||||
import com.fasterxml.jackson.databind.SerializationFeature;
|
import com.fasterxml.jackson.databind.SerializationFeature;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
@@ -46,6 +49,7 @@ public class DailyReportSuggestionServiceImpl implements DailyReportSuggestionSe
|
|||||||
private final DailyReportUpdateSuggestionMapper dailyReportUpdateSuggestionMapper;
|
private final DailyReportUpdateSuggestionMapper dailyReportUpdateSuggestionMapper;
|
||||||
private final TaskMapper taskMapper;
|
private final TaskMapper taskMapper;
|
||||||
private final ProjectMilestoneMapper projectMilestoneMapper;
|
private final ProjectMilestoneMapper projectMilestoneMapper;
|
||||||
|
private final SysUserMapper sysUserMapper;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DailyReportAnalysisSuggestionsVO getLatestSuggestionsByReportId(Long projectId, Long reportId) {
|
public DailyReportAnalysisSuggestionsVO getLatestSuggestionsByReportId(Long projectId, Long reportId) {
|
||||||
@@ -169,6 +173,36 @@ public class DailyReportSuggestionServiceImpl implements DailyReportSuggestionSe
|
|||||||
.filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
.toList();
|
.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<>();
|
Map<Long, DailyReportAnalysisRecord> latestAnalysisByReportId = new HashMap<>();
|
||||||
if (!reportIds.isEmpty()) {
|
if (!reportIds.isEmpty()) {
|
||||||
List<DailyReportAnalysisRecord> analysisRecords = dailyReportAnalysisRecordMapper.selectList(
|
List<DailyReportAnalysisRecord> analysisRecords = dailyReportAnalysisRecordMapper.selectList(
|
||||||
@@ -222,6 +256,7 @@ public class DailyReportSuggestionServiceImpl implements DailyReportSuggestionSe
|
|||||||
vo.setReportDate(report.getReportDate());
|
vo.setReportDate(report.getReportDate());
|
||||||
vo.setSubmitterUsername(report.getSubmitterUsername());
|
vo.setSubmitterUsername(report.getSubmitterUsername());
|
||||||
vo.setSubmitterId(report.getSubmitterId());
|
vo.setSubmitterId(report.getSubmitterId());
|
||||||
|
vo.setSubmitterName(resolveSubmitterName(report, submitterByUsername, submitterById));
|
||||||
vo.setWorkContent(report.getWorkContent());
|
vo.setWorkContent(report.getWorkContent());
|
||||||
vo.setTomorrowPlan(report.getTomorrowPlan());
|
vo.setTomorrowPlan(report.getTomorrowPlan());
|
||||||
vo.setWorkIntensity(report.getWorkIntensity());
|
vo.setWorkIntensity(report.getWorkIntensity());
|
||||||
@@ -234,8 +269,7 @@ public class DailyReportSuggestionServiceImpl implements DailyReportSuggestionSe
|
|||||||
vo.setAnalysisId(record.getId());
|
vo.setAnalysisId(record.getId());
|
||||||
vo.setAnalysisStatus(record.getStatus());
|
vo.setAnalysisStatus(record.getStatus());
|
||||||
if (record.getAnalysisResult() != null) {
|
if (record.getAnalysisResult() != null) {
|
||||||
DailyReportAnalysisResult analysisResult = OBJECT_MAPPER.convertValue(record.getAnalysisResult(), DailyReportAnalysisResult.class);
|
vo.setAnalysisResult(parseAnalysisResult(record.getAnalysisResult()));
|
||||||
vo.setAnalysisResult(analysisResult);
|
|
||||||
}
|
}
|
||||||
vo.setAnalysisSuggestions(record.getId() != null ? suggestionsByAnalysisId.getOrDefault(record.getId(), List.of()) : List.of());
|
vo.setAnalysisSuggestions(record.getId() != null ? suggestionsByAnalysisId.getOrDefault(record.getId(), List.of()) : List.of());
|
||||||
} else {
|
} else {
|
||||||
@@ -249,6 +283,36 @@ public class DailyReportSuggestionServiceImpl implements DailyReportSuggestionSe
|
|||||||
.setRecords(voList));
|
.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
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public int applySuggestions(Long projectId, List<Long> suggestionIds, Long appliedBy) {
|
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) {
|
private DailyReportAnalysisSuggestionsVO buildSuggestionsVO(DailyReportAnalysisRecord record, String suggestionStatus) {
|
||||||
DailyReportAnalysisResult analysisResult = null;
|
DailyReportAnalysisResult analysisResult = parseAnalysisResult(record.getAnalysisResult());
|
||||||
if (record.getAnalysisResult() != null) {
|
|
||||||
analysisResult = OBJECT_MAPPER.convertValue(record.getAnalysisResult(), DailyReportAnalysisResult.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
List<DailyReportUpdateSuggestion> suggestions = dailyReportUpdateSuggestionMapper.selectList(
|
List<DailyReportUpdateSuggestion> suggestions = dailyReportUpdateSuggestionMapper.selectList(
|
||||||
new LambdaQueryWrapper<DailyReportUpdateSuggestion>()
|
new LambdaQueryWrapper<DailyReportUpdateSuggestion>()
|
||||||
@@ -469,6 +530,30 @@ public class DailyReportSuggestionServiceImpl implements DailyReportSuggestionSe
|
|||||||
return vo;
|
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) {
|
private List<DailyReportUpdateSuggestionVO> buildSuggestionVOList(Long projectId, List<DailyReportUpdateSuggestion> suggestions) {
|
||||||
if (suggestions == null || suggestions.isEmpty()) {
|
if (suggestions == null || suggestions.isEmpty()) {
|
||||||
return List.of();
|
return List.of();
|
||||||
|
|||||||
Reference in New Issue
Block a user