Files
iotlcm/server/internal/logic/app/app_message.go
T

196 lines
5.7 KiB
Go

package app
import (
"context"
"strings"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/dao"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/do"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/entity"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/service"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/errors/gerror"
)
type sAppMessage struct{}
func NewAppMessage() *sAppMessage {
return &sAppMessage{}
}
func init() {
service.RegisterAppMessage(NewAppMessage())
}
func (s *sAppMessage) List(ctx context.Context, param *model.AppMessageListParam) (items []*model.AppMessageModel, total int, err error) {
if param == nil {
param = &model.AppMessageListParam{}
}
if param.Page <= 0 {
param.Page = 1
}
if param.PageSize <= 0 {
param.PageSize = 20
}
if param.PageSize > 100 {
param.PageSize = 100
}
user, err := appCurrentUser(ctx)
if err != nil {
return nil, 0, err
}
mod := s.applyFilters(s.ownerMessageModel(ctx, user), param)
total, err = mod.Count()
if err != nil {
return nil, 0, gerror.Wrap(err, "查询消息数量失败")
}
if total == 0 {
return []*model.AppMessageModel{}, 0, nil
}
if err = mod.
Fields(appMessageFields()).
Page(param.Page, param.PageSize).
OrderDesc("COALESCE(ml." + dao.TMessageLog.Columns().SendTime + ", um." + dao.TUserMessage.Columns().CreatedAt + ")").
OrderDesc("um." + dao.TUserMessage.Columns().MessageId).
Scan(&items); err != nil {
return nil, 0, gerror.Wrap(err, "查询消息列表失败")
}
for _, item := range items {
fillAppMessageText(item)
}
return items, total, nil
}
func (s *sAppMessage) Detail(ctx context.Context, param *model.AppMessageDetailParam) (*model.AppMessageModel, error) {
if param == nil || param.MessageId == 0 {
return nil, gerror.New("消息ID不能为空")
}
user, err := appCurrentUser(ctx)
if err != nil {
return nil, err
}
var item *model.AppMessageModel
if err = s.ownerMessageModel(ctx, user).
Fields(appMessageFields()).
Where("um."+dao.TUserMessage.Columns().MessageId, param.MessageId).
Limit(1).
Scan(&item); err != nil {
return nil, gerror.Wrap(err, "查询消息详情失败")
}
if item == nil || item.MessageId == 0 {
return nil, gerror.New("消息不存在或无权查看")
}
fillAppMessageText(item)
if item.IsRead == 0 {
if err = s.Read(ctx, &model.AppMessageReadParam{Ids: []uint64{item.MessageId}}); err != nil {
return nil, err
}
item.IsRead = 1
}
return item, nil
}
func (s *sAppMessage) Read(ctx context.Context, param *model.AppMessageReadParam) error {
if param == nil || len(param.Ids) == 0 {
return gerror.New("消息ID不能为空")
}
user, err := appCurrentUser(ctx)
if err != nil {
return err
}
_, err = dao.TUserMessage.Ctx(ctx).
Where(dao.TUserMessage.Columns().TenantId, user.TenantId).
Where(dao.TUserMessage.Columns().UserId, user.UserId).
WhereIn(dao.TUserMessage.Columns().MessageId, param.Ids).
Where(dao.TUserMessage.Columns().IsRead, 0).
Data(do.TUserMessage{
IsRead: 1,
UpdatedBy: user.UserId,
}).
Update()
if err != nil {
return gerror.Wrap(err, "标记消息已读失败")
}
return nil
}
func (s *sAppMessage) ownerMessageModel(ctx context.Context, user *entity.SysUser) *gdb.Model {
return dao.TUserMessage.Ctx(ctx).As("um").
InnerJoin(dao.TMessageLog.Table()+" ml", "ml."+dao.TMessageLog.Columns().MessageLogId+" = um."+dao.TUserMessage.Columns().MessageLogId+" AND ml."+dao.TMessageLog.Columns().TenantId+" = um."+dao.TUserMessage.Columns().TenantId).
Where("um."+dao.TUserMessage.Columns().TenantId, user.TenantId).
Where("um."+dao.TUserMessage.Columns().UserId, user.UserId).
Where("ml."+dao.TMessageLog.Columns().IsRecall, 0)
}
func (s *sAppMessage) applyFilters(mod *gdb.Model, param *model.AppMessageListParam) *gdb.Model {
if param.IsRead != nil {
mod = mod.Where("um."+dao.TUserMessage.Columns().IsRead, *param.IsRead)
}
if param.MessageType != nil && *param.MessageType > 0 {
mod = mod.Where("ml."+dao.TMessageLog.Columns().MessageType, *param.MessageType)
}
keyword := strings.TrimSpace(param.Keyword)
if keyword != "" {
like := "%" + keyword + "%"
mod = mod.Where(
"(ml."+dao.TMessageLog.Columns().MessageTitle+" LIKE ? OR ml."+dao.TMessageLog.Columns().MessageContent+" LIKE ? OR ml."+dao.TMessageLog.Columns().MessageLink+" LIKE ?)",
like, like, like,
)
}
return mod
}
func appMessageFields() string {
return strings.Join([]string{
"um." + dao.TUserMessage.Columns().MessageId + " AS message_id",
"um." + dao.TUserMessage.Columns().MessageId + " AS id",
"um." + dao.TUserMessage.Columns().MessageLogId + " AS message_log_id",
"COALESCE(ml." + dao.TMessageLog.Columns().MessageType + ", 1) AS message_type",
"COALESCE(ml." + dao.TMessageLog.Columns().MessageTitle + ", '') AS title",
"COALESCE(ml." + dao.TMessageLog.Columns().MessageContent + ", '') AS content",
"COALESCE(ml." + dao.TMessageLog.Columns().MessageLink + ", '') AS link",
"um." + dao.TUserMessage.Columns().IsRead + " AS is_read",
"um." + dao.TUserMessage.Columns().CreatedAt + " AS created_at",
"um." + dao.TUserMessage.Columns().UpdatedAt + " AS updated_at",
"COALESCE(ml." + dao.TMessageLog.Columns().SendTime + ", um." + dao.TUserMessage.Columns().CreatedAt + ") AS send_time",
}, ", ")
}
func fillAppMessageText(item *model.AppMessageModel) {
if item == nil {
return
}
item.Id = item.MessageId
if strings.TrimSpace(item.Title) == "" {
item.Title = "未命名消息"
}
item.MessageTypeText = appMessageTypeText(item.MessageType)
}
func appMessageTypeText(messageType int) string {
switch messageType {
case 1:
return "系统通知"
case 2:
return "平台公告"
case 3:
return "订单通知"
case 4:
return "账户通知"
default:
return "消息"
}
}