You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
287 lines
7.1 KiB
287 lines
7.1 KiB
|
1 year ago
|
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))
|
||
|
|
}
|