2e3345cdfc
修复雪花 ID 精度丢失(真 bug) - bottom-sheet 的 postId 声明为 Number,而 ID 是 18 位雪花字符串, 超出 JS 安全整数范围:339346584095428608 会被转成 ...600, 评论弹层实际查的是不存在的帖子。改为 String 记录 - 后端 DELETE /records/:id 早已就绪但前端从未调用,记错了删不掉。 时间轴支持长按删除 - 时间轴加类型筛选(体重/便便/饮食/异常/用药/疫苗/消费/照片), 后端 ?type= 本就支持 用户侧内容删除(UGC 合规:用户应能删除自己发布的内容) - 新增 DELETE /posts/:id 与 DELETE /comments/:id,仅限本人, 越权返回 40300;帖子软删除,评论删除同步递减 comment_count - 评论列表返回 is_self;社区长按自己的帖子、长按自己的评论可删 AI 聊天历史 - ai_messages 一直在写但没有查询接口,每次打开弹层都是空白。 新增 GET /api/ai/messages,弹层打开时接在开场白后加载 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
52 lines
1.7 KiB
Go
52 lines
1.7 KiB
Go
package service
|
|
|
|
import (
|
|
"io"
|
|
|
|
"github.com/sundynix/pets-be/internal/model"
|
|
)
|
|
|
|
// AIChat 记录一问一答:启用模型则真调(注入宠物档案),否则规则化文案
|
|
func (s *Service) AIChat(userID string, petID *string, session, text string) (string, error) {
|
|
reply := "我会先判断风险等级,再建议你记录关键观察项。若出现频繁呕吐、便血、精神明显变差或持续超过 24 小时,建议尽快就医。"
|
|
if s.ai != nil && s.ai.Enabled() {
|
|
if r, err := s.llmChat(petID, text); err == nil && r != "" {
|
|
reply = r
|
|
}
|
|
}
|
|
|
|
msgs := []model.AIMessage{
|
|
{UserID: userID, PetID: petID, Session: session, Role: "user", Text: text},
|
|
{UserID: userID, PetID: petID, Session: session, Role: "ai", Text: reply},
|
|
}
|
|
if err := s.db.Create(&msgs).Error; err != nil {
|
|
return "", err
|
|
}
|
|
return reply, nil
|
|
}
|
|
|
|
// Upload 代理到对象存储
|
|
func (s *Service) Upload(objectName string, reader io.Reader, size int64, contentType string) (string, error) {
|
|
return s.storage.Upload(objectName, reader, size, contentType)
|
|
}
|
|
|
|
// ListAIMessages 取当前用户的聊天历史(按会话,默认最近 N 条,返回时间正序)
|
|
func (s *Service) ListAIMessages(userID, session string, limit int) ([]model.AIMessage, error) {
|
|
if limit <= 0 || limit > 100 {
|
|
limit = 30
|
|
}
|
|
q := s.db.Where("user_id = ?", userID)
|
|
if session != "" {
|
|
q = q.Where("session = ?", session)
|
|
}
|
|
var msgs []model.AIMessage
|
|
if err := q.Order("id desc").Limit(limit).Find(&msgs).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
// 反转成时间正序,前端直接按顺序渲染
|
|
for i, j := 0, len(msgs)-1; i < j; i, j = i+1, j-1 {
|
|
msgs[i], msgs[j] = msgs[j], msgs[i]
|
|
}
|
|
return msgs, nil
|
|
}
|