package handler import ( "encoding/json" "fmt" "server/call" "server/common" "server/db" "server/modules/backend/app" "server/modules/backend/values" "server/natsClient" "server/pb" "server/util" "time" "github.com/gin-gonic/gin" "github.com/liangdas/mqant/log" "github.com/olivere/elastic/v7" ) func DraftList(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := new(values.MailDraftListReq) if !a.S(req) { return } var list []common.MailDraft var count int64 var err error if req.Title == nil && req.StartSendTime == nil && req.EndSendTime == nil { count, err = db.ES().QueryMailDraftList(int(req.Page), int(req.Num), &list) } else { q := elastic.NewBoolQuery() if req.Title != nil { log.Debug("title:%v", *req.Title) q.Filter(elastic.NewFuzzyQuery("Title.keyword", *req.Title)) } if req.StartSendTime != nil { q.Filter(elastic.NewRangeQuery("SendTime").Gte(*req.StartSendTime)) } if req.EndSendTime != nil { q.Filter(elastic.NewRangeQuery("SendTime").Lte(*req.EndSendTime)) } count, err = db.ES().SearchMailDraftList(int(req.Page), int(req.Num), q, &list) } if err != nil { log.Error("err:%v", err) a.Code = values.CodeRetry return } resp := values.MailDraftListResp{List: list, Count: int(count)} a.Data = resp } func DraftCreate(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := new(values.MailDraftCreateReq) if !a.S(req) { return } if req.SendMethod == common.MailSendMethodTiming { if req.SendTime < time.Now().Unix() { a.Code = values.CodeParam a.Msg = "发送时间有误" return } } else { req.SendTime = time.Now().Unix() } save := new(common.MailDraft) save.Sender = req.Sender save.Receiver = req.Receiver save.Type = req.Type save.Title = req.Title save.Content = req.Content if len(req.Enclosure) > 0 { save.Enclosure = req.Enclosure[0] } save.SendMethod = req.SendMethod save.SendTime = req.SendTime save.Status = common.MailDraftStatusNew save.Time = time.Now().Unix() save.Operator = a.User.Account save.UserTag = req.UserTag save.MaxBirthAt = req.MaxBirthAt save.RechargeAmount = req.RechargeAmount save.ChannelId = req.ChannelId save.URL = req.URL save.Tag = req.Tag if err := db.ES().InsertToES(common.ESIndexBackMailDraft, save); err != nil { log.Error("err:%v", err) a.Code = values.CodeRetry return } a.RecordEdit(values.PowerMail, fmt.Sprintf("创建邮件:%v", req.Title)) } func DraftEdit(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := new(values.MailDraftEditReq) if !a.S(req) { return } one := new(common.MailDraft) if err := db.ES().QueryOne(common.ESIndexBackMailDraft, elastic.NewTermQuery("_id", req.ID), one); err != nil { log.Error("err:%v", err) a.Code = values.CodeRetry return } if req.ID == "" { a.Code = values.CodeParam a.Msg = "草稿不存在" return } update := false if req.Sender != nil { update = true one.Sender = *req.Sender } if req.Receiver != nil { update = true one.Receiver = *req.Receiver } if req.Type != nil { update = true one.Type = *req.Type } if req.Title != nil { update = true one.Title = *req.Title } if req.Content != nil { update = true one.Content = *req.Content } if req.Enclosure != nil { update = true one.Enclosure = req.Enclosure[0] } if req.SendMethod != nil { update = true one.SendMethod = *req.SendMethod if one.SendMethod == common.MailSendMethodTiming { if req.SendTime == nil || *req.SendTime < time.Now().Unix() { a.Code = values.CodeParam a.Msg = "发送时间有误" return } one.SendTime = *req.SendTime } else { one.SendTime = time.Now().Unix() } } if req.UserTag != nil { update = true one.UserTag = *req.UserTag } if req.MaxBirthAt != nil { update = true one.MaxBirthAt = *req.MaxBirthAt } if req.RechargeAmount != nil { update = true one.RechargeAmount = *req.RechargeAmount } if req.ChannelId != nil { update = true one.ChannelId = *req.ChannelId } if req.URL != nil { update = true one.URL = *req.URL } if req.Tag != nil { update = true one.Tag = *req.Tag } if !update { a.Code = values.CodeParam a.Msg = "无内容修改" return } one.Operator = a.User.Account one.Time = time.Now().Unix() if _, err := db.ES().Update(common.ESIndexBackMailDraft, req.ID, one); err != nil { log.Error("err:%v", err) a.Code = values.CodeRetry return } a.RecordEdit(values.PowerMail, fmt.Sprintf("修改邮件:%v", req.ID)) } func DraftOpt(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := new(values.MailDraftOptReq) if !a.S(req) { return } one := new(common.MailDraft) if err := db.ES().QueryOne(common.ESIndexBackMailDraft, elastic.NewTermQuery("_id", req.ID), one); err != nil { log.Error("err:%v", err) a.Code = values.CodeRetry return } if one.ID == "" { a.Code = values.CodeParam a.Msg = "草稿不存在" return } updateStatus := common.MailDraftStatusDelete switch req.Opt { case 1: if one.Status == common.MailStatusDelete { a.Code = values.CodeParam a.Msg = "该草稿已删除" return } updateStatus = common.MailDraftStatusDelete case 2: if one.Status == common.MailDraftStatusBack { a.Code = values.CodeParam a.Msg = "该草稿已撤回" return } updateStatus = common.MailDraftStatusBack if err := db.Mysql().Update(&common.Mail{DraftID: one.ID}, map[string]interface{}{"status": common.MailStatusDelete}); err != nil { log.Error("err:%v", err) a.Code = values.CodeRetry return } case 3: if one.Status == common.MailDraftStatusSent { a.Code = values.CodeParam a.Msg = "该草稿已发送" return } updateStatus = common.MailDraftStatusSent enclosure := "" if one.Enclosure != nil { e, _ := json.Marshal(one.Enclosure) enclosure = string(e) } if len(one.Receiver) > 0 { for _, v := range one.Receiver { mail := new(common.Mail) mail.DraftID = one.ID mail.Sender = one.Sender mail.Receiver = v mail.Type = one.Type mail.Title = one.Title mail.Content = one.Content mail.Enc = enclosure mail.SendMethod = one.SendMethod mail.Status = common.MailStatusNew mail.URL = one.URL mail.Tag = one.Tag if one.SendMethod == common.MailSendMethodTiming { mail.Time = one.SendTime } else if one.SendMethod == common.MailSendMethodImmediately { mail.Time = time.Now().Unix() } // util.Go(func() { if err := db.Mysql().Create(mail); err != nil { log.Error("err:%v", err) a.Code = values.CodeRetry return } // }) } } else { mail := new(common.Mail) mail.DraftID = one.ID mail.Sender = one.Sender mail.Receiver = 0 mail.Type = one.Type mail.Title = one.Title mail.Content = one.Content mail.Enc = enclosure mail.SendMethod = one.SendMethod mail.Status = common.MailStatusNew mail.MaxBirthAt = one.MaxBirthAt mail.UserTag = one.UserTag mail.MaxBirthAt = one.MaxBirthAt mail.RechargeAmount = one.RechargeAmount mail.ChannelId = one.ChannelId mail.URL = one.URL mail.Tag = one.Tag if one.SendMethod == common.MailSendMethodTiming { mail.Time = one.SendTime } else if one.SendMethod == common.MailSendMethodImmediately { mail.Time = time.Now().Unix() } if err := db.Mysql().Create(mail); err != nil { log.Error("err:%v", err) a.Code = values.CodeRetry return } } if one.SendMethod == common.MailSendMethodImmediately { // 如果是立即发送,需要通知在线玩家刷新邮件 err := call.Publish(natsClient.TopicBackRefreshMail, &pb.InnerRefreshMail{UIDs: util.SliceInt2Int32(one.Receiver)}) if err != nil { log.Error(err.Error()) } } } one.Status = updateStatus one.Operator = a.User.Account one.Time = time.Now().Unix() if _, err := db.ES().Update(common.ESIndexBackMailDraft, req.ID, one); err != nil { log.Error("err:%v", err) a.Code = values.CodeRetry return } a.RecordEdit(values.PowerMail, fmt.Sprintf("操作邮件:%v,操作码:%v", req.ID, req.Opt)) }