196 lines
5.7 KiB
Go
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 "消息"
|
|
}
|
|
}
|