Files
windows_lock_go/app/admin/service/mm_risk_log.go
2025-07-15 16:43:50 +08:00

243 lines
5.6 KiB
Go

package service
import (
"errors"
"strconv"
"strings"
"github.com/bytedance/sonic"
"github.com/go-admin-team/go-admin-core/sdk/service"
"gorm.io/gorm"
"go-admin/app/admin/models"
"go-admin/app/admin/service/dto"
"go-admin/common/actions"
cDto "go-admin/common/dto"
"go-admin/common/global"
"go-admin/common/helper"
)
type MmRiskLog struct {
service.Service
}
// GetPage 获取MmRiskLog列表
func (e *MmRiskLog) GetPage(c *dto.MmRiskLogGetPageReq, p *actions.DataPermission, list *[]dto.MmRiskLogPageResp, count *int64) error {
var err error
var data models.MmRiskLog
var role models.SysRole
query := e.Orm.Model(&data).
Joins("left join mm_machine on mm_machine.machine_id = mm_risk_log.machine_id and mm_machine.deleted_at is null")
e.Orm.Model(role).Where("role_id =?", p.RoleId).Find(&role)
if c.GroupId == -1 {
query.Where("mm_machine.group_id = 0")
} else if c.GroupId > 0 {
query.Where("mm_machine.group_id = ?", c.GroupId)
}
if c.Type != nil {
query.Where("mm_risk_log.type = ?", c.Type)
}
if role.RoleKey != "admin" {
groups := ""
e.Orm.Model(models.MmUserGroup{}).Where("user_id = ?", p.UserId).Pluck("group_ids", &groups)
ids := strings.Split(groups, ",")
groupIds := make([]string, 0)
for _, item := range ids {
if item != "" {
groupIds = append(groupIds, item)
}
}
if len(groupIds) > 0 {
query.Where("mm_machine.group_id in ?", groupIds)
} else {
query.Where("1=0")
}
}
err = query.
Scopes(
cDto.MakeCondition(c.GetNeedSearch()),
cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
).
Select("mm_risk_log.*,mm_machine.group_id").
Find(list).Limit(-1).Offset(-1).
Count(count).Error
if err != nil {
e.Log.Errorf("MmRiskLogService GetPage error:%s \r\n", err)
return err
}
return nil
}
// Get 获取MmRiskLog对象
func (e *MmRiskLog) Get(d *dto.MmRiskLogGetReq, p *actions.DataPermission, model *models.MmRiskLog) error {
var data models.MmRiskLog
err := e.Orm.Model(&data).
Scopes(
actions.Permission(data.TableName(), p),
).
First(model, d.GetId()).Error
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
err = errors.New("查看对象不存在或无权查看")
e.Log.Errorf("Service GetMmRiskLog error:%s \r\n", err)
return err
}
if err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
return nil
}
// Insert 创建MmRiskLog对象
func (e *MmRiskLog) Insert(c *dto.MmRiskLogInsertReq) error {
var err error
var data models.MmRiskLog
c.Generate(&data)
err = e.Orm.Create(&data).Error
if err != nil {
e.Log.Errorf("MmRiskLogService Insert error:%s \r\n", err)
return err
}
return nil
}
// Update 修改MmRiskLog对象
func (e *MmRiskLog) Update(c *dto.MmRiskLogUpdateReq, p *actions.DataPermission) error {
var err error
var data = models.MmRiskLog{}
e.Orm.Scopes(
actions.Permission(data.TableName(), p),
).First(&data, c.GetId())
c.Generate(&data)
db := e.Orm.Save(&data)
if err = db.Error; err != nil {
e.Log.Errorf("MmRiskLogService Save error:%s \r\n", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权更新该数据")
}
return nil
}
// Remove 删除MmRiskLog
func (e *MmRiskLog) Remove(d *dto.MmRiskLogDeleteReq, p *actions.DataPermission) error {
var data models.MmRiskLog
db := e.Orm.Model(&data).
Scopes(
actions.Permission(data.TableName(), p),
).Delete(&data, d.GetId())
if err := db.Error; err != nil {
e.Log.Errorf("Service RemoveMmRiskLog error:%s \r\n", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权删除该数据")
}
return nil
}
// Save 保存MmRiskLog对象
func (e *MmRiskLog) Save(req *dto.MmRiskLogBatchReq) error {
datas := make([]models.MmRiskLog, 0)
for _, item := range req.Contents {
data := models.MmRiskLog{}
data.MachineId = req.MachineId
data.BiosId = req.BiosId
data.Type = item.Type
data.Content = item.Content
datas = append(datas, data)
}
if err := e.Orm.Save(&datas).Error; err != nil {
e.Log.Errorf("MmRiskLogService Save error:%s \r\n", err)
return err
}
helper.SafeGo(func() {
if err := e.SendMsg(datas); err != nil {
e.Log.Errorf("发送消息失败:%s", err)
}
})
return nil
}
// 发送消息并保存日志
func (e *MmRiskLog) SendMsg(datas []models.MmRiskLog) error {
walletWhiteListService := MmWalletWhiteList{Service: e.Service}
addresss, err := walletWhiteListService.GetList()
if err != nil {
e.Log.Errorf("获取白名单缓存失败:")
}
alarmLogs := []models.MmAlarmLog{}
for _, item := range datas {
if helper.ArrayAny(addresss, item.Content) {
continue
}
alarmLog := models.MmAlarmLog{}
alarmLog.MachineId = item.MachineId
alarmLog.BiosId = item.BiosId
alarmLog.Content = item.Content
alarmLogs = append(alarmLogs, alarmLog)
}
if len(alarmLogs) == 0 {
return nil
}
userService := SysUser{Service: e.Service}
userIds, err := userService.GetByPermission("admin:mmAlarmLog:notice")
if err != nil {
e.Log.Errorf("获取管理员失败:%s", err)
}
userIdStr := []string{}
for _, item := range userIds {
userIdStr = append(userIdStr, strconv.Itoa(item))
}
if err := e.Orm.Save(&alarmLogs).Error; err != nil {
e.Log.Errorf("保存告警日志失败:%s", err)
return err
}
for _, item := range alarmLogs {
notice := global.AlarmLogNotice{
MachineId: item.MachineId,
BiosId: item.BiosId,
Content: item.Content,
}
vals, _ := sonic.Marshal(notice)
if vals != nil {
global.WebSocketHub.SendToAll(userIdStr, vals)
}
}
return nil
}
// ClearAll 清空日志
func (e *MmRiskLog) ClearAll() error {
if err := e.Orm.Exec("TRUNCATE TABLE mm_risk_log").Error; err != nil {
e.Log.Errorf("清空日志失败:%s", err)
return err
}
return nil
}