This commit is contained in:
2025-09-09 11:13:36 +08:00
parent cf50a9f1fa
commit fcd35c78e5
60 changed files with 2753 additions and 2196 deletions
@@ -8,9 +8,6 @@ import com.emotion.dto.request.EmotionRecordUpdateRequest;
import com.emotion.dto.response.EmotionRecordResponse;
import com.emotion.service.EmotionRecordService;
import com.emotion.util.CurrentUserUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -18,8 +15,6 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.Map;
@@ -30,8 +25,7 @@ import java.util.Map;
* @date 2025-07-22
*/
@RestController
@RequestMapping("/emotion-records")
@Tag(name = "情绪记录管理", description = "用户情绪记录的增删改查功能")
@RequestMapping("/emotionRecord")
public class EmotionRecordController {
private static final Logger log = LoggerFactory.getLogger(EmotionRecordController.class);
@@ -42,8 +36,7 @@ public class EmotionRecordController {
/**
* 创建情绪记录
*/
@PostMapping
@Operation(summary = "创建情绪记录", description = "创建新的情绪记录")
@PostMapping(value = "/create")
public Result<EmotionRecordResponse> createRecord(@RequestBody @Valid EmotionRecordCreateRequest request) {
log.info("创建情绪记录: userId={}", request.getUserId());
@@ -56,51 +49,27 @@ public class EmotionRecordController {
}
/**
* 获取用户情绪记录列表
* 分页查询情绪记录
*/
@Operation(summary = "获取用户情绪记录列表", description = "分页获取当前用户的情绪记录,按创建时间倒序")
@GetMapping("/user")
public Result<PageResult<EmotionRecordResponse>> getRecordList(
@Validated EmotionRecordPageRequest request) {
@GetMapping(value = "/page")
public Result<PageResult<EmotionRecordResponse>> getPage(@Validated EmotionRecordPageRequest request) {
// 从上下文中获取当前用户ID
String userId = CurrentUserUtil.requireCurrentUserId();
log.info("获取用户情绪记录列表: userId={}, current={}, size={}", userId, request.getCurrent(), request.getSize());
log.info("分页查询情绪记录: userId={}, current={}, size={}", userId, request.getCurrent(), request.getSize());
PageResult<EmotionRecordResponse> page = emotionRecordService.getPageByUserIdWithResponse(userId, request);
log.info("获取用户情绪记录成功: userId={}, total={}, records={}",
userId, page.getTotal(), page.getRecords().size());
log.info("分页查询情绪记录成功: userId={}, total={}, records={}",
userId, page.getTotal(), page.getRecords().size());
return Result.success(page);
}
/**
* 获取用户最近情绪记录
*/
@Operation(summary = "获取用户最近情绪记录", description = "获取当前用户最近的情绪记录列表")
@GetMapping("/user/recent")
public Result<List<EmotionRecordResponse>> getRecentRecords(
@Parameter(description = "限制数量") @RequestParam(defaultValue = "5") Integer limit) {
// 从上下文中获取当前用户ID
String userId = CurrentUserUtil.requireCurrentUserId();
log.info("获取用户最近情绪记录: userId={}, limit={}", userId, limit);
List<EmotionRecordResponse> records = emotionRecordService.getRecentByUserIdWithResponse(userId, limit);
log.info("获取用户最近情绪记录成功: userId={}, records={}", userId, records.size());
return Result.success(records);
}
/**
* 获取情绪记录详情
*/
@Operation(summary = "获取情绪记录详情", description = "根据ID获取情绪记录详情")
@GetMapping
@GetMapping(value = "/detail")
public Result<EmotionRecordResponse> getRecord(@RequestParam String id) {
log.info("获取情绪记录详情: {}", id);
@@ -114,8 +83,7 @@ public class EmotionRecordController {
/**
* 更新情绪记录
*/
@Operation(summary = "更新情绪记录", description = "更新指定的情绪记录")
@PutMapping
@PutMapping(value = "/update")
public Result<EmotionRecordResponse> updateRecord(@RequestBody @Valid EmotionRecordUpdateRequest request) {
log.info("更新情绪记录: {}", request.getId());
@@ -129,8 +97,7 @@ public class EmotionRecordController {
/**
* 删除情绪记录
*/
@Operation(summary = "删除情绪记录", description = "删除指定的情绪记录")
@DeleteMapping
@DeleteMapping(value = "/delete")
public Result<String> deleteRecord(@RequestParam String id) {
log.info("删除情绪记录: {}", id);
@@ -144,8 +111,7 @@ public class EmotionRecordController {
/**
* 获取情绪统计
*/
@Operation(summary = "获取情绪统计", description = "获取当前用户的情绪统计信息")
@GetMapping("/stats")
@GetMapping(value = "/stats")
public Result<Map<String, Object>> getEmotionStats(
@RequestParam(required = false) String startDate,
@RequestParam(required = false) String endDate) {
@@ -1,16 +1,20 @@
package com.emotion.controller;
import com.emotion.common.Result;
import com.emotion.dto.request.EmotionSummaryGenerateRequest;
import com.emotion.dto.request.EmotionSummaryStatusRequest;
import com.emotion.dto.response.EmotionSummaryGenerateResponse;
import com.emotion.dto.response.EmotionSummaryStatusResponse;
import com.emotion.service.AiChatService;
import com.emotion.util.CurrentUserUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.scheduling.annotation.Async;
import java.util.concurrent.CompletableFuture;
import java.util.Map;
import javax.validation.Valid;
/**
* 情绪总结控制器
@@ -20,64 +24,49 @@ import java.util.Map;
*/
@Slf4j
@RestController
@RequestMapping("/emotion-summary")
@RequestMapping("/emotionSummary")
@Tag(name = "情绪总结管理", description = "用户情绪记录总结和分析功能")
public class EmotionSummaryController {
@Autowired
private AiChatService aiChatService;
/**
* 生成用户当天的情绪记录总结
*/
@Operation(summary = "生成用户当天的情绪记录总结", description = "基于用户当天的聊天记录生成情绪分析和记录")
@PostMapping("/generate")
public Result<Map<String, Object>> generateEmotionSummary() {
try {
String userId = CurrentUserUtil.requireCurrentUserId();
log.info("收到生成情绪记录总结请求: userId={}", userId);
// 调用AI服务异步生成情绪总结(阻塞获取结果)
Map<String, Object> result = aiChatService.generateEmotionSummaryAsync(userId).get();
if ((Boolean) result.get("success")) {
log.info("情绪记录总结生成成功: userId={}", userId);
return Result.success("情绪记录总结生成成功", result);
} else {
String message = (String) result.get("message");
log.warn("情绪记录总结生成失败: userId={}, message={}", userId, message);
return Result.error(message);
}
} catch (IllegalStateException e) {
log.warn("用户认证失败: {}", e.getMessage());
return Result.error(e.getMessage());
} catch (Exception e) {
log.error("生成情绪记录总结时发生异常", e);
return Result.error("生成情绪记录总结失败: " + e.getMessage());
@PostMapping(value = "/generate")
public Result<EmotionSummaryGenerateResponse> generateEmotionSummary(
@RequestBody @Valid EmotionSummaryGenerateRequest request) {
String userId = CurrentUserUtil.requireCurrentUserId();
log.info("收到生成情绪记录总结请求: userId={}", userId);
// 调用AI服务生成情绪总结
EmotionSummaryGenerateResponse response = aiChatService.generateEmotionSummaryWithResponse(userId);
if (response.getSuccess()) {
log.info("情绪记录总结生成成功: userId={}", userId);
return Result.success("情绪记录总结生成成功", response);
} else {
log.warn("情绪记录总结生成失败: userId={}, message={}", userId, response.getMessage());
return Result.error(response.getMessage());
}
}
/**
* 获取用户情绪记录总结状态
*/
@Operation(summary = "获取用户情绪记录总结状态", description = "检查用户今天是否已经生成过情绪记录")
@GetMapping("/status")
public Result<Map<String, Object>> getEmotionSummaryStatus() {
@GetMapping(value = "/status")
public Result<EmotionSummaryStatusResponse> getEmotionSummaryStatus(
@Validated EmotionSummaryStatusRequest request) {
// 从上下文中获取当前用户ID
String userId = CurrentUserUtil.requireCurrentUserId();
log.info("查询用户情绪记录总结状态: userId={}", userId);
try {
// 从上下文中获取当前用户ID
String userId = CurrentUserUtil.requireCurrentUserId();
// 调用AI服务获取状态信息
EmotionSummaryStatusResponse response = aiChatService.getEmotionSummaryStatusWithResponse(userId);
log.info("查询用户情绪记录总结状态: userId={}", userId);
// 这里可以添加检查用户今天是否已经生成过情绪记录的逻辑
// 暂时返回基本状态信息
Map<String, Object> status = Map.of(
"userId", userId,
"canGenerate", true,
"message", "可以生成情绪记录总结"
);
return Result.success(status);
} catch (IllegalStateException e) {
log.warn("用户认证失败: {}", e.getMessage());
return Result.error(e.getMessage());
} catch (Exception e) {
log.error("查询情绪记录总结状态时发生异常", e);
return Result.error("查询状态失败: " + e.getMessage());
}
return Result.success(response);
}
}
}
@@ -1,19 +1,26 @@
package com.emotion.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.emotion.common.PageResult;
import com.emotion.common.Result;
import com.emotion.dto.request.PageRequest;
import com.emotion.entity.GrowthTopic;
import com.emotion.dto.request.growth.GrowthTopicCreateRequest;
import com.emotion.dto.request.growth.GrowthTopicPageRequest;
import com.emotion.dto.request.growth.GrowthTopicUpdateRequest;
import com.emotion.dto.response.growth.GrowthTopicResponse;
import com.emotion.service.GrowthTopicService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.List;
import javax.validation.Valid;
/**
* 成长话题控制器
*
* @author emotion-museum
* @date 2025-09-08
*/
@RestController
@RequestMapping("/growth-topic")
@RequestMapping("/growthTopic")
public class GrowthTopicController {
@Autowired
@@ -22,49 +29,54 @@ public class GrowthTopicController {
/**
* 分页查询成长话题
*/
@GetMapping("/page")
public Result<IPage<GrowthTopic>> getPage(@Validated PageRequest request) {
IPage<GrowthTopic> page = growthTopicService.getPage(request);
return Result.success(page);
@GetMapping(value = "/page")
public Result<PageResult<GrowthTopicResponse>> getPage(@Validated GrowthTopicPageRequest request) {
PageResult<GrowthTopicResponse> pageResult = growthTopicService.getPageWithResponse(request);
return Result.success(pageResult);
}
/**
* 根据ID获取成长话题
*/
@GetMapping(value = "/detail")
public Result<GrowthTopicResponse> getById(@RequestParam String id) {
GrowthTopicResponse response = growthTopicService.getGrowthTopicResponseById(id);
if (response == null) {
return Result.notFound("成长话题不存在");
}
return Result.success(response);
}
/**
* 创建成长话题
*/
@PostMapping("/create")
public Result<GrowthTopic> createGrowthTopic(@RequestBody @Validated GrowthTopicCreateRequest request) {
GrowthTopic topic = growthTopicService.createGrowthTopic(
request.getTitle(),
request.getDescription(),
request.getCategory(),
request.getDifficultyLevel(),
request.getTags(),
request.getEndTime()
);
return Result.success(topic);
@PostMapping(value = "/create")
public Result<GrowthTopicResponse> create(@Valid @RequestBody GrowthTopicCreateRequest request) {
GrowthTopicResponse response = growthTopicService.createGrowthTopicWithResponse(request);
return Result.success(response);
}
// 可根据GrowthTopicService接口继续补充其他接口...
public static class GrowthTopicCreateRequest {
private String title;
private String description;
private String category;
private String difficultyLevel;
private String tags;
private LocalDateTime endTime;
// getter/setter
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
public String getDescription() { return description; }
public void setDescription(String description) { this.description = description; }
public String getCategory() { return category; }
public void setCategory(String category) { this.category = category; }
public String getDifficultyLevel() { return difficultyLevel; }
public void setDifficultyLevel(String difficultyLevel) { this.difficultyLevel = difficultyLevel; }
public String getTags() { return tags; }
public void setTags(String tags) { this.tags = tags; }
public LocalDateTime getEndTime() { return endTime; }
public void setEndTime(LocalDateTime endTime) { this.endTime = endTime; }
/**
* 更新成长话题
*/
@PutMapping(value = "/update")
public Result<GrowthTopicResponse> update(@Valid @RequestBody GrowthTopicUpdateRequest request) {
GrowthTopicResponse response = growthTopicService.updateGrowthTopicWithResponse(request);
if (response == null) {
return Result.notFound("成长话题不存在");
}
return Result.success(response);
}
}
/**
* 删除成长话题
*/
@DeleteMapping(value = "/delete")
public Result<Void> delete(@RequestParam String id) {
boolean deleted = growthTopicService.deleteGrowthTopic(id);
if (!deleted) {
return Result.error("删除失败");
}
return Result.success();
}
}
@@ -1,19 +1,26 @@
package com.emotion.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.emotion.common.PageResult;
import com.emotion.common.Result;
import com.emotion.dto.request.PageRequest;
import com.emotion.entity.GuestUser;
import com.emotion.dto.request.guest.GuestUserCreateRequest;
import com.emotion.dto.request.guest.GuestUserPageRequest;
import com.emotion.dto.request.guest.GuestUserUpdateRequest;
import com.emotion.dto.response.guest.GuestUserResponse;
import com.emotion.service.GuestUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.List;
import javax.validation.Valid;
/**
* 访客用户控制器
*
* @author emotion-museum
* @date 2025-09-08
*/
@RestController
@RequestMapping("/guest-user")
@RequestMapping("/guestUser")
public class GuestUserController {
@Autowired
@@ -22,64 +29,54 @@ public class GuestUserController {
/**
* 分页查询访客用户
*/
@GetMapping("/page")
public Result<IPage<GuestUser>> getPage(@Validated PageRequest request) {
IPage<GuestUser> page = guestUserService.getPage(request);
return Result.success(page);
@GetMapping(value = "/page")
public Result<PageResult<GuestUserResponse>> getPage(@Validated GuestUserPageRequest request) {
PageResult<GuestUserResponse> pageResult = guestUserService.getPageWithResponse(request);
return Result.success(pageResult);
}
/**
* 根据ID获取访客用户
*/
@GetMapping(value = "/detail")
public Result<GuestUserResponse> getById(@RequestParam String id) {
GuestUserResponse response = guestUserService.getGuestUserResponseById(id);
if (response == null) {
return Result.notFound("访客用户不存在");
}
return Result.success(response);
}
/**
* 创建访客用户
*/
@PostMapping("/create")
public Result<GuestUser> createGuestUser(@RequestBody @Validated GuestUserCreateRequest request) {
GuestUser guestUser = guestUserService.createGuestUser(
request.getDeviceId(),
request.getIpAddress(),
request.getUserAgent(),
request.getLocation());
return Result.success(guestUser);
@PostMapping(value = "/create")
public Result<GuestUserResponse> create(@Valid @RequestBody GuestUserCreateRequest request) {
GuestUserResponse response = guestUserService.createGuestUserWithResponse(request);
return Result.success(response);
}
// 可根据GuestUserService接口继续补充其他接口...
public static class GuestUserCreateRequest {
private String deviceId;
private String ipAddress;
private String userAgent;
private String location;
// getter/setter
public String getDeviceId() {
return deviceId;
/**
* 更新访客用户
*/
@PutMapping(value = "/update")
public Result<GuestUserResponse> update(@Valid @RequestBody GuestUserUpdateRequest request) {
GuestUserResponse response = guestUserService.updateGuestUserWithResponse(request);
if (response == null) {
return Result.notFound("访客用户不存在");
}
return Result.success(response);
}
public void setDeviceId(String deviceId) {
this.deviceId = deviceId;
}
public String getIpAddress() {
return ipAddress;
}
public void setIpAddress(String ipAddress) {
this.ipAddress = ipAddress;
}
public String getUserAgent() {
return userAgent;
}
public void setUserAgent(String userAgent) {
this.userAgent = userAgent;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
/**
* 删除访客用户
*/
@DeleteMapping(value = "/delete")
public Result<Void> delete(@RequestParam String id) {
boolean deleted = guestUserService.deleteGuestUser(id);
if (!deleted) {
return Result.error("删除失败");
}
return Result.success();
}
}
@@ -10,16 +10,16 @@ import com.emotion.dto.response.MessageResponse;
import com.emotion.service.MessageService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
/**
* 消息控制器
*
* @author emotion-museum
* @date 2025-07-23
* @date 2025-09-08
*/
@RestController
@RequestMapping("/message")
@@ -32,104 +32,72 @@ public class MessageController {
/**
* 创建消息
*/
@PostMapping
@PostMapping(value = "/create")
public Result<MessageResponse> create(@Valid @RequestBody MessageCreateRequest request) {
log.info("创建消息: conversationId={}", request.getConversationId());
try {
MessageResponse response = messageService.createMessageFromRequest(request);
log.info("创建消息成功: messageId={}", response.getId());
return Result.success(response);
} catch (IllegalStateException e) {
log.error("用户未认证: {}", e.getMessage());
return Result.error(401, "用户未登录或认证失败");
} catch (Exception e) {
log.error("创建消息失败", e);
return Result.error(500, "创建消息失败,请稍后重试");
}
MessageResponse response = messageService.createMessageFromRequest(request);
return Result.success(response);
}
/**
* 根据ID获取消息
*/
@GetMapping("/{id}")
public Result<MessageResponse> getById(@PathVariable String id) {
log.info("获取消息详情: id={}", id);
try {
MessageResponse response = messageService.getMessageById(id);
if (response == null) {
return Result.error(404, "消息不存在");
}
return Result.success(response);
} catch (Exception e) {
log.error("获取消息详情失败", e);
return Result.error(500, "获取消息详情失败,请稍后重试");
@GetMapping(value = "/detail")
public Result<MessageResponse> getById(@RequestParam String id) {
MessageResponse response = messageService.getMessageById(id);
if (response == null) {
return Result.notFound("消息不存在");
}
return Result.success(response);
}
/**
* 根据用户ID分页查询消息
* 分页查询消息
*/
@GetMapping("/user/page")
public Result<PageResult<MessageResponse>> getPageByUserId(
@RequestParam(defaultValue = "1") Long current,
@RequestParam(defaultValue = "20") Long size) {
log.info("获取用户消息分页: current={}, size={}", current, size);
// 构建请求对象
MessagePageRequest request = new MessagePageRequest();
request.setCurrent(current);
request.setSize(size);
PageResult<MessageResponse> pageResult = messageService.getUserMessagesWithPage(request);
log.info("获取用户消息分页成功: total={}", pageResult.getTotal());
@GetMapping(value = "/page")
public Result<PageResult<MessageResponse>> getPage(@Validated MessagePageRequest request) {
PageResult<MessageResponse> pageResult = messageService.getPageWithResponse(request);
return Result.success(pageResult);
}
/**
* 根据用户ID和关键词搜索消息
* 搜索消息
*/
@PostMapping("/user/search")
public Result<List<MessageResponse>> searchByUserId(@Valid @RequestBody MessageSearchRequest request) {
log.info("搜索用户消息: keyword={}, limit={}", request.getKeyword(), request.getLimit());
try {
List<MessageResponse> responses = messageService.searchUserMessages(request);
log.info("搜索用户消息成功: {} 条消息", responses.size());
return Result.success(responses);
} catch (IllegalStateException e) {
log.error("用户未认证: {}", e.getMessage());
return Result.error(401, "用户未登录或认证失败");
} catch (Exception e) {
log.error("搜索用户消息失败", e);
return Result.error(500, "搜索失败,请稍后重试");
}
@PostMapping(value = "/search")
public Result<PageResult<MessageResponse>> search(@Valid @RequestBody MessageSearchRequest request) {
PageResult<MessageResponse> pageResult = messageService.searchWithResponse(request);
return Result.success(pageResult);
}
/**
* 获取用户最近的聊天记录
* 获取最近的消息
*/
@PostMapping("/user/recent")
public Result<List<MessageResponse>> getRecentMessages(@Valid @RequestBody MessageRecentRequest request) {
log.info("获取用户最近消息: limit={}", request.getLimit());
try {
List<MessageResponse> responses = messageService.getUserRecentMessages(request);
log.info("获取用户最近消息成功: {} 条消息", responses.size());
return Result.success(responses);
} catch (IllegalStateException e) {
log.error("用户未认证: {}", e.getMessage());
return Result.error(401, "用户未登录或认证失败");
} catch (Exception e) {
log.error("获取最近消息失败", e);
return Result.error(500, "获取最近消息失败,请稍后重试");
}
@PostMapping(value = "/recent")
public Result<PageResult<MessageResponse>> getRecentMessages(@Valid @RequestBody MessageRecentRequest request) {
PageResult<MessageResponse> pageResult = messageService.getRecentWithResponse(request);
return Result.success(pageResult);
}
/**
* 更新消息
*/
@PutMapping(value = "/update")
public Result<MessageResponse> update(@RequestParam String id, @RequestParam String content) {
MessageResponse response = messageService.updateMessage(id, content);
if (response == null) {
return Result.notFound("消息不存在");
}
return Result.success(response);
}
/**
* 删除消息
*/
@DeleteMapping(value = "/delete")
public Result<Void> delete(@RequestParam String id) {
boolean deleted = messageService.deleteMessage(id);
if (!deleted) {
return Result.error("删除失败");
}
return Result.success();
}
}
@@ -1,20 +1,24 @@
package com.emotion.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.emotion.common.PageResult;
import com.emotion.common.Result;
import com.emotion.dto.request.PageRequest;
import com.emotion.dto.request.IdRequest;
import com.emotion.dto.response.BaseResponse;
import com.emotion.entity.Reward;
import com.emotion.dto.request.reward.RewardCreateRequest;
import com.emotion.dto.request.reward.RewardPageRequest;
import com.emotion.dto.request.reward.RewardUpdateRequest;
import com.emotion.dto.response.reward.RewardResponse;
import com.emotion.service.RewardService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
import javax.validation.Valid;
/**
* 奖励控制器
*
* @author emotion-museum
* @date 2025-09-08
*/
@RestController
@RequestMapping("/reward")
public class RewardController {
@@ -25,67 +29,54 @@ public class RewardController {
/**
* 分页查询奖励
*/
@GetMapping("/page")
public Result<IPage<Reward>> getPage(@Validated PageRequest request) {
IPage<Reward> page = rewardService.getPage(request);
return Result.success(page);
@GetMapping(value = "/page")
public Result<PageResult<RewardResponse>> getPage(@Validated RewardPageRequest request) {
PageResult<RewardResponse> pageResult = rewardService.getPageWithResponse(request);
return Result.success(pageResult);
}
/**
* 根据用户ID分页查询奖励
* 根据ID获取奖励
*/
@GetMapping("/page/user/{userId}")
public Result<IPage<Reward>> getPageByUserId(@Validated PageRequest request, @PathVariable String userId) {
IPage<Reward> page = rewardService.getPageByUserId(request, userId);
return Result.success(page);
}
/**
* 根据用户ID查询奖励
*/
@GetMapping("/user/{userId}")
public Result<List<Reward>> getByUserId(@PathVariable String userId) {
List<Reward> list = rewardService.getByUserId(userId);
return Result.success(list);
@GetMapping(value = "/detail")
public Result<RewardResponse> getById(@RequestParam String id) {
RewardResponse response = rewardService.getRewardResponseById(id);
if (response == null) {
return Result.notFound("奖励不存在");
}
return Result.success(response);
}
/**
* 创建奖励
*/
@PostMapping("/create")
public Result<Reward> createReward(@RequestBody @Validated RewardCreateRequest request) {
Reward reward = rewardService.createReward(
request.getUserId(),
request.getRewardType(),
request.getPoints(),
request.getSource(),
request.getDescription(),
request.getExpiredTime()
);
return Result.success(reward);
@PostMapping(value = "/create")
public Result<RewardResponse> create(@Valid @RequestBody RewardCreateRequest request) {
RewardResponse response = rewardService.createRewardWithResponse(request);
return Result.success(response);
}
// 可根据RewardService接口继续补充其他接口...
public static class RewardCreateRequest {
private String userId;
private String rewardType;
private Integer points;
private String source;
private String description;
private LocalDateTime expiredTime;
// getter/setter
public String getUserId() { return userId; }
public void setUserId(String userId) { this.userId = userId; }
public String getRewardType() { return rewardType; }
public void setRewardType(String rewardType) { this.rewardType = rewardType; }
public Integer getPoints() { return points; }
public void setPoints(Integer points) { this.points = points; }
public String getSource() { return source; }
public void setSource(String source) { this.source = source; }
public String getDescription() { return description; }
public void setDescription(String description) { this.description = description; }
public LocalDateTime getExpiredTime() { return expiredTime; }
public void setExpiredTime(LocalDateTime expiredTime) { this.expiredTime = expiredTime; }
/**
* 更新奖励
*/
@PutMapping(value = "/update")
public Result<RewardResponse> update(@Valid @RequestBody RewardUpdateRequest request) {
RewardResponse response = rewardService.updateRewardWithResponse(request);
if (response == null) {
return Result.notFound("奖励不存在");
}
return Result.success(response);
}
}
/**
* 删除奖励
*/
@DeleteMapping(value = "/delete")
public Result<Void> delete(@RequestParam String id) {
boolean deleted = rewardService.deleteReward(id);
if (!deleted) {
return Result.error("删除失败");
}
return Result.success();
}
}
@@ -1,18 +1,26 @@
package com.emotion.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.emotion.common.PageResult;
import com.emotion.common.Result;
import com.emotion.dto.request.PageRequest;
import com.emotion.entity.TopicInteraction;
import com.emotion.dto.request.TopicInteractionCreateRequest;
import com.emotion.dto.request.TopicInteractionPageRequest;
import com.emotion.dto.request.TopicInteractionUpdateRequest;
import com.emotion.dto.response.TopicInteractionResponse;
import com.emotion.service.TopicInteractionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import javax.validation.Valid;
/**
* 话题互动控制器
*
* @author emotion-museum
* @date 2025-09-08
*/
@RestController
@RequestMapping("/topic-interaction")
@RequestMapping("/topicInteraction")
public class TopicInteractionController {
@Autowired
@@ -21,45 +29,54 @@ public class TopicInteractionController {
/**
* 分页查询话题互动
*/
@GetMapping("/page")
public Result<IPage<TopicInteraction>> getPage(@Validated PageRequest request) {
IPage<TopicInteraction> page = topicInteractionService.getPage(request);
return Result.success(page);
@GetMapping(value = "/page")
public Result<PageResult<TopicInteractionResponse>> getPage(@Validated TopicInteractionPageRequest request) {
PageResult<TopicInteractionResponse> pageResult = topicInteractionService.getPageWithResponse(request);
return Result.success(pageResult);
}
/**
* 根据ID获取话题互动
*/
@GetMapping(value = "/detail")
public Result<TopicInteractionResponse> getById(@RequestParam String id) {
TopicInteractionResponse response = topicInteractionService.getTopicInteractionResponseById(id);
if (response == null) {
return Result.notFound("话题互动不存在");
}
return Result.success(response);
}
/**
* 创建话题互动
*/
@PostMapping("/create")
public Result<TopicInteraction> createTopicInteraction(@RequestBody @Validated TopicInteractionCreateRequest request) {
TopicInteraction interaction = topicInteractionService.createTopicInteraction(
request.getTopicId(),
request.getUserId(),
request.getInteractionType(),
request.getContent(),
request.getAttachments()
);
return Result.success(interaction);
@PostMapping(value = "/create")
public Result<TopicInteractionResponse> create(@Valid @RequestBody TopicInteractionCreateRequest request) {
TopicInteractionResponse response = topicInteractionService.createTopicInteractionWithResponse(request);
return Result.success(response);
}
// 可根据TopicInteractionService接口继续补充其他接口...
public static class TopicInteractionCreateRequest {
private String topicId;
private String userId;
private String interactionType;
private String content;
private String attachments;
// getter/setter
public String getTopicId() { return topicId; }
public void setTopicId(String topicId) { this.topicId = topicId; }
public String getUserId() { return userId; }
public void setUserId(String userId) { this.userId = userId; }
public String getInteractionType() { return interactionType; }
public void setInteractionType(String interactionType) { this.interactionType = interactionType; }
public String getContent() { return content; }
public void setContent(String content) { this.content = content; }
public String getAttachments() { return attachments; }
public void setAttachments(String attachments) { this.attachments = attachments; }
/**
* 更新话题互动
*/
@PutMapping(value = "/update")
public Result<TopicInteractionResponse> update(@Valid @RequestBody TopicInteractionUpdateRequest request) {
TopicInteractionResponse response = topicInteractionService.updateTopicInteractionWithResponse(request);
if (response == null) {
return Result.notFound("话题互动不存在");
}
return Result.success(response);
}
}
/**
* 删除话题互动
*/
@DeleteMapping(value = "/delete")
public Result<Void> delete(@RequestParam String id) {
boolean deleted = topicInteractionService.deleteTopicInteraction(id);
if (!deleted) {
return Result.error("删除失败");
}
return Result.success();
}
}
@@ -1,27 +1,18 @@
package com.emotion.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.emotion.common.BasePageRequest;
import com.emotion.common.PageResult;
import com.emotion.common.Result;
import com.emotion.dto.request.UserCreateRequest;
import com.emotion.dto.request.UserUpdateRequest;
import com.emotion.dto.request.UserPageRequest;
import com.emotion.dto.request.UserProfileUpdateRequest;
import com.emotion.dto.request.UserUpdateRequest;
import com.emotion.dto.response.UserResponse;
import com.emotion.entity.User;
import com.emotion.service.UserService;
import com.emotion.util.UserContextHolder;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.stream.Collectors;
/**
* 用户控制器
@@ -36,183 +27,81 @@ public class UserController {
@Autowired
private UserService userService;
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
/**
* 分页查询用户
*/
@GetMapping("/page")
public Result<PageResult<UserResponse>> getPage(@Validated BasePageRequest request) {
IPage<User> page = userService.getPage(request);
List<UserResponse> userResponses = page.getRecords().stream()
.map(this::convertToResponse)
.collect(Collectors.toList());
PageResult<UserResponse> pageResult = new PageResult<>();
pageResult.setCurrent(page.getCurrent());
pageResult.setSize(page.getSize());
pageResult.setTotal(page.getTotal());
pageResult.setPages(page.getPages());
pageResult.setRecords(userResponses);
@GetMapping(value = "/page")
public Result<PageResult<UserResponse>> getPage(@Validated UserPageRequest request) {
PageResult<UserResponse> pageResult = userService.getPageWithResponse(request);
return Result.success(pageResult);
}
/**
* 根据ID获取用户信息
*/
@GetMapping("/{id}")
public Result<UserResponse> getById(@PathVariable String id) {
User user = userService.getById(id);
@GetMapping(value = "/detail")
public Result<UserResponse> getById(@RequestParam String id) {
UserResponse user = userService.getUserResponseById(id);
if (user == null) {
return Result.notFound("用户不存在");
}
return Result.success(convertToResponse(user));
return Result.success(user);
}
/**
* 创建用户
*/
@PostMapping
@PostMapping(value = "/create")
public Result<UserResponse> create(@Valid @RequestBody UserCreateRequest request) {
User user = userService.createUser(
request.getAccount(),
request.getUsername(),
request.getPassword(),
request.getEmail(),
request.getPhone()
);
return Result.success(convertToResponse(user));
UserResponse user = userService.createUserWithResponse(request);
return Result.success(user);
}
/**
* 更新用户
*/
@PutMapping("/{id}")
public Result<UserResponse> update(@PathVariable String id, @Valid @RequestBody UserUpdateRequest request) {
User user = new User();
BeanUtils.copyProperties(request, user);
user.setId(id);
boolean updated = userService.updateById(user);
if (!updated) {
@PutMapping(value = "/update")
public Result<UserResponse> update(@Valid @RequestBody UserUpdateRequest request) {
UserResponse updatedUser = userService.updateUserWithResponse(request);
if (updatedUser == null) {
return Result.error("更新失败");
}
User updatedUser = userService.getById(id);
return Result.success(convertToResponse(updatedUser));
return Result.success(updatedUser);
}
/**
* 删除用户
*/
@DeleteMapping("/{id}")
public Result<Void> delete(@PathVariable String id) {
boolean deleted = userService.removeById(id);
@DeleteMapping(value = "/delete")
public Result<Void> delete(@RequestParam String id) {
boolean deleted = userService.deleteUser(id);
if (!deleted) {
return Result.error("删除失败");
}
return Result.success();
}
/**
* 根据账号查询用户
*/
@GetMapping("/account/{account}")
public Result<UserResponse> getByAccount(@PathVariable String account) {
User user = userService.getByAccount(account);
if (user == null) {
return Result.notFound("用户不存在");
}
return Result.success(convertToResponse(user));
}
/**
* 统计用户数量
*/
@GetMapping("/count/status/{status}")
public Result<Long> countByStatus(@PathVariable Integer status) {
Long count = userService.countByStatus(status);
return Result.success(count);
}
/**
* 获取当前用户个人资料
*/
@GetMapping("/profile")
public Result<UserResponse> getCurrentUserProfile(HttpServletRequest request) {
String currentUserId = getCurrentUserId(request);
if (currentUserId == null) {
@GetMapping(value = "/profile")
public Result<UserResponse> getCurrentUserProfile() {
UserResponse user = userService.getCurrentUserProfileWithResponse();
if (user == null) {
return Result.unauthorized("用户未登录");
}
User user = userService.getById(currentUserId);
if (user == null) {
return Result.notFound("用户不存在");
}
return Result.success(convertToResponse(user));
return Result.success(user);
}
/**
* 更新当前用户个人资料
*/
@PutMapping("/profile")
public Result<UserResponse> updateCurrentUserProfile(@Valid @RequestBody UserProfileUpdateRequest request,
HttpServletRequest httpRequest) {
String currentUserId = getCurrentUserId(httpRequest);
if (currentUserId == null) {
@PutMapping(value = "/profile")
public Result<UserResponse> updateCurrentUserProfile(@Valid @RequestBody UserProfileUpdateRequest request) {
UserResponse updatedUser = userService.updateCurrentUserProfileWithResponse(request);
if (updatedUser == null) {
return Result.unauthorized("用户未登录");
}
User user = new User();
BeanUtils.copyProperties(request, user);
user.setId(currentUserId);
boolean updated = userService.updateById(user);
if (!updated) {
return Result.error("更新失败");
}
User updatedUser = userService.getById(currentUserId);
return Result.success(convertToResponse(updatedUser));
}
/**
* 获取当前用户ID
* 从JWT拦截器设置的请求属性中获取用户ID
*/
private String getCurrentUserId(HttpServletRequest request) {
// 优先从UserContextHolder获取(线程本地存储)
String userId = UserContextHolder.getCurrentUserId();
if (userId != null) {
return userId;
}
// 如果UserContextHolder中没有,从请求属性中获取(兼容性)
Object userIdAttr = request.getAttribute("userId");
if (userIdAttr != null) {
return userIdAttr.toString();
}
return null;
}
/**
* 转换为响应对象
*/
private UserResponse convertToResponse(User user) {
UserResponse response = new UserResponse();
BeanUtils.copyProperties(user, response);
response.setId(user.getId());
if (user.getCreateTime() != null) {
response.setCreateTime(user.getCreateTime().format(DATE_TIME_FORMATTER));
}
if (user.getUpdateTime() != null) {
response.setUpdateTime(user.getUpdateTime().format(DATE_TIME_FORMATTER));
}
if (user.getLastActiveTime() != null) {
response.setLastActiveTime(user.getLastActiveTime().format(DATE_TIME_FORMATTER));
}
return response;
return Result.success(updatedUser);
}
}
@@ -1,22 +1,20 @@
package com.emotion.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.emotion.common.PageResult;
import com.emotion.common.Result;
import com.emotion.dto.request.PageRequest;
import com.emotion.dto.response.BaseResponse;
import com.emotion.entity.UserStats;
import com.emotion.dto.request.UserStatsCreateRequest;
import com.emotion.dto.request.UserStatsIncrementRequest;
import com.emotion.dto.request.UserStatsPageRequest;
import com.emotion.dto.request.UserStatsUpdateValueRequest;
import com.emotion.dto.response.UserStatsResponse;
import com.emotion.service.UserStatsService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotBlank;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.stream.Collectors;
/**
* 用户统计控制器
@@ -25,123 +23,37 @@ import java.util.stream.Collectors;
* @date 2025-07-23
*/
@RestController
@RequestMapping("/user-stats")
@RequestMapping("/userStats")
@Validated
public class UserStatsController {
@Autowired
private UserStatsService userStatsService;
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
/**
* 分页查询用户统计
*/
@GetMapping("/page")
public Result<PageResult<UserStatsResponse>> getPage(@Validated PageRequest request) {
IPage<UserStats> page = userStatsService.getPage(request);
List<UserStatsResponse> responses = page.getRecords().stream()
.map(this::convertToResponse)
.collect(Collectors.toList());
PageResult<UserStatsResponse> pageResult = new PageResult<>();
pageResult.setCurrent(page.getCurrent());
pageResult.setSize(page.getSize());
pageResult.setTotal(page.getTotal());
pageResult.setPages(page.getPages());
pageResult.setRecords(responses);
@GetMapping(value = "/page")
public Result<PageResult<UserStatsResponse>> getPage(@Validated UserStatsPageRequest request) {
PageResult<UserStatsResponse> pageResult = userStatsService.getPageWithResponse(request);
return Result.success(pageResult);
}
/**
* 根据用户ID获取统计信息
*/
@GetMapping("/user/{userId}")
public Result<UserStatsResponse> getByUserId(@PathVariable String userId) {
UserStats stats = userStatsService.getByUserId(userId);
if (stats == null) {
return Result.notFound("用户统计不存在");
}
return Result.success(convertToResponse(stats));
}
/**
* 根据用户ID和统计类型获取统计信息
*/
@GetMapping("/user/{userId}/type/{statsType}")
public Result<UserStatsResponse> getByUserIdAndStatsType(@PathVariable String userId, @PathVariable String statsType) {
UserStats stats = userStatsService.getByUserIdAndStatsType(userId, statsType);
if (stats == null) {
return Result.notFound("用户统计不存在");
}
return Result.success(convertToResponse(stats));
}
/**
* 根据统计类型查询统计信息
*/
@GetMapping("/type/{statsType}")
public Result<List<UserStatsResponse>> getByStatsType(@PathVariable String statsType) {
List<UserStats> statsList = userStatsService.getByStatsType(statsType);
List<UserStatsResponse> responses = statsList.stream()
.map(this::convertToResponse)
.collect(Collectors.toList());
return Result.success(responses);
}
/**
* 查询用户的所有统计类型
*/
@GetMapping("/user/{userId}/all")
public Result<List<UserStatsResponse>> getAllStatsByUserId(@PathVariable String userId) {
List<UserStats> statsList = userStatsService.getAllStatsByUserId(userId);
List<UserStatsResponse> responses = statsList.stream()
.map(this::convertToResponse)
.collect(Collectors.toList());
return Result.success(responses);
}
/**
* 查询排名前N的用户统计
*/
@GetMapping("/type/{statsType}/top")
public Result<List<UserStatsResponse>> getTopUsersByStatsType(@PathVariable String statsType, @RequestParam(defaultValue = "10") Integer limit) {
List<UserStats> statsList = userStatsService.getTopUsersByStatsType(statsType, limit);
List<UserStatsResponse> responses = statsList.stream()
.map(this::convertToResponse)
.collect(Collectors.toList());
return Result.success(responses);
}
/**
* 查询用户在指定统计类型中的排名
*/
@GetMapping("/user/{userId}/type/{statsType}/rank")
public Result<Long> getUserRankByStatsType(@PathVariable String userId, @PathVariable String statsType) {
Long rank = userStatsService.getUserRankByStatsType(userId, statsType);
return Result.success(rank);
}
/**
* 创建或更新用户统计
*/
@PostMapping
public Result<UserStatsResponse> createOrUpdate(@RequestBody @Validated UserStatsCreateRequest request) {
UserStats stats = userStatsService.createOrUpdateUserStats(
request.getUserId(),
request.getStatsType(),
request.getValue(),
request.getPeriod()
);
return Result.success(convertToResponse(stats));
@PostMapping(value = "/createOrUpdate")
public Result<UserStatsResponse> createOrUpdate(@Valid @RequestBody UserStatsCreateRequest request) {
UserStatsResponse stats = userStatsService.createOrUpdateUserStatsWithResponse(request);
return Result.success(stats);
}
/**
* 更新用户统计值
*/
@PutMapping("/user/{userId}/type/{statsType}")
public Result<Void> updateStatsValue(@PathVariable String userId, @PathVariable String statsType, @RequestParam Double value) {
boolean updated = userStatsService.updateStatsValue(userId, statsType, value);
@PutMapping(value = "/updateStatsValue")
public Result<Void> updateStatsValue(@Valid @RequestBody UserStatsUpdateValueRequest request) {
boolean updated = userStatsService.updateStatsValue(request);
if (!updated) {
return Result.error("更新失败");
}
@@ -151,9 +63,9 @@ public class UserStatsController {
/**
* 增加用户统计值
*/
@PutMapping("/user/{userId}/type/{statsType}/increment")
public Result<Void> incrementStatsValue(@PathVariable String userId, @PathVariable String statsType, @RequestParam Double increment) {
boolean updated = userStatsService.incrementStatsValue(userId, statsType, increment);
@PutMapping(value = "/incrementStatsValue")
public Result<Void> incrementStatsValue(@Valid @RequestBody UserStatsIncrementRequest request) {
boolean updated = userStatsService.incrementStatsValue(request);
if (!updated) {
return Result.error("增加失败");
}
@@ -163,8 +75,8 @@ public class UserStatsController {
/**
* 重新计算用户统计
*/
@PutMapping("/user/{userId}/recalculate")
public Result<Void> recalculateUserStats(@PathVariable String userId) {
@PutMapping(value = "/recalculateUserStats")
public Result<Void> recalculateUserStats(@RequestParam String userId) {
boolean recalculated = userStatsService.recalculateUserStats(userId);
if (!recalculated) {
return Result.error("重新计算失败");
@@ -175,7 +87,7 @@ public class UserStatsController {
/**
* 重新计算所有用户统计
*/
@PutMapping("/recalculate-all")
@PutMapping(value = "/recalculateAll")
public Result<Void> recalculateAllUserStats() {
boolean recalculated = userStatsService.recalculateAllUserStats();
if (!recalculated) {
@@ -184,37 +96,10 @@ public class UserStatsController {
return Result.success();
}
/**
* 查询平均统计值
*/
@GetMapping("/type/{statsType}/avg")
public Result<Double> getAvgValueByStatsType(@PathVariable String statsType) {
Double avgValue = userStatsService.getAvgValueByStatsType(statsType);
return Result.success(avgValue);
}
/**
* 查询最大统计值
*/
@GetMapping("/type/{statsType}/max")
public Result<Double> getMaxValueByStatsType(@PathVariable String statsType) {
Double maxValue = userStatsService.getMaxValueByStatsType(statsType);
return Result.success(maxValue);
}
/**
* 查询最小统计值
*/
@GetMapping("/type/{statsType}/min")
public Result<Double> getMinValueByStatsType(@PathVariable String statsType) {
Double minValue = userStatsService.getMinValueByStatsType(statsType);
return Result.success(minValue);
}
/**
* 删除过期的统计数据
*/
@DeleteMapping("/expired")
@DeleteMapping(value = "/deleteExpired")
public Result<Void> deleteExpiredStats(@RequestParam(defaultValue = "30") Integer days) {
boolean deleted = userStatsService.deleteExpiredStats(days);
if (!deleted) {
@@ -222,49 +107,4 @@ public class UserStatsController {
}
return Result.success();
}
/**
* 转换为响应对象
*/
private UserStatsResponse convertToResponse(UserStats stats) {
UserStatsResponse response = new UserStatsResponse();
BeanUtils.copyProperties(stats, response);
response.setId(stats.getId());
if (stats.getCreateTime() != null) {
response.setCreateTime(stats.getCreateTime().format(DATE_TIME_FORMATTER));
}
if (stats.getUpdateTime() != null) {
response.setUpdateTime(stats.getUpdateTime().format(DATE_TIME_FORMATTER));
}
return response;
}
/**
* 用户统计创建请求
*/
@lombok.Data
public static class UserStatsCreateRequest {
@NotBlank(message = "用户ID不能为空")
private String userId;
@NotBlank(message = "统计类型不能为空")
private String statsType;
@NotNull(message = "统计值不能为空")
private Double value;
private String period;
}
/**
* 用户统计响应类
*/
@lombok.Data
@lombok.EqualsAndHashCode(callSuper = true)
public static class UserStatsResponse extends BaseResponse {
private String userId;
private String statsType;
private Double value;
private String period;
}
}
}
@@ -1,114 +0,0 @@
package com.emotion.controller;
import com.emotion.service.AiChatService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.messaging.simp.SimpMessageHeaderAccessor;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.HashMap;
import java.util.Map;
/**
* WebSocket控制器
*
* @author emotion-museum
* @date 2025-07-22
*/
@Controller
public class WebSocketController {
private static final Logger log = LoggerFactory.getLogger(WebSocketController.class);
@Autowired
private SimpMessagingTemplate messagingTemplate;
@Autowired
private AiChatService aiChatService;
// 已移除旧的WebSocket消息处理方法,使用新的ChatWebSocketController
// 已移除旧的用户连接处理方法,使用新的ChatWebSocketController
/**
* 处理AI聊天消息
*/
@MessageMapping("/chat.ai")
public void handleAiChat(@Payload Map<String, Object> chatMessage,
SimpMessageHeaderAccessor headerAccessor) {
log.info("收到AI聊天消息: {}", chatMessage);
try {
String content = (String) chatMessage.get("content");
String conversationId = (String) chatMessage.get("conversationId");
String userId = (String) chatMessage.get("userId");
// 调用AI服务
String aiReply = aiChatService.sendMessage(conversationId, content, userId);
// 构建AI回复消息
Map<String, Object> aiResponse = new HashMap<>();
aiResponse.put("content", aiReply);
aiResponse.put("sender", "AI助手");
aiResponse.put("type", "AI_REPLY");
aiResponse.put("conversationId", conversationId);
aiResponse.put("timestamp", System.currentTimeMillis());
// 发送给特定用户
if (userId != null) {
messagingTemplate.convertAndSendToUser(userId, "/queue/messages", aiResponse);
} else {
// 发送到公共频道
messagingTemplate.convertAndSend("/topic/conversation/" + conversationId, aiResponse);
}
} catch (Exception e) {
log.error("处理AI聊天失败", e);
Map<String, Object> errorResponse = new HashMap<>();
errorResponse.put("content", "AI服务暂时不可用,请稍后再试");
errorResponse.put("sender", "System");
errorResponse.put("type", "ERROR");
errorResponse.put("timestamp", System.currentTimeMillis());
String userId = (String) chatMessage.get("userId");
if (userId != null) {
messagingTemplate.convertAndSendToUser(userId, "/queue/messages", errorResponse);
}
}
}
/**
* 发送系统消息
*/
public void sendSystemMessage(String destination, String message) {
Map<String, Object> systemMessage = new HashMap<>();
systemMessage.put("content", message);
systemMessage.put("sender", "System");
systemMessage.put("type", "SYSTEM");
systemMessage.put("timestamp", System.currentTimeMillis());
messagingTemplate.convertAndSend(destination, systemMessage);
}
/**
* WebSocket状态监控接口
*/
@GetMapping("/api/ws/status")
@ResponseBody
public Map<String, Object> getWebSocketStatus() {
Map<String, Object> status = new HashMap<>();
status.put("status", "active");
status.put("timestamp", System.currentTimeMillis());
status.put("endpoint", "/ws/chat");
status.put("protocols", new String[]{"websocket", "sockjs"});
status.put("message", "WebSocket服务正常运行");
return status;
}
}