印度包网
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

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))
}