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

260 lines
7.3 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/logger"
"go-admin/tools/app"
"net/http"
)
// 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]
func BusMessageCreate(c *gin.Context) {
var req models.BusMessageCreateReq
if err := c.ShouldBindJSON(&req); err != nil {
app.Error(c, http.StatusBadRequest, err, "参数绑定失败")
return
}
// 校验业务类型、事件类型、模板变量
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, "查询成功")
}
// 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]
func BusMessageSetStatus(c *gin.Context) {
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
}
// 状态更新
if err := orm.Eloquent.Model(&config).Update("status", req.Status).Error; err != nil {
app.Error(c, http.StatusInternalServerError, nil, "状态更新失败")
return
}
app.OK(c, nil, "状态更新成功")
}
// 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]
func BusMessageDelete(c *gin.Context) {
var req models.SysMessageDeleteReq
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
}
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
}
app.OK(c, nil, "删除成功")
}
func BusMessageEdit(c *gin.Context) {
}