2025-06-27 09:39:36 +00:00
|
|
|
|
package message
|
|
|
|
|
|
2025-07-01 03:54:23 +00:00
|
|
|
|
import (
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
|
"go-admin/app/admin/models"
|
|
|
|
|
orm "go-admin/common/global"
|
|
|
|
|
"go-admin/logger"
|
|
|
|
|
"go-admin/tools/app"
|
|
|
|
|
"net/http"
|
|
|
|
|
)
|
2025-06-27 09:39:36 +00:00
|
|
|
|
|
2025-07-01 03:54:23 +00:00
|
|
|
|
// BusMessageCreate 新增业务消息
|
|
|
|
|
// @Summary 新增业务消息
|
|
|
|
|
// @Tags 消息中心,V1.5.0
|
|
|
|
|
// @Produce json
|
|
|
|
|
// @Accept json
|
|
|
|
|
// @Param request body models.BusMessageCreateReq true "新增业务消息模型"
|
|
|
|
|
// @Success 200 {object} models.BusMessageCreateResp
|
|
|
|
|
// @Router /api/v1/bus_message/create [post]
|
2025-06-27 09:39:36 +00:00
|
|
|
|
func BusMessageCreate(c *gin.Context) {
|
2025-07-01 03:54:23 +00:00
|
|
|
|
var req models.BusMessageCreateReq
|
|
|
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
|
|
|
app.Error(c, http.StatusBadRequest, err, "参数绑定失败")
|
|
|
|
|
return
|
|
|
|
|
}
|
2025-06-27 09:39:36 +00:00
|
|
|
|
|
2025-07-01 03:54:23 +00:00
|
|
|
|
// 校验业务类型、事件类型、模板变量
|
|
|
|
|
if err := models.ValidateBizEventAndTemplate(req.BizType, req.Event, req.ContentTemplate); err != nil {
|
|
|
|
|
app.Error(c, http.StatusBadRequest, err, "模板校验失败")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 创建业务消息配置
|
|
|
|
|
msg := models.SystemMessageConfig{
|
|
|
|
|
MessageType: models.BusinessMessageType, // 业务消息
|
|
|
|
|
Title: req.Title,
|
|
|
|
|
ContentTemplate: req.ContentTemplate,
|
|
|
|
|
BizType: req.BizType,
|
|
|
|
|
Event: req.Event,
|
|
|
|
|
Status: req.Status,
|
|
|
|
|
}
|
|
|
|
|
if err := orm.Eloquent.Create(&msg).Error; err != nil {
|
|
|
|
|
app.Error(c, http.StatusInternalServerError, err, "创建业务消息失败")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 创建接收对象配置
|
|
|
|
|
target := models.SystemMessageTarget{
|
|
|
|
|
MessageConfigID: uint(msg.ID),
|
|
|
|
|
TargetType: req.TargetType,
|
|
|
|
|
TargetID: req.TargetID,
|
|
|
|
|
}
|
|
|
|
|
if err := orm.Eloquent.Create(&target).Error; err != nil {
|
|
|
|
|
app.Error(c, http.StatusInternalServerError, err, "接收对象配置失败")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
app.OK(c, models.BusMessageCreateResp{ID: uint(msg.ID)}, "创建成功")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// BusMessageList 业务消息列表
|
|
|
|
|
// @Summary 业务消息列表
|
|
|
|
|
// @Tags 消息中心,V1.5.0
|
|
|
|
|
// @Accept json
|
|
|
|
|
// @Produce json
|
|
|
|
|
// @Param request body models.BusMessageListReq true "查询条件"
|
|
|
|
|
// @Success 200 {object} models.BusMessageListResp
|
|
|
|
|
// @Router /api/v1/bus_message/list [post]
|
|
|
|
|
func BusMessageList(c *gin.Context) {
|
|
|
|
|
var req models.BusMessageListReq
|
|
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 基础查询:业务消息
|
|
|
|
|
db := orm.Eloquent.Table("system_message_config").
|
|
|
|
|
Where("message_type = ?", models.BusinessMessageType)
|
|
|
|
|
|
|
|
|
|
if req.BizType != "" {
|
|
|
|
|
db = db.Where("biz_type = ?", req.BizType)
|
|
|
|
|
}
|
|
|
|
|
if req.Event != "" {
|
|
|
|
|
db = db.Where("event = ?", req.Event)
|
|
|
|
|
}
|
|
|
|
|
if req.Status != 0 {
|
|
|
|
|
db = db.Where("status = ?", req.Status)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 角色过滤(JOIN subquery)
|
|
|
|
|
if len(req.RoleID) > 0 {
|
|
|
|
|
subQuery := orm.Eloquent.Table("system_message_target").
|
|
|
|
|
Select("message_config_id").
|
|
|
|
|
Where("target_type = ?", models.TargetTypeByRole).
|
|
|
|
|
Where("target_id IN (?)", req.RoleID)
|
|
|
|
|
db = db.Where("id IN (?)", subQuery)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var total int64
|
|
|
|
|
if err := db.Count(&total).Error; err != nil {
|
|
|
|
|
app.Error(c, http.StatusInternalServerError, nil, "统计失败: "+err.Error())
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var list []models.SystemMessageConfig
|
|
|
|
|
if err := db.
|
|
|
|
|
Order("created_at DESC").
|
|
|
|
|
Offset((req.Page - 1) * req.PageSize).
|
|
|
|
|
Limit(req.PageSize).
|
|
|
|
|
Find(&list).Error; err != nil {
|
|
|
|
|
app.Error(c, http.StatusInternalServerError, nil, "查询失败: "+err.Error())
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var items []models.BusMessageItem
|
|
|
|
|
for _, cfg := range list {
|
|
|
|
|
item := models.BusMessageItem{
|
|
|
|
|
ID: cfg.ID,
|
|
|
|
|
CreatedAt: cfg.CreatedAt,
|
|
|
|
|
UpdatedAt: cfg.UpdatedAt,
|
|
|
|
|
ContentTemplate: cfg.ContentTemplate,
|
|
|
|
|
BizType: cfg.BizType,
|
|
|
|
|
Event: cfg.Event,
|
|
|
|
|
Status: cfg.Status,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 查询该消息绑定的所有角色
|
|
|
|
|
var targets []models.SystemMessageTarget
|
|
|
|
|
if err := orm.Eloquent.Where("message_config_id = ? AND target_type = ?", cfg.ID,
|
|
|
|
|
models.TargetTypeByRole).Find(&targets).Error; err == nil {
|
|
|
|
|
for _, t := range targets {
|
|
|
|
|
item.RoleID = append(item.RoleID, t.TargetID)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
items = append(items, item)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
resp := models.BusMessageListResp{
|
|
|
|
|
List: items,
|
|
|
|
|
Total: total,
|
|
|
|
|
Page: req.Page,
|
|
|
|
|
PageSize: req.PageSize,
|
|
|
|
|
}
|
|
|
|
|
app.OK(c, resp, "查询成功")
|
2025-06-27 09:39:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-01 03:54:23 +00:00
|
|
|
|
// BusMessageSetStatus 设置业务消息状态(启用/禁用)
|
|
|
|
|
// @Summary 设置业务消息状态
|
|
|
|
|
// @Tags 消息中心,V1.5.0
|
|
|
|
|
// @Accept json
|
|
|
|
|
// @Produce json
|
|
|
|
|
// @Param request body models.SysMessageSetStatusReq true "状态更新请求"
|
|
|
|
|
// @Success 200 {object} app.Response
|
|
|
|
|
// @Router /api/v1/bus_message/set_status [post]
|
2025-06-27 09:39:36 +00:00
|
|
|
|
func BusMessageSetStatus(c *gin.Context) {
|
2025-07-01 03:54:23 +00:00
|
|
|
|
var req models.SysMessageSetStatusReq
|
|
|
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
|
|
|
app.Error(c, http.StatusBadRequest, nil, "参数错误: "+err.Error())
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var config models.SystemMessageConfig
|
|
|
|
|
if err := orm.Eloquent.Where("id = ? AND message_type = ?", req.ID, models.BusinessMessageType).
|
|
|
|
|
First(&config).Error; err != nil {
|
|
|
|
|
app.Error(c, http.StatusNotFound, nil, "业务消息不存在")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 校验状态切换合法性
|
|
|
|
|
switch req.Status {
|
|
|
|
|
case 1: // 启用
|
|
|
|
|
if config.Status != models.MessageStatusOnDisable {
|
|
|
|
|
app.Error(c, http.StatusBadRequest, nil, "只有禁用状态才能启用")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
case 2: // 禁用
|
|
|
|
|
if config.Status != models.MessageStatusOnStart {
|
|
|
|
|
app.Error(c, http.StatusBadRequest, nil, "只有启用状态才能禁用")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
default:
|
|
|
|
|
app.Error(c, http.StatusBadRequest, nil, "不支持的目标状态")
|
|
|
|
|
return
|
|
|
|
|
}
|
2025-06-27 09:39:36 +00:00
|
|
|
|
|
2025-07-01 03:54:23 +00:00
|
|
|
|
// 状态更新
|
|
|
|
|
if err := orm.Eloquent.Model(&config).Update("status", req.Status).Error; err != nil {
|
|
|
|
|
app.Error(c, http.StatusInternalServerError, nil, "状态更新失败")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
app.OK(c, nil, "状态更新成功")
|
2025-06-27 09:39:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-01 03:54:23 +00:00
|
|
|
|
// BusMessageDelete 删除业务消息(禁用状态可删)
|
|
|
|
|
// @Summary 删除业务消息
|
|
|
|
|
// @Tags 消息中心,V1.5.0
|
|
|
|
|
// @Accept json
|
|
|
|
|
// @Produce json
|
|
|
|
|
// @Param request body models.SysMessageDeleteReq true "删除业务消息"
|
|
|
|
|
// @Success 200 {object} app.Response
|
|
|
|
|
// @Router /api/v1/bus_message/delete [post]
|
2025-06-27 09:39:36 +00:00
|
|
|
|
func BusMessageDelete(c *gin.Context) {
|
2025-07-01 03:54:23 +00:00
|
|
|
|
var req models.SysMessageDeleteReq
|
|
|
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
|
|
|
app.Error(c, http.StatusBadRequest, nil, "参数错误: "+err.Error())
|
|
|
|
|
return
|
|
|
|
|
}
|
2025-06-27 09:39:36 +00:00
|
|
|
|
|
2025-07-01 03:54:23 +00:00
|
|
|
|
var config models.SystemMessageConfig
|
|
|
|
|
if err := orm.Eloquent.Where("id = ? AND message_type = ?", req.ID, models.BusinessMessageType).
|
|
|
|
|
First(&config).Error; err != nil {
|
|
|
|
|
app.Error(c, http.StatusNotFound, nil, "业务消息不存在")
|
|
|
|
|
return
|
|
|
|
|
}
|
2025-06-27 09:39:36 +00:00
|
|
|
|
|
2025-07-01 03:54:23 +00:00
|
|
|
|
if config.Status != models.MessageStatusOnDisable {
|
|
|
|
|
app.Error(c, http.StatusBadRequest, nil, "仅禁用状态可删除")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
begin := orm.Eloquent.Begin()
|
|
|
|
|
// 删除主配置(软删除)
|
|
|
|
|
if err := begin.Delete(&config).Error; err != nil {
|
|
|
|
|
begin.Rollback()
|
|
|
|
|
app.Error(c, http.StatusInternalServerError, nil, "删除公告失败")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 删除接收对象配置
|
|
|
|
|
if err := begin.Where("message_config_id = ?", config.ID).
|
|
|
|
|
Delete(&models.SystemMessageTarget{}).Error; err != nil {
|
|
|
|
|
begin.Rollback()
|
|
|
|
|
app.Error(c, http.StatusInternalServerError, nil, "删除公告失败")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err := begin.Commit().Error
|
|
|
|
|
if err != nil {
|
|
|
|
|
begin.Rollback()
|
|
|
|
|
logger.Error("BusMessageDelete commit err:", logger.Field("err", err))
|
|
|
|
|
app.Error(c, http.StatusInternalServerError, nil, "删除公告失败")
|
|
|
|
|
return
|
|
|
|
|
}
|
2025-06-27 09:39:36 +00:00
|
|
|
|
|
2025-07-01 03:54:23 +00:00
|
|
|
|
app.OK(c, nil, "删除成功")
|
2025-06-27 09:39:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func BusMessageEdit(c *gin.Context) {
|
|
|
|
|
|
|
|
|
|
}
|