user_chat_controller.go 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. package rag
  2. import (
  3. "encoding/json"
  4. "eta/eta_api/controllers"
  5. "eta/eta_api/controllers/rag/llm_http"
  6. "eta/eta_api/models"
  7. "eta/eta_api/models/llm"
  8. llmService "eta/eta_api/services/llm"
  9. "eta/eta_api/utils"
  10. "time"
  11. )
  12. type UserChatController struct {
  13. controllers.BaseAuthController
  14. }
  15. // NewChat @Title 新建对话框
  16. // @Description 新建对话框
  17. // @Success 101 {object} response.ListResp
  18. // @router /chat/new_chat [post]
  19. func (ucCtrl *UserChatController) NewChat() {
  20. br := new(models.BaseResponse).Init()
  21. defer func() {
  22. ucCtrl.Data["json"] = br
  23. ucCtrl.ServeJSON()
  24. }()
  25. var req llm_http.UserChatReq
  26. err := json.Unmarshal(ucCtrl.Ctx.Input.RequestBody, &req)
  27. if err != nil {
  28. br.Msg = "参数解析异常!"
  29. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  30. return
  31. }
  32. sysUser := ucCtrl.SysUser
  33. if sysUser == nil {
  34. br.Msg = "请登录"
  35. br.ErrMsg = "请登录,SysUser Is Empty"
  36. br.Ret = 408
  37. return
  38. }
  39. if req.ChatTitle == "" {
  40. req.ChatTitle = "新会话"
  41. }
  42. session := llm.UserLlmChat{
  43. UserId: sysUser.AdminId,
  44. CreatedTime: time.Now(),
  45. ChatTitle: req.ChatTitle,
  46. }
  47. err = session.CreateChatSession()
  48. if err != nil {
  49. br.Msg = "创建失败"
  50. br.ErrMsg = "创建失败,Err:" + err.Error()
  51. return
  52. }
  53. _ = llmService.AddChatRecord(&llm.UserChatRecordRedis{
  54. ChatId: session.Id,
  55. ChatUserType: "user",
  56. Content: req.ChatTitle,
  57. SendTime: time.Now().Format(utils.FormatDateTime),
  58. })
  59. br.Ret = 200
  60. br.Success = true
  61. br.Msg = "创建成功"
  62. }
  63. // RenameChat @Title 新建对话框
  64. // @Description 新建对话框
  65. // @Success 101 {object} response.ListResp
  66. // @router /chat/rename_chat [post]
  67. func (ucCtrl *UserChatController) RenameChat() {
  68. br := new(models.BaseResponse).Init()
  69. defer func() {
  70. ucCtrl.Data["json"] = br
  71. ucCtrl.ServeJSON()
  72. }()
  73. var req llm_http.UserChatReq
  74. err := json.Unmarshal(ucCtrl.Ctx.Input.RequestBody, &req)
  75. if err != nil {
  76. br.Msg = "参数解析异常!"
  77. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  78. return
  79. }
  80. sysUser := ucCtrl.SysUser
  81. if sysUser == nil {
  82. br.Msg = "请登录"
  83. br.ErrMsg = "请登录,SysUser Is Empty"
  84. br.Ret = 408
  85. return
  86. }
  87. if req.ChatId <= 0 {
  88. br.Msg = "非法的对话框Id"
  89. br.ErrMsg = "非法的对话框Id"
  90. return
  91. }
  92. if req.ChatTitle == "" {
  93. br.Msg = "重命名不能为空"
  94. br.ErrMsg = "重命名不能为空"
  95. return
  96. }
  97. session := llm.UserLlmChat{
  98. Id: req.ChatId,
  99. UpdateTime: time.Now(),
  100. UserId: sysUser.AdminId,
  101. ChatTitle: req.ChatTitle,
  102. }
  103. err = session.RenameChatSession()
  104. if err != nil {
  105. br.Msg = "重命名失败"
  106. br.ErrMsg = "重命名失败,Err:" + err.Error()
  107. return
  108. }
  109. br.Ret = 200
  110. br.Success = true
  111. br.Msg = "重命名成功"
  112. }
  113. // DeleteChat @Title 删除对话框
  114. // @Description 删除对话框
  115. // @Success 101 {object} response.ListResp
  116. // @router /chat/delete_chat [post]
  117. func (ucCtrl *UserChatController) DeleteChat() {
  118. br := new(models.BaseResponse).Init()
  119. defer func() {
  120. ucCtrl.Data["json"] = br
  121. ucCtrl.ServeJSON()
  122. }()
  123. var req llm_http.UserChatReq
  124. err := json.Unmarshal(ucCtrl.Ctx.Input.RequestBody, &req)
  125. if err != nil {
  126. br.Msg = "参数解析异常!"
  127. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  128. return
  129. }
  130. sysUser := ucCtrl.SysUser
  131. if sysUser == nil {
  132. br.Msg = "请登录"
  133. br.ErrMsg = "请登录,SysUser Is Empty"
  134. br.Ret = 408
  135. return
  136. }
  137. if req.ChatId <= 0 {
  138. br.Msg = "非法的对话框Id"
  139. br.ErrMsg = "非法的对话框Id"
  140. return
  141. }
  142. session := llm.UserLlmChat{
  143. Id: req.ChatId,
  144. UpdateTime: time.Now(),
  145. IsDeleted: 1,
  146. }
  147. err = session.DeleteChatSession()
  148. if err != nil {
  149. br.Msg = "删除失败"
  150. br.ErrMsg = "删除失败,Err:" + err.Error()
  151. return
  152. }
  153. br.Ret = 200
  154. br.Success = true
  155. br.Msg = "删除成功"
  156. }
  157. // GetUserChatList @Title 获取用户对话框列表
  158. // @Description 获取用户对话框列表
  159. // @Success 101 {object} response.ListResp
  160. // @router /chat/user_chat_list [get]
  161. func (ucCtrl *UserChatController) GetUserChatList() {
  162. br := new(models.BaseResponse).Init()
  163. defer func() {
  164. ucCtrl.Data["json"] = br
  165. ucCtrl.ServeJSON()
  166. }()
  167. sysUser := ucCtrl.SysUser
  168. if sysUser == nil {
  169. br.Msg = "请登录"
  170. br.ErrMsg = "请登录,SysUser Is Empty"
  171. br.Ret = 408
  172. return
  173. }
  174. //周日是0,周六是6
  175. weekDay := time.Now().Weekday()
  176. offset := int(time.Monday - weekDay)
  177. if offset > 0 {
  178. offset -= 7
  179. }
  180. today := time.Now().Format(utils.FormatDate)
  181. monDay := time.Now().AddDate(0, 0, offset).Format(utils.FormatDate)
  182. yesterday := time.Now().AddDate(0, 0, -1).Format(utils.FormatDate)
  183. chatList, err := llm.GetUserChatList(sysUser.AdminId, monDay, time.Now().Format(utils.FormatDate))
  184. if err != nil {
  185. br.Msg = "获取用户聊天列表失败"
  186. br.ErrMsg = "获取用户聊天列表失败,Err:" + err.Error()
  187. return
  188. }
  189. data := new(llm_http.UserChatListResp)
  190. data.WeekList = make([]llm.UserLlmChatListViewItem, 0)
  191. data.YesterdayList = make([]llm.UserLlmChatListViewItem, 0)
  192. data.TodayList = make([]llm.UserLlmChatListViewItem, 0)
  193. for _, v := range chatList {
  194. if v.CreatedTime.Format(utils.FormatDate) == today {
  195. data.TodayList = append(data.TodayList, llm.CovertItemToView(v))
  196. } else if v.CreatedTime.Format(utils.FormatDate) == yesterday {
  197. data.YesterdayList = append(data.YesterdayList, llm.CovertItemToView(v))
  198. } else {
  199. data.WeekList = append(data.WeekList, llm.CovertItemToView(v))
  200. }
  201. }
  202. br.Data = data
  203. br.Ret = 200
  204. br.Success = true
  205. br.Msg = "获取用户聊天列表成功"
  206. }
  207. // ChatRecordAdd @Title 保存聊天记录
  208. // @Description 保存聊天记录
  209. // @Success 101 {object} response.ListResp
  210. // @router /chat/chat_record_save [post]
  211. func (ucCtrl *UserChatController) ChatRecordAdd() {
  212. br := new(models.BaseResponse).Init()
  213. defer func() {
  214. ucCtrl.Data["json"] = br
  215. ucCtrl.ServeJSON()
  216. }()
  217. var req llm_http.UserChatRecordReq
  218. err := json.Unmarshal(ucCtrl.Ctx.Input.RequestBody, &req)
  219. if err != nil {
  220. br.Msg = "参数解析异常!"
  221. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  222. return
  223. }
  224. sysUser := ucCtrl.SysUser
  225. if sysUser == nil {
  226. br.Msg = "请登录"
  227. br.ErrMsg = "请登录,SysUser Is Empty"
  228. br.Ret = 408
  229. return
  230. }
  231. if req.ChatId <= 0 {
  232. br.Msg = "非法的对话框Id"
  233. br.ErrMsg = "非法的对话框Id"
  234. return
  235. }
  236. if req.Content == "" {
  237. br.Msg = "聊天记录不能为空"
  238. br.ErrMsg = "聊天记录不能为空"
  239. return
  240. }
  241. if req.Id < 0 {
  242. br.Msg = "非法的Id"
  243. br.ErrMsg = "非法的Id"
  244. return
  245. }
  246. if req.ChatUserType != "user" && req.ChatUserType != "assistant" {
  247. br.Msg = "非法的用户类型"
  248. br.ErrMsg = "非法的用户类型,用户类型支持:user/assistant"
  249. return
  250. }
  251. if req.SendTime == "" {
  252. req.SendTime = time.Now().Format(utils.FormatDateTime)
  253. } else {
  254. _, err = time.Parse(utils.FormatDateTime, req.SendTime)
  255. if err != nil {
  256. br.Msg = "非法的发送时间"
  257. br.ErrMsg = "非法的发送时间,Err:" + err.Error()
  258. return
  259. }
  260. }
  261. record := llm.UserChatRecordRedis{
  262. ChatId: req.ChatId,
  263. ChatUserType: req.ChatUserType,
  264. Content: req.Content,
  265. SendTime: req.SendTime,
  266. }
  267. err = llmService.AddChatRecord(&record)
  268. if err != nil {
  269. br.Msg = "添加聊天记录失败"
  270. br.ErrMsg = "添加聊天记录失败,Err:" + err.Error()
  271. return
  272. }
  273. br.Ret = 200
  274. br.Success = true
  275. br.Msg = "添加聊天记录成功"
  276. }
  277. // ChatRecordList @Title 获取聊天记录
  278. // @Description 获取聊天记录
  279. // @Success 101 {object} response.ListResp
  280. // @router /chat/chat_record_list [get]
  281. func (ucCtrl *UserChatController) ChatRecordList() {
  282. br := new(models.BaseResponse).Init()
  283. defer func() {
  284. ucCtrl.Data["json"] = br
  285. ucCtrl.ServeJSON()
  286. }()
  287. sysUser := ucCtrl.SysUser
  288. if sysUser == nil {
  289. br.Msg = "请登录"
  290. br.ErrMsg = "请登录,SysUser Is Empty"
  291. br.Ret = 408
  292. return
  293. }
  294. chatId, _ := ucCtrl.GetInt("ChatId", 0)
  295. if chatId <= 0 {
  296. br.Msg = "非法的对话Id"
  297. br.ErrMsg = "非法的对话Id"
  298. return
  299. }
  300. list, err := llmService.GetChatRecordsFromRedis(chatId)
  301. if err != nil {
  302. br.Msg = "获取聊天记录失败"
  303. br.ErrMsg = "获取聊天记录失败,Err:" + err.Error()
  304. return
  305. }
  306. br.Data = list
  307. br.Ret = 200
  308. br.Success = true
  309. br.Msg = "获取聊天记录成功"
  310. }