user_message_service.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package user
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. logger "eta/eta_mini_ht_api/common/component/log"
  6. userDao "eta/eta_mini_ht_api/models/user"
  7. "fmt"
  8. "strconv"
  9. "strings"
  10. "text/template"
  11. )
  12. type MessageDTO struct {
  13. From int `gorm:"column:from"`
  14. To int `gorm:"column:to"`
  15. Message string `gorm:"column:message"`
  16. Type string `gorm:"column:type;type:enum('REPORT','VIDEO','AUDIO')"`
  17. Status string `gorm:"column:status;type:enum('UNREAD','READ')"`
  18. }
  19. type MyMessage struct {
  20. Id int `json:"messageId"`
  21. SourceId int `json:"SourceId"`
  22. Type string `json:"Type"`
  23. Message string `json:"Message"`
  24. }
  25. const (
  26. ReportMessageTemplate = "您关注的研究员%v更新了一篇报告"
  27. VideoMessageTemplate = "您关注的研究员%v更新了一个视频"
  28. AudioMessageTemplate = "您关注的研究员%v更新了一个音频"
  29. RefundMessageTemplate = "订单:{{.ProductOrderNo}},姓名:{{.RealName}},退款{{.Result}}!"
  30. )
  31. type MessageInfo struct {
  32. analyst string
  33. }
  34. func CreateMessage(meta MetaInfoDTO) (err error) {
  35. messageType := userDao.SourceType(meta.SourceType)
  36. var messageList []userDao.UserMessage
  37. users := strings.Split(meta.To, ",")
  38. var message string
  39. var content MetaData
  40. err = json.Unmarshal([]byte(meta.Meta), &content)
  41. if err != nil {
  42. logger.Error("生成消息信息失败:%v", err)
  43. userDao.FailedMetaInfo(meta.Id)
  44. }
  45. switch userDao.SourceType(meta.SourceType) {
  46. case userDao.ReportSourceType:
  47. message = fmt.Sprintf(ReportMessageTemplate, content.AuthorName)
  48. messageType = userDao.ReportSourceType
  49. case userDao.VideoSourceType:
  50. message = fmt.Sprintf(VideoMessageTemplate, content.AuthorName)
  51. case userDao.AudioSourceType:
  52. message = fmt.Sprintf(AudioMessageTemplate, content.AuthorName)
  53. case userDao.RefundSourceType:
  54. message, _ = generateMessage(nil, RefundMessageTemplate)
  55. }
  56. for _, user := range users {
  57. id, _ := strconv.Atoi(user)
  58. userMessage := userDao.UserMessage{
  59. AnalystId: content.AuthorId,
  60. UserId: id,
  61. Message: message,
  62. SourceId: content.SourceId,
  63. Type: messageType,
  64. Status: userDao.UnReadStatus,
  65. }
  66. messageList = append(messageList, userMessage)
  67. }
  68. if userDao.BatchInsertMessage(messageList) {
  69. userDao.FinishMetaInfo(meta.Id)
  70. } else {
  71. logger.Error("生成消息信息失败:%v", err)
  72. userDao.FailedMetaInfo(meta.Id)
  73. }
  74. return
  75. }
  76. func generateMessage(data interface{}, tmpl string) (message string, err error) {
  77. t := template.Must(template.New("messageTemplate").Parse(tmpl))
  78. var buffer bytes.Buffer
  79. err = t.Execute(&buffer, data)
  80. if err != nil {
  81. logger.Error("生成消息模板失败:%v", err)
  82. return
  83. }
  84. message = buffer.String()
  85. return
  86. }
  87. func NeedNotice(userId int, analystId int) bool {
  88. return userDao.NeedNotice(userId, analystId)
  89. }
  90. func ReadMessage(userId int, messageId int) bool {
  91. return userDao.ReadMessage(userId, messageId)
  92. }
  93. func ReadMessages(userId int, analystId int) bool {
  94. return userDao.ReadMessages(userId, analystId)
  95. }
  96. func GetUnReadMessageList(userId int) (messageList []MyMessage, err error) {
  97. list, err := userDao.GetUnReadMessageList(userId)
  98. if err != nil {
  99. logger.Error("获取我的未读消息失败:%v", err)
  100. return
  101. }
  102. for _, message := range list {
  103. messageList = append(messageList, convertToMyMessage(message))
  104. }
  105. return
  106. }
  107. func convertToMyMessage(message userDao.UserMessage) MyMessage {
  108. return MyMessage{
  109. Id: message.Id,
  110. SourceId: message.SourceId,
  111. Type: string(message.Type),
  112. Message: message.Message,
  113. }
  114. }