1、新增用户消息删除接口;

2、保证金审核列表增加"审核时间"筛选;
3、消息相关接口统一页码和每页数量的字段;
4、用户消息列表接口增加"接收时间"字段;
This commit is contained in:
chenlin 2025-07-10 14:53:24 +08:00
parent b3a8c6e4e7
commit fe46d911a1
7 changed files with 314 additions and 74 deletions

View File

@ -66,6 +66,7 @@ func UserMessageList(c *gin.Context) {
for _, msg := range messages {
item := models.UserMessageDetailRespItem{
ID: uint(msg.ID),
CreatedAt: msg.CreatedAt,
UserID: msg.UserID,
MessageConfigID: msg.MessageConfigID,
MessageType: msg.MessageType,
@ -141,11 +142,11 @@ func UserMessageSetStatus(c *gin.Context) {
if req.ReadAll {
// 全部设为已读
} else {
if req.ID == 0 {
if len(req.ID) == 0 {
app.Error(c, http.StatusBadRequest, nil, "参数错误: 未提供消息ID")
return
}
query = query.Where("id = ?", req.ID)
query = query.Where("id IN ?", req.ID)
}
err := query.Updates(map[string]interface{}{
@ -159,3 +160,63 @@ func UserMessageSetStatus(c *gin.Context) {
app.OK(c, nil, "设置成功")
}
// UserMessageDelete 用户消息-删除(支持单条、批量或全部)
// @Summary 用户消息-删除(支持单条、批量或全部)
// @Description 删除指定消息、批量消息或全部消息(逻辑删除,限当前用户)
// @Tags 消息中心V1.5.0
// @Accept json
// @Produce json
// @Param data body models.UserMessageDeleteReq true "删除参数"
// @Success 200 {object} app.Response
// @Router /api/v1/user_message/delete [post]
func UserMessageDelete(c *gin.Context) {
var req models.UserMessageDeleteReq
if err := c.ShouldBindJSON(&req); err != nil {
app.Error(c, http.StatusBadRequest, nil, "参数错误: "+err.Error())
return
}
userID := tools.GetUserId(c)
query := orm.Eloquent.Model(&models.SystemUserMessage{}).
Where("user_id = ?", userID).
Where("is_visible = ?", true)
if req.DeleteAll {
// 删除当前用户的所有可见消息
} else {
if len(req.IDs) == 0 {
app.Error(c, http.StatusBadRequest, nil, "参数错误: 未提供消息ID列表")
return
}
// 校验消息是否都属于当前用户
var count int64
err := orm.Eloquent.
Model(&models.SystemUserMessage{}).
Where("id IN ?", req.IDs).
Where("user_id = ?", userID).
Count(&count).Error
if err != nil {
app.Error(c, http.StatusInternalServerError, nil, "校验失败: "+err.Error())
return
}
if count != int64(len(req.IDs)) {
app.Error(c, http.StatusForbidden, nil, "删除失败:包含不属于当前用户的消息")
return
}
query = query.Where("id IN ?", req.IDs)
}
err := query.Updates(map[string]interface{}{
"is_visible": false,
}).Error
if err != nil {
app.Error(c, http.StatusInternalServerError, nil, "删除失败: "+err.Error())
return
}
app.OK(c, nil, "删除成功")
}

View File

@ -128,16 +128,16 @@ type SysMessageListReq struct {
DisplayMode uint8 `form:"display_mode"` // 展示方式1=弹窗2=滚动3=弹窗+滚动
Status uint8 `form:"status"` // 状态0=草稿1=启用2=禁用3=已过期
TargetType uint8 `form:"target_type"` // 从接收对象配置表中筛选
Page int `form:"page,default=1"` // 页码
Page int `form:"page_index,default=1"` // 页码
PageSize int `form:"page_size,default=10"` // 每页条数
}
// SysMessageListResp 公告消息列表-出参
type SysMessageListResp struct {
List []SysAnnouncementItem `json:"list"`
Total int64 `json:"total"` // 总条数
Page int `json:"page"` // 页码
PageSize int `json:"page_size"` // 每页条数
Total int64 `json:"total"` // 总条数
Page int `json:"page_index"` // 页码
PageSize int `json:"page_size"` // 每页条数
}
// SysAnnouncementItem 公告消息展示结构体
@ -190,21 +190,22 @@ type SysMessageDetailResp struct {
// UserMessageListReq 用户消息列表-入参
type UserMessageListReq struct {
IsRead int `json:"is_read"` // 0-全部1-已读2-未读
Page int `json:"page"` // 页码
PageSize int `json:"page_size"` // 每页数量
IsRead int `json:"is_read"` // 0-全部1-已读2-未读
Page int `json:"page_index"` // 页码
PageSize int `json:"page_size"` // 每页数量
}
// UserMessageListResp 用户消息列表-出参
type UserMessageListResp struct {
List []UserMessageDetailRespItem `json:"list"`
Total int64 `json:"total"`
Page int `json:"page"`
Page int `json:"page_index"`
PageSize int `json:"page_size"`
}
type UserMessageDetailRespItem struct {
ID uint `json:"id"`
CreatedAt time.Time `json:"created_at"` // 接收时间
UserID int64 `json:"user_id"` // 接收用户ID
MessageConfigID uint `json:"message_config_id"` // 对应消息配置ID可为空被删时保留记录
MessageType uint8 `json:"message_type"` // 消息类型1=公告2=业务
@ -221,8 +222,8 @@ type UserMessageDetailRespItem struct {
// UserMessageSetStatusReq 用户阅读消息-入参
type UserMessageSetStatusReq struct {
ID uint `json:"id"` // 消息ID可选read_all 为 false 时必传)
ReadAll bool `json:"read_all"` // 是否设为全部已读
ID []uint `json:"id"` // 消息ID可选read_all 为 false 时必传)
ReadAll bool `json:"read_all"` // 是否设为全部已读
}
// BusMessageCreateReq 新增业务消息-入参
@ -242,19 +243,19 @@ type BusMessageCreateResp struct {
// BusMessageListReq 业务消息列表 - 入参
type BusMessageListReq struct {
BizType string `json:"biz_type"` // 业务类型
Event string `json:"event"` // 事件类型
Status uint8 `json:"status"` // 状态1启用2禁用
RoleID []int64 `json:"role_id"` // 角色ID
Page int `json:"page"` // 页码
PageSize int `json:"page_size"` // 每页条数
BizType string `json:"biz_type"` // 业务类型
Event string `json:"event"` // 事件类型
Status uint8 `json:"status"` // 状态1启用2禁用
RoleID []int64 `json:"role_id"` // 角色ID
Page int `json:"page_index"` // 页码
PageSize int `json:"page_size"` // 每页条数
}
// BusMessageListResp 业务消息列表 - 出参
type BusMessageListResp struct {
List []BusMessageItem `json:"list"`
Total int64 `json:"total"`
Page int `json:"page"`
Page int `json:"page_index"`
PageSize int `json:"page_size"`
}
@ -302,16 +303,16 @@ type BusMessageDetailReq struct {
// BizTypeListReq 查询业务类型列表 - 入参
type BizTypeListReq struct {
Page int `json:"page"`
Page int `json:"page_index"`
PageSize int `json:"page_size"`
}
// BizTypeListResp 查询业务类型列表 - 出参
type BizTypeListResp struct {
List []BizTypeItem `json:"list"` // 业务类型列表
Total int64 `json:"total"` // 总数
Page int `json:"page"` // 当前页
PageSize int `json:"page_size"` // 页大小
List []BizTypeItem `json:"list"` // 业务类型列表
Total int64 `json:"total"` // 总数
Page int `json:"page_index"` // 当前页
PageSize int `json:"page_size"` // 页大小
}
// BizTypeItem 单条业务类型展示项
@ -323,7 +324,7 @@ type BizTypeItem struct {
// EventListReq 查询事件类型列表 - 入参
type EventListReq struct {
BizType string `json:"biz_type" binding:"required"`
Page int `json:"page"`
Page int `json:"page_index"`
PageSize int `json:"page_size"`
}
@ -331,7 +332,7 @@ type EventListReq struct {
type EventListResp struct {
List []EventItem `json:"list"`
Total int64 `json:"total"`
Page int `json:"page"`
Page int `json:"page_index"`
PageSize int `json:"page_size"`
}
@ -345,16 +346,16 @@ type EventItem struct {
type TemplateVarReq struct {
BizType string `json:"biz_type" binding:"required"` // 业务类型
Event string `json:"event" binding:"required"` // 事件类型
Page int `json:"page"` // 当前页
Page int `json:"page_index"` // 当前页
PageSize int `json:"page_size"` // 每页大小
}
// TemplateVarListResp 查询模板变量字段列表 - 出参
type TemplateVarListResp struct {
List []TemplateVariable `json:"list"` // 模板变量列表
Total int64 `json:"total"` // 总数
Page int `json:"page"` // 当前页
PageSize int `json:"page_size"` // 每页条数
List []TemplateVariable `json:"list"` // 模板变量列表
Total int64 `json:"total"` // 总数
Page int `json:"page_index"` // 当前页
PageSize int `json:"page_size"` // 每页条数
}
// TemplateVariable 模板变量项
@ -363,6 +364,12 @@ type TemplateVariable struct {
Desc string `json:"desc"` // 模板变量描述
}
// UserMessageDeleteReq 用户消息-删除 请求参数
type UserMessageDeleteReq struct {
IDs []uint `json:"ids"` // 消息ID列表DeleteAll=false时必填
DeleteAll bool `json:"delete_all"` // 是否删除全部
}
// ValidateBizEventAndTemplate 校验业务类型、事件类型以及模板变量是否合法
func ValidateBizEventAndTemplate(bizType, event, contentTemplate string) error {
var registry SystemEventRegistry

View File

@ -2773,10 +2773,12 @@ func GetSysUserInfoById(id uint32) (SysUser, error) {
type UserDepositRefundRecordListReq struct {
//StoreId uint32 `json:"store_id"` // 门店id
Uid uint32 `json:"uid"` // 用户id
PageNum int `json:"pageIndex"`
PageSize int `json:"pageSize"`
Status uint32 `json:"status"`
Uid uint32 `json:"uid"` // 用户id
PageNum int `json:"pageIndex"`
PageSize int `json:"pageSize"`
Status uint32 `json:"status"`
AuditTimeStart string `json:"audit_time_start"` // 审核开始时间
AuditTimeEnd string `json:"audit_time_end"` // 审核结束时间
}
type UserDepositRefundRecordListResp struct {
List []DepositRefundRecord `json:"list"`
@ -2793,6 +2795,23 @@ func (m *UserDepositRefundRecordListReq) DepositRefundRecordList() (*UserDeposit
if m.Uid != 0 {
qs = qs.Where("uid=?", m.Uid)
}
if m.AuditTimeStart != "" {
parse, err := time.Parse(QueryTimeFormat, m.AuditTimeStart)
if err != nil {
logger.Errorf("DepositRefundRecordList err:", err)
return nil, err
}
qs = qs.Where("confirm_time >= ?", parse)
}
if m.AuditTimeEnd != "" {
parse, err := time.Parse(QueryTimeFormat, m.AuditTimeEnd)
if err != nil {
logger.Errorf("DepositRefundRecordList err:", err)
return nil, err
}
//parse = parse.AddDate(0, 0, 1)
qs = qs.Where("confirm_time <= ?", parse)
}
resp := &UserDepositRefundRecordListResp{
PageIndex: m.PageNum,
PageSize: m.PageSize,

View File

@ -39,5 +39,6 @@ func registerMessageCenterRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWT
{
r3.POST("list", message.UserMessageList) // 列表
r3.POST("set_status", message.UserMessageSetStatus) // 阅读
r3.POST("delete", message.UserMessageDelete) // 删除消息
}
}

View File

@ -8192,6 +8192,40 @@ const docTemplate = `{
}
}
},
"/api/v1/user_message/delete": {
"post": {
"description": "删除指定消息、批量消息或全部消息(逻辑删除,限当前用户)",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"消息中心V1.5.0"
],
"summary": "用户消息-删除(支持单条、批量或全部)",
"parameters": [
{
"description": "删除参数",
"name": "data",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/models.UserMessageDeleteReq"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/app.Response"
}
}
}
}
},
"/api/v1/user_message/list": {
"post": {
"description": "获取当前用户的消息记录",
@ -8850,7 +8884,7 @@ const docTemplate = `{
"models.BizTypeListReq": {
"type": "object",
"properties": {
"page": {
"page_index": {
"type": "integer"
},
"page_size": {
@ -8868,7 +8902,7 @@ const docTemplate = `{
"$ref": "#/definitions/models.BizTypeItem"
}
},
"page": {
"page_index": {
"description": "当前页",
"type": "integer"
},
@ -9058,7 +9092,7 @@ const docTemplate = `{
"description": "事件类型",
"type": "string"
},
"page": {
"page_index": {
"description": "页码",
"type": "integer"
},
@ -9088,7 +9122,7 @@ const docTemplate = `{
"$ref": "#/definitions/models.BusMessageItem"
}
},
"page": {
"page_index": {
"type": "integer"
},
"page_size": {
@ -15872,7 +15906,7 @@ const docTemplate = `{
"biz_type": {
"type": "string"
},
"page": {
"page_index": {
"type": "integer"
},
"page_size": {
@ -15889,7 +15923,7 @@ const docTemplate = `{
"$ref": "#/definitions/models.EventItem"
}
},
"page": {
"page_index": {
"type": "integer"
},
"page_size": {
@ -22478,7 +22512,7 @@ const docTemplate = `{
"description": "消息等级1=普通2=重要3=紧急",
"type": "integer"
},
"page": {
"page_index": {
"description": "页码",
"type": "integer"
},
@ -22509,7 +22543,7 @@ const docTemplate = `{
"$ref": "#/definitions/models.SysAnnouncementItem"
}
},
"page": {
"page_index": {
"description": "页码",
"type": "integer"
},
@ -23061,7 +23095,7 @@ const docTemplate = `{
"$ref": "#/definitions/models.TemplateVariable"
}
},
"page": {
"page_index": {
"description": "当前页",
"type": "integer"
},
@ -23090,7 +23124,7 @@ const docTemplate = `{
"description": "事件类型",
"type": "string"
},
"page": {
"page_index": {
"description": "当前页",
"type": "integer"
},
@ -23535,6 +23569,22 @@ const docTemplate = `{
}
}
},
"models.UserMessageDeleteReq": {
"type": "object",
"properties": {
"delete_all": {
"description": "是否删除全部",
"type": "boolean"
},
"ids": {
"description": "消息ID列表DeleteAll=false时必填",
"type": "array",
"items": {
"type": "integer"
}
}
}
},
"models.UserMessageDetailRespItem": {
"type": "object",
"properties": {
@ -23542,6 +23592,10 @@ const docTemplate = `{
"description": "渲染后内容",
"type": "string"
},
"created_at": {
"description": "接收时间",
"type": "string"
},
"display_mode": {
"description": "公告消息字段展示方式1=弹窗2=滚动3=弹窗+滚动",
"type": "integer"
@ -23598,7 +23652,7 @@ const docTemplate = `{
"description": "0-全部1-已读2-未读",
"type": "integer"
},
"page": {
"page_index": {
"description": "页码",
"type": "integer"
},
@ -23617,7 +23671,7 @@ const docTemplate = `{
"$ref": "#/definitions/models.UserMessageDetailRespItem"
}
},
"page": {
"page_index": {
"type": "integer"
},
"page_size": {
@ -23633,7 +23687,10 @@ const docTemplate = `{
"properties": {
"id": {
"description": "消息ID可选read_all 为 false 时必传)",
"type": "integer"
"type": "array",
"items": {
"type": "integer"
}
},
"read_all": {
"description": "是否设为全部已读",

View File

@ -8181,6 +8181,40 @@
}
}
},
"/api/v1/user_message/delete": {
"post": {
"description": "删除指定消息、批量消息或全部消息(逻辑删除,限当前用户)",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"消息中心V1.5.0"
],
"summary": "用户消息-删除(支持单条、批量或全部)",
"parameters": [
{
"description": "删除参数",
"name": "data",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/models.UserMessageDeleteReq"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/app.Response"
}
}
}
}
},
"/api/v1/user_message/list": {
"post": {
"description": "获取当前用户的消息记录",
@ -8839,7 +8873,7 @@
"models.BizTypeListReq": {
"type": "object",
"properties": {
"page": {
"page_index": {
"type": "integer"
},
"page_size": {
@ -8857,7 +8891,7 @@
"$ref": "#/definitions/models.BizTypeItem"
}
},
"page": {
"page_index": {
"description": "当前页",
"type": "integer"
},
@ -9047,7 +9081,7 @@
"description": "事件类型",
"type": "string"
},
"page": {
"page_index": {
"description": "页码",
"type": "integer"
},
@ -9077,7 +9111,7 @@
"$ref": "#/definitions/models.BusMessageItem"
}
},
"page": {
"page_index": {
"type": "integer"
},
"page_size": {
@ -15861,7 +15895,7 @@
"biz_type": {
"type": "string"
},
"page": {
"page_index": {
"type": "integer"
},
"page_size": {
@ -15878,7 +15912,7 @@
"$ref": "#/definitions/models.EventItem"
}
},
"page": {
"page_index": {
"type": "integer"
},
"page_size": {
@ -22467,7 +22501,7 @@
"description": "消息等级1=普通2=重要3=紧急",
"type": "integer"
},
"page": {
"page_index": {
"description": "页码",
"type": "integer"
},
@ -22498,7 +22532,7 @@
"$ref": "#/definitions/models.SysAnnouncementItem"
}
},
"page": {
"page_index": {
"description": "页码",
"type": "integer"
},
@ -23050,7 +23084,7 @@
"$ref": "#/definitions/models.TemplateVariable"
}
},
"page": {
"page_index": {
"description": "当前页",
"type": "integer"
},
@ -23079,7 +23113,7 @@
"description": "事件类型",
"type": "string"
},
"page": {
"page_index": {
"description": "当前页",
"type": "integer"
},
@ -23524,6 +23558,22 @@
}
}
},
"models.UserMessageDeleteReq": {
"type": "object",
"properties": {
"delete_all": {
"description": "是否删除全部",
"type": "boolean"
},
"ids": {
"description": "消息ID列表DeleteAll=false时必填",
"type": "array",
"items": {
"type": "integer"
}
}
}
},
"models.UserMessageDetailRespItem": {
"type": "object",
"properties": {
@ -23531,6 +23581,10 @@
"description": "渲染后内容",
"type": "string"
},
"created_at": {
"description": "接收时间",
"type": "string"
},
"display_mode": {
"description": "公告消息字段展示方式1=弹窗2=滚动3=弹窗+滚动",
"type": "integer"
@ -23587,7 +23641,7 @@
"description": "0-全部1-已读2-未读",
"type": "integer"
},
"page": {
"page_index": {
"description": "页码",
"type": "integer"
},
@ -23606,7 +23660,7 @@
"$ref": "#/definitions/models.UserMessageDetailRespItem"
}
},
"page": {
"page_index": {
"type": "integer"
},
"page_size": {
@ -23622,7 +23676,10 @@
"properties": {
"id": {
"description": "消息ID可选read_all 为 false 时必传)",
"type": "integer"
"type": "array",
"items": {
"type": "integer"
}
},
"read_all": {
"description": "是否设为全部已读",

View File

@ -378,7 +378,7 @@ definitions:
type: object
models.BizTypeListReq:
properties:
page:
page_index:
type: integer
page_size:
type: integer
@ -390,7 +390,7 @@ definitions:
items:
$ref: '#/definitions/models.BizTypeItem'
type: array
page:
page_index:
description: 当前页
type: integer
page_size:
@ -527,7 +527,7 @@ definitions:
event:
description: 事件类型
type: string
page:
page_index:
description: 页码
type: integer
page_size:
@ -548,7 +548,7 @@ definitions:
items:
$ref: '#/definitions/models.BusMessageItem'
type: array
page:
page_index:
type: integer
page_size:
type: integer
@ -5483,7 +5483,7 @@ definitions:
properties:
biz_type:
type: string
page:
page_index:
type: integer
page_size:
type: integer
@ -5496,7 +5496,7 @@ definitions:
items:
$ref: '#/definitions/models.EventItem'
type: array
page:
page_index:
type: integer
page_size:
type: integer
@ -10243,7 +10243,7 @@ definitions:
level:
description: 消息等级1=普通2=重要3=紧急
type: integer
page:
page_index:
description: 页码
type: integer
page_size:
@ -10265,7 +10265,7 @@ definitions:
items:
$ref: '#/definitions/models.SysAnnouncementItem'
type: array
page:
page_index:
description: 页码
type: integer
page_size:
@ -10665,7 +10665,7 @@ definitions:
items:
$ref: '#/definitions/models.TemplateVariable'
type: array
page:
page_index:
description: 当前页
type: integer
page_size:
@ -10683,7 +10683,7 @@ definitions:
event:
description: 事件类型
type: string
page:
page_index:
description: 当前页
type: integer
page_size:
@ -11011,11 +11011,25 @@ definitions:
description: 总条数
type: integer
type: object
models.UserMessageDeleteReq:
properties:
delete_all:
description: 是否删除全部
type: boolean
ids:
description: 消息ID列表DeleteAll=false时必填
items:
type: integer
type: array
type: object
models.UserMessageDetailRespItem:
properties:
content:
description: 渲染后内容
type: string
created_at:
description: 接收时间
type: string
display_mode:
description: 公告消息字段展示方式1=弹窗2=滚动3=弹窗+滚动
type: integer
@ -11057,7 +11071,7 @@ definitions:
is_read:
description: 0-全部1-已读2-未读
type: integer
page:
page_index:
description: 页码
type: integer
page_size:
@ -11070,7 +11084,7 @@ definitions:
items:
$ref: '#/definitions/models.UserMessageDetailRespItem'
type: array
page:
page_index:
type: integer
page_size:
type: integer
@ -11081,7 +11095,9 @@ definitions:
properties:
id:
description: 消息ID可选read_all 为 false 时必传)
type: integer
items:
type: integer
type: array
read_all:
description: 是否设为全部已读
type: boolean
@ -16582,6 +16598,28 @@ paths:
summary: 查询会员手机号
tags:
- 用户信息
/api/v1/user_message/delete:
post:
consumes:
- application/json
description: 删除指定消息、批量消息或全部消息(逻辑删除,限当前用户)
parameters:
- description: 删除参数
in: body
name: data
required: true
schema:
$ref: '#/definitions/models.UserMessageDeleteReq'
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/app.Response'
summary: 用户消息-删除(支持单条、批量或全部)
tags:
- 消息中心V1.5.0
/api/v1/user_message/list:
post:
consumes: