bug修复
This commit is contained in:
@@ -97,4 +97,15 @@ public class UserProfileController {
|
||||
List<UserProfileResponse> list = userProfileService.getProfileList(request);
|
||||
return Result.success(list);
|
||||
}
|
||||
|
||||
/**
|
||||
* 迁移用户档案中的生命事件数据到t_life_event表
|
||||
* 将childhood、peak、valley数据迁移到生命事件表
|
||||
* 注意:此接口为一次性数据迁移接口,迁移完成后可删除
|
||||
*/
|
||||
@PostMapping("/migrateLifeEvents")
|
||||
public Result<Integer> migrateLifeEvents() {
|
||||
int count = userProfileService.migrateLifeEventsFromProfiles();
|
||||
return Result.success(count);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,4 +72,12 @@ public interface UserProfileService extends IService<UserProfile> {
|
||||
* @return 是否成功
|
||||
*/
|
||||
boolean deleteProfile(String id);
|
||||
|
||||
/**
|
||||
* 迁移用户档案中的生命事件数据到t_life_event表
|
||||
* 将childhood、peak、valley数据迁移到生命事件表
|
||||
*
|
||||
* @return 迁移的记录数
|
||||
*/
|
||||
int migrateLifeEventsFromProfiles();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user