sysmail.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. package service
  2. import (
  3. "fmt"
  4. "strconv"
  5. "time"
  6. "crazy-fox-backend-api/storage/redis"
  7. "github.com/jmoiron/sqlx/types"
  8. jsoniter "github.com/json-iterator/go"
  9. "crazy-fox-backend-api/config"
  10. "crazy-fox-backend-api/model"
  11. "crazy-fox-backend-api/repo"
  12. "crazy-fox-backend-api/repo/okeys"
  13. "crazy-fox-backend-api/utils"
  14. "github.com/pkg/errors"
  15. )
  16. const (
  17. sendFinished = 1 // 已发送
  18. sendRunning = 2 // 发送中
  19. sendUnStart = 3 // 未开始
  20. )
  21. // sysMailService 系统邮件模块服务
  22. type sysMailService struct{}
  23. func (This *sysMailService) TemplateList(req model.PageInfo) ([]model.TSysMailTemplate, int64) {
  24. return repo.SearchOnePage[model.TSysMailTemplate](req.Page, req.PageSize, "Order By id desc")
  25. }
  26. func (This *sysMailService) TemplateEdit(req *model.TSysMailTemplate) (err error) {
  27. if utils.IsEmpty(req.Id) {
  28. _, err = repo.Insert(req)
  29. } else {
  30. err = repo.Update(req, "id")
  31. }
  32. return errors.WithStack(err)
  33. }
  34. func (This *sysMailService) handleTemplateImport(sheets [][][]string) (templateConf map[string]model.SystemMailContent, err error) {
  35. templateConf, err = This.parseTemplateSheet(sheets[0])
  36. if err != nil {
  37. return templateConf, errors.WithStack(err)
  38. }
  39. return templateConf, err
  40. }
  41. func (This *sysMailService) parseTemplateSheet(sheet [][]string) (map[string]model.SystemMailContent, error) {
  42. var err error
  43. confMap := make(map[string]model.SystemMailContent, len(sheet))
  44. for i := 1; i < len(sheet); i++ {
  45. var lang string
  46. var one model.SystemMailContent
  47. if err = utils.DestructAssign(sheet[i], &lang, &one.Title, &one.Body); err != nil {
  48. return nil, errors.WithStack(err)
  49. }
  50. for k, v := range config.LangUpper {
  51. if v == lang {
  52. confMap[k] = one
  53. break
  54. }
  55. }
  56. }
  57. return confMap, err
  58. }
  59. func (This *sysMailService) GetTemplateOption() []model.Option {
  60. list := repo.Search[model.TSysMailTemplate]("")
  61. options := make([]model.Option, 0, len(list))
  62. for _, template := range list {
  63. options = append(options, model.Option{
  64. Value: template.Id,
  65. Label: template.Remark,
  66. })
  67. }
  68. return options
  69. }
  70. func (This *sysMailService) GetMailHistory(req model.PageInfo) ([]model.SysMailScheduleShow, int64) {
  71. curTime := utils.CurTimestamp()
  72. where := repo.SysMail.GetHistoryListWhere(req.Keyword)
  73. list, total := repo.SearchOnePage[model.SysMailScheduleSub](req.Page, req.PageSize, where)
  74. templateList := repo.Search[model.TSysMailTemplate]("")
  75. history := make([]model.SysMailScheduleShow, 0, len(list))
  76. for _, sub := range list {
  77. historyStatus := func() int64 {
  78. if sub.Uids != "" || curTime > sub.AliveEnd {
  79. return sendFinished
  80. }
  81. if curTime < sub.AliveStart {
  82. return sendUnStart
  83. }
  84. return sendRunning
  85. }()
  86. historyTemplate := func() string {
  87. for _, template := range templateList {
  88. if template.Id == sub.TemplateId {
  89. return fmt.Sprintf("%s (ID:%d)", template.Remark, template.Id)
  90. }
  91. }
  92. return "-"
  93. }()
  94. history = append(history, model.SysMailScheduleShow{
  95. Id: sub.Id,
  96. Template: historyTemplate,
  97. Rewards: sub.Rewards,
  98. Remark: sub.Remark,
  99. Type: utils.Ternary(sub.Uids == "", int64(0), 1),
  100. Status: historyStatus,
  101. CreateTime: utils.Ternary(sub.CreateTime == 0, "-", time.Unix(sub.CreateTime, 0).Format(config.DateTime)),
  102. Operator: sub.Operator,
  103. })
  104. }
  105. return history, total
  106. }
  107. func (This *sysMailService) MailSend(m *model.TSysMailSchedule) (err error) {
  108. if _, err = repo.Insert(m); err != nil {
  109. return errors.WithStack(err)
  110. }
  111. // 指定条件发送
  112. if utils.IsEmpty(m.Uids) {
  113. schedules := repo.Search[model.TSysMailSchedule]("Where `uids` = '' And `alive_end` > ?", utils.CurTimestamp())
  114. updateMap := make(map[string]any, len(schedules))
  115. for _, s := range schedules {
  116. updateMap[strconv.FormatInt(s.Id, 10)] = s
  117. }
  118. repo.ClearAndHMSetCache(okeys.SysMailSchedule(), updateMap)
  119. return err
  120. }
  121. // 指定uid发送
  122. var uidArr []int64
  123. if err = utils.Explode(&uidArr, m.Uids, ","); err != nil {
  124. return err
  125. }
  126. var insertId int64
  127. var mailInfo model.UserSysMail
  128. for _, uid := range uidArr {
  129. if utils.IsEmpty(uid) {
  130. continue
  131. }
  132. mailInfo = This.buildUserMailInfo(uid, m)
  133. if insertId, err = repo.SysMail.InsertUserSysMail(&mailInfo); err != nil {
  134. return errors.WithStack(err)
  135. }
  136. mailInfo.Id = insertId
  137. if err = repo.SysMail.HSetUserSysMail(&mailInfo); err != nil {
  138. return errors.WithStack(err)
  139. }
  140. }
  141. return err
  142. }
  143. func (This *sysMailService) GetOneHistory(id int64) model.TSysMailSchedule {
  144. return repo.SearchOne[model.TSysMailSchedule]("Where id = ?", id)
  145. }
  146. func (This *sysMailService) buildUserMailInfo(uid int64, m *model.TSysMailSchedule) model.UserSysMail {
  147. curTime := utils.CurTimestamp()
  148. mail := model.UserSysMail{
  149. Uid: uid,
  150. Msgid: m.TemplateId,
  151. Got: 0,
  152. Rewards: m.Rewards,
  153. Expire: curTime + config.OneDay*m.Days,
  154. CreateTime: curTime,
  155. }
  156. return mail
  157. }
  158. // 发送邮件奖励
  159. func (This *sysMailService) SendEmailRewards(uid, msgId int64, rewards []model.PropPrize) error {
  160. var (
  161. err error
  162. jsonText types.JSONText
  163. rc = redis.SelectConn(redis.Games)
  164. redisKey = okeys.SysMsgGet(uid)
  165. timestamp = time.Now().Unix()
  166. )
  167. if jsonText, err = jsoniter.Marshal(rewards); err != nil {
  168. return err
  169. }
  170. emailData := model.EmailRepo{
  171. Uid: uid,
  172. Msgid: msgId,
  173. Got: 0,
  174. Rewards: jsonText,
  175. Expire: timestamp + 86400*7,
  176. CreateTime: timestamp,
  177. }
  178. if emailData.Id, err = repo.Insert(emailData, emailData.TableName(uid)); err != nil {
  179. return err
  180. }
  181. hKey := fmt.Sprintf("%v_%v", msgId, emailData.Id)
  182. emailData.Rewards = rewards
  183. if jsonText, err = jsoniter.Marshal(emailData); err != nil {
  184. return err
  185. }
  186. if err = rc.HSet(redisKey, hKey, string(jsonText)); err != nil {
  187. return err
  188. }
  189. rc.ExpireAt(redisKey, timestamp+86400*16)
  190. return nil
  191. }