package handler import ( "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.Must(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 save.Enclosure = req.Enclosure save.SendMethod = req.SendMethod save.SendTime = req.SendTime save.Status = common.MailDraftStatusNew save.Time = time.Now().Unix() save.Operator = a.User.Account 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 } 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 !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 len(one.Enclosure) > 0 { // 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 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 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)) }