bug修复

This commit is contained in:
2025-12-22 23:40:47 +08:00
parent 7d53a059d7
commit 1fefd98d74
19 changed files with 1339 additions and 534 deletions
@@ -34,6 +34,7 @@ public class LifeEventServiceImpl extends ServiceImpl<LifeEventMapper, LifeEvent
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
private static final DateTimeFormatter ISO_FORMATTER = DateTimeFormatter.ISO_DATE_TIME;
private static final DateTimeFormatter DATE_ONLY_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@Override
public PageResult<LifeEventResponse> getPageByCurrentUser(LifeEventPageRequest request) {
@@ -130,16 +131,8 @@ public class LifeEventServiceImpl extends ServiceImpl<LifeEventMapper, LifeEvent
event.setEmotionType(request.getEmotionType());
event.setTags(request.getTags());
// 解析事件日期
if (StringUtils.hasText(request.getEventDate())) {
try {
event.setEventDate(LocalDateTime.parse(request.getEventDate(), ISO_FORMATTER));
} catch (Exception e) {
event.setEventDate(LocalDateTime.now());
}
} else {
event.setEventDate(LocalDateTime.now());
}
// 解析事件日期,支持多种格式
event.setEventDate(parseEventDate(request.getEventDate()));
// 情绪评分
if (request.getEmotionScore() != null) {
@@ -183,10 +176,7 @@ public class LifeEventServiceImpl extends ServiceImpl<LifeEventMapper, LifeEvent
event.setTags(request.getTags());
}
if (StringUtils.hasText(request.getEventDate())) {
try {
event.setEventDate(LocalDateTime.parse(request.getEventDate(), ISO_FORMATTER));
} catch (Exception ignored) {
}
event.setEventDate(parseEventDate(request.getEventDate()));
}
if (request.getEmotionScore() != null) {
event.setEmotionScore(BigDecimal.valueOf(request.getEmotionScore()));
@@ -234,4 +224,38 @@ public class LifeEventServiceImpl extends ServiceImpl<LifeEventMapper, LifeEvent
}
return response;
}
/**
* 解析事件日期,支持多种格式
* 支持格式:yyyy-MM-dd、yyyy-MM-ddTHH:mm:ss、ISO_DATE_TIME
*
* @param dateStr 日期字符串
* @return 解析后的LocalDateTime,解析失败返回当前时间
*/
private LocalDateTime parseEventDate(String dateStr) {
if (!StringUtils.hasText(dateStr)) {
return LocalDateTime.now();
}
// 尝试ISO格式 (yyyy-MM-ddTHH:mm:ss.SSSZ)
try {
return LocalDateTime.parse(dateStr, ISO_FORMATTER);
} catch (Exception ignored) {
}
// 尝试日期时间格式 (yyyy-MM-dd HH:mm:ss)
try {
return LocalDateTime.parse(dateStr, DATE_TIME_FORMATTER);
} catch (Exception ignored) {
}
// 尝试纯日期格式 (yyyy-MM-dd),时间设为当天开始
try {
return java.time.LocalDate.parse(dateStr, DATE_ONLY_FORMATTER).atStartOfDay();
} catch (Exception ignored) {
}
// 所有格式都失败,返回当前时间
return LocalDateTime.now();
}
}
@@ -11,18 +11,24 @@ import com.emotion.dto.request.userprofile.UserProfileCreateRequest;
import com.emotion.dto.request.userprofile.UserProfilePageRequest;
import com.emotion.dto.request.userprofile.UserProfileUpdateRequest;
import com.emotion.dto.response.userprofile.UserProfileResponse;
import com.emotion.entity.LifeEvent;
import com.emotion.entity.User;
import com.emotion.entity.UserProfile;
import com.emotion.mapper.UserProfileMapper;
import com.emotion.service.LifeEventService;
import com.emotion.service.UserProfileService;
import com.emotion.service.UserService;
import com.emotion.util.UserContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@@ -39,6 +45,10 @@ public class UserProfileServiceImpl extends ServiceImpl<UserProfileMapper, UserP
@Autowired
private UserService userService;
@Lazy
@Autowired
private LifeEventService lifeEventService;
@Override
public UserProfileResponse createProfile(UserProfileCreateRequest request) {
log.info("Creating user profile: {}", request);
@@ -207,6 +217,126 @@ public class UserProfileServiceImpl extends ServiceImpl<UserProfileMapper, UserP
return removeById(id);
}
@Override
@Transactional(rollbackFor = Exception.class)
public int migrateLifeEventsFromProfiles() {
log.info("开始迁移用户档案中的生命事件数据到t_life_event表");
// 查询所有有生命事件数据的用户档案
LambdaQueryWrapper<UserProfile> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.and(w -> w
.isNotNull(UserProfile::getChildhoodContent).ne(UserProfile::getChildhoodContent, "")
.or().isNotNull(UserProfile::getPeakContent).ne(UserProfile::getPeakContent, "")
.or().isNotNull(UserProfile::getValleyContent).ne(UserProfile::getValleyContent, "")
);
List<UserProfile> profiles = list(queryWrapper);
log.info("找到 {} 个有生命事件数据的用户档案", profiles.size());
int migratedCount = 0;
for (UserProfile profile : profiles) {
String userId = profile.getUserId();
List<LifeEvent> eventsToSave = new ArrayList<>();
// 迁移童年记忆
if (StringUtils.hasText(profile.getChildhoodContent())) {
if (!isEventExists(userId, "childhood")) {
LifeEvent childhoodEvent = createLifeEventFromProfile(
userId,
"童年记忆",
profile.getChildhoodContent(),
profile.getChildhoodDate(),
"childhood"
);
eventsToSave.add(childhoodEvent);
}
}
// 迁移高光时刻 (peak -> joy)
if (StringUtils.hasText(profile.getPeakContent())) {
if (!isEventExists(userId, "joy")) {
LifeEvent peakEvent = createLifeEventFromProfile(
userId,
"光芒闪耀的时刻",
profile.getPeakContent(),
profile.getPeakDate(),
"joy"
);
eventsToSave.add(peakEvent);
}
}
// 迁移低谷时期 (valley -> low)
if (StringUtils.hasText(profile.getValleyContent())) {
if (!isEventExists(userId, "low")) {
LifeEvent valleyEvent = createLifeEventFromProfile(
userId,
"在暗夜中潜行",
profile.getValleyContent(),
profile.getValleyDate(),
"low"
);
eventsToSave.add(valleyEvent);
}
}
// 批量保存
if (!eventsToSave.isEmpty()) {
lifeEventService.saveBatch(eventsToSave);
migratedCount += eventsToSave.size();
log.info("用户 {} 迁移了 {} 条生命事件", userId, eventsToSave.size());
}
}
log.info("生命事件数据迁移完成,共迁移 {} 条记录", migratedCount);
return migratedCount;
}
/**
* 检查用户是否已存在指定标签的生命事件
*
* @param userId 用户ID
* @param tag 标签
* @return 是否存在
*/
private boolean isEventExists(String userId, String tag) {
LambdaQueryWrapper<LifeEvent> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(LifeEvent::getUserId, userId)
.eq(LifeEvent::getIsDeleted, 0)
.like(LifeEvent::getTags, tag);
return lifeEventService.count(wrapper) > 0;
}
/**
* 从用户档案数据创建生命事件
*
* @param userId 用户ID
* @param title 事件标题
* @param content 事件内容
* @param eventDate 事件日期
* @param tag 事件标签
* @return 生命事件实体
*/
private LifeEvent createLifeEventFromProfile(String userId, String title, String content,
LocalDate eventDate, String tag) {
LifeEvent event = new LifeEvent();
event.setUserId(userId);
event.setTitle(title);
event.setContent(content);
event.setEventType("milestone");
event.setTags(List.of(tag));
// 设置事件日期,如果没有则使用当前时间
if (eventDate != null) {
event.setEventDate(eventDate.atStartOfDay());
} else {
event.setEventDate(java.time.LocalDateTime.now());
}
return event;
}
private UserProfileResponse convertToResponse(UserProfile userProfile) {
if (userProfile == null) {
return null;