mh_goadmin_server/app/admin/apis/message/user_message.go
chenlin 70b823b413 1、优化零售明细相关支付金额不能为负值的缺陷,根据实际情况展示;
2、优化门店销售对比,时间改成审核时间;避免跨月订单统计不准确;
3、新增业务消息相关接口;
2025-07-01 11:54:23 +08:00

162 lines
4.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package message
import (
"github.com/gin-gonic/gin"
"go-admin/app/admin/models"
orm "go-admin/common/global"
"go-admin/tools"
"go-admin/tools/app"
"net/http"
"time"
)
// UserMessageList 用户消息列表
// @Summary 用户消息列表
// @Description 获取当前用户的消息记录
// @Tags 消息中心V1.5.0
// @Accept json
// @Produce json
// @Param data body models.UserMessageListReq true "消息查询参数"
// @Success 200 {object} models.UserMessageListResp
// @Router /api/v1/user_message/list [post]
func UserMessageList(c *gin.Context) {
var req models.UserMessageListReq
if err := c.ShouldBindJSON(&req); err != nil {
app.Error(c, http.StatusBadRequest, nil, "参数错误: "+err.Error())
return
}
if req.Page <= 0 {
req.Page = 1
}
if req.PageSize <= 0 {
req.PageSize = 10
}
userID := tools.GetUserId(c)
query := orm.Eloquent.Where("user_id = ? AND is_visible = ?", userID, true)
if req.IsRead != 0 && req.IsRead != 1 && req.IsRead != 2 {
app.Error(c, http.StatusBadRequest, nil, "不支持的目标状态")
return
} else if req.IsRead == 1 {
query = query.Where("is_read = ?", true)
} else if req.IsRead == 2 {
query = query.Where("is_read = ?", false)
}
var total int64
if err := query.Model(&models.SystemUserMessage{}).Count(&total).Error; err != nil {
app.Error(c, http.StatusInternalServerError, nil, "查询总数失败: "+err.Error())
return
}
var messages []models.SystemUserMessage
if err := query.Order("created_at desc").
Offset((req.Page - 1) * req.PageSize).
Limit(req.PageSize).
Find(&messages).Error; err != nil {
app.Error(c, http.StatusInternalServerError, nil, "查询列表失败: "+err.Error())
return
}
var result []models.UserMessageDetailRespItem
var configIDs []uint
for _, msg := range messages {
item := models.UserMessageDetailRespItem{
ID: uint(msg.ID),
UserID: msg.UserID,
MessageConfigID: msg.MessageConfigID,
MessageType: msg.MessageType,
Title: msg.Title,
Content: msg.Content,
IsRead: msg.IsRead,
ReadTime: msg.ReadTime,
IsVisible: msg.IsVisible,
}
if msg.MessageType == models.AnnouncementMessageType && msg.MessageConfigID != 0 {
configIDs = append(configIDs, msg.MessageConfigID)
}
result = append(result, item)
}
// 加载所有相关公告配置
var configs []models.SystemMessageConfig
if len(configIDs) > 0 {
err := orm.Eloquent.
Where("id IN (?)", configIDs).
Find(&configs).Error
if err != nil {
app.Error(c, http.StatusInternalServerError, nil, "加载公告配置失败: "+err.Error())
return
}
// 构建映射
configMap := make(map[uint]models.SystemMessageConfig)
for _, cfg := range configs {
configMap[uint(cfg.ID)] = cfg
}
// 填充扩展字段
for i, item := range result {
if item.MessageType == models.AnnouncementMessageType {
if cfg, ok := configMap[item.MessageConfigID]; ok {
result[i].Level = cfg.Level
result[i].DisplayMode = cfg.DisplayMode
result[i].StartTime = cfg.StartTime
result[i].EndTime = cfg.EndTime
}
}
}
}
app.OK(c, models.UserMessageListResp{
List: result,
Total: total,
Page: req.Page,
PageSize: req.PageSize,
}, "查询成功")
}
// UserMessageSetStatus 设置用户消息为已读(支持单条或全部)
// @Summary 设置用户消息为已读
// @Description 设为单条或全部已读
// @Tags 消息中心V1.5.0
// @Accept json
// @Produce json
// @Param data body models.UserMessageSetStatusReq true "设置参数"
// @Success 200 {object} app.Response
// @Router /api/v1/user_message/set_status [post]
func UserMessageSetStatus(c *gin.Context) {
var req models.UserMessageSetStatusReq
if err := c.ShouldBindJSON(&req); err != nil {
app.Error(c, http.StatusBadRequest, nil, "参数错误: "+err.Error())
return
}
userID := tools.GetUserId(c)
now := time.Now()
query := orm.Eloquent.Model(&models.SystemUserMessage{}).
Where("user_id = ? AND is_read = ?", userID, false)
if req.ReadAll {
// 全部设为已读
} else {
if req.ID == 0 {
app.Error(c, http.StatusBadRequest, nil, "参数错误: 未提供消息ID")
return
}
query = query.Where("id = ?", req.ID)
}
err := query.Updates(map[string]interface{}{
"is_read": true,
"read_time": &now,
}).Error
if err != nil {
app.Error(c, http.StatusInternalServerError, nil, "设置失败: "+err.Error())
return
}
app.OK(c, nil, "设置成功")
}