173 lines
5.5 KiB
Go
Raw Normal View History

2025-04-24 20:39:31 +08:00
package smdl
import (
"admin/apps/game/domain/entity"
2025-05-13 18:13:22 +08:00
"admin/apps/game/domain/projects/smdl/internal"
"admin/apps/game/domain/repo"
2025-04-24 20:39:31 +08:00
"admin/apps/game/model"
2025-05-13 18:13:22 +08:00
"admin/internal/consts"
2025-04-24 20:39:31 +08:00
"admin/internal/errcode"
2025-05-16 15:17:10 +08:00
dto2 "admin/internal/model/dto"
2025-05-13 18:13:22 +08:00
"admin/lib/xlog"
"fmt"
2025-04-24 20:39:31 +08:00
)
type ServerHook struct {
}
2025-05-16 15:17:10 +08:00
func (hook *ServerHook) List(projectInfo *entity.Project, resource string, params *dto2.CommonListReq,
fields []*dto2.CommonDtoFieldDesc, totalCount int, rows []dto2.CommonDtoValues) (
int, []*dto2.CommonDtoFieldDesc, []dto2.CommonDtoValues, error) {
2025-04-24 20:39:31 +08:00
alisrvAddr := projectInfo.GetApiAddr()
if alisrvAddr == "" {
2025-05-09 18:28:15 +08:00
return 0, nil, nil, errcode.New(errcode.ServerError, "项目%v没有配置api服务器地址", projectInfo.Po.Name)
2025-04-24 20:39:31 +08:00
}
2025-05-13 18:13:22 +08:00
serverInfoList, err := internal.GetRemoteServerInfoList(alisrvAddr)
2025-04-24 20:39:31 +08:00
if err != nil {
2025-05-09 18:28:15 +08:00
return 0, nil, nil, err
2025-04-24 20:39:31 +08:00
}
for _, row := range rows {
2025-05-13 18:13:22 +08:00
var findRemoteServerInfo *internal.ServerInfo
2025-05-09 18:28:15 +08:00
for _, curRunning := range serverInfoList {
2025-04-24 20:39:31 +08:00
et := (&entity.CommonResource{}).FromPo(&model.Server{}).FromDto(row)
if et.ToPo().(*model.Server).ServerConfID == curRunning.ServerId {
// 运行中,给描述信息添加运行信息
2025-05-09 18:28:15 +08:00
findRemoteServerInfo = curRunning
2025-04-24 20:39:31 +08:00
break
}
}
2025-05-09 18:28:15 +08:00
if findRemoteServerInfo != nil {
2025-04-24 20:39:31 +08:00
row["RunningStatus"] = "运行中"
2025-05-09 18:28:15 +08:00
row["Ccu"] = findRemoteServerInfo.Ccu
row["TotalRoleCount"] = findRemoteServerInfo.TotalRoleCount
row["TotalAccountCount"] = findRemoteServerInfo.TotalAccountCount
2025-05-13 18:13:22 +08:00
if findRemoteServerInfo.IsServerDown {
row["IsServerDown"] = "是"
2025-05-09 18:28:15 +08:00
} else {
2025-05-13 18:13:22 +08:00
row["IsServerDown"] = "否"
2025-05-09 18:28:15 +08:00
}
2025-04-24 20:39:31 +08:00
} else {
row["RunningStatus"] = "未知"
2025-05-09 18:28:15 +08:00
row["Ccu"] = 0
row["TotalRoleCount"] = 0
row["TotalAccountCount"] = 0
row["IsWhitelistLogin"] = "否"
2025-04-24 20:39:31 +08:00
}
}
2025-05-09 18:28:15 +08:00
return totalCount, fields, rows, nil
}
2025-05-16 15:17:10 +08:00
func (hook *ServerHook) RowsSelection(projectInfo *entity.Project, resource string, btnKey string, dtoObjs []dto2.CommonDtoValues) (*dto2.CommonRowsSelectionRsp, error) {
2025-05-13 18:13:22 +08:00
msg := ""
serverIds := make([]string, 0, len(dtoObjs))
apiAddr := projectInfo.GetApiAddr()
allRunningServers, err := getAllRunningServers(projectInfo)
if err != nil {
return nil, err
}
opHandler := func(serverRunningInfo *internal.ServerInfo) error {
switch btnKey {
case consts.BtnKeyGlobal_Server_UpAll, consts.BtnKeyRow_Server_Up:
err := serverRunningInfo.Up(apiAddr)
if err != nil {
xlog.Warnf("操作项目:%v 服务器:%v 起服返回错误:%v", projectInfo.GetProjectPo().ID, serverRunningInfo.ServerId, err)
} else {
xlog.Warnf("操作项目:%v 服务器:%v 起服成功", projectInfo.GetProjectPo().ID, serverRunningInfo.ServerId)
}
return err
case consts.BtnKeyGlobal_Server_DownAll, consts.BtnKeyRow_Server_Down:
err := serverRunningInfo.Down(apiAddr)
if err != nil {
xlog.Warnf("操作项目:%v 服务器:%v 停服返回错误:%v", projectInfo.GetProjectPo().ID, serverRunningInfo.ServerId, err)
} else {
xlog.Warnf("操作项目:%v 服务器:%v 停服成功", projectInfo.GetProjectPo().ID, serverRunningInfo.ServerId)
}
return err
default:
return errcode.New(errcode.ParamsInvalid, "unsupport btn key:%v", btnKey)
}
}
errList := make([]error, 0)
if len(dtoObjs) == 0 {
for _, runningServer := range allRunningServers {
err := opHandler(runningServer)
if err != nil {
errList = append(errList, err)
}
}
switch btnKey {
case consts.BtnKeyGlobal_Server_UpAll:
msg = "一键起服"
case consts.BtnKeyGlobal_Server_DownAll:
msg = "一键停服"
}
} else {
for _, dtoObj := range dtoObjs {
serverId := dtoObj["ServerConfID"].(string)
serverRunningInfo := allRunningServers.FindByID(serverId)
if serverRunningInfo == nil {
xlog.Warnf("项目:%v 服务器:%v 处于停服中,跳过操作", projectInfo.Po.Name, serverId)
continue
}
serverIds = append(serverIds, serverId)
err := opHandler(serverRunningInfo)
if err != nil {
errList = append(errList, err)
}
}
switch btnKey {
case consts.BtnKeyGlobal_Server_UpAll:
msg = fmt.Sprintf("服务器:%v一键起服", serverIds)
case consts.BtnKeyGlobal_Server_DownAll:
msg = fmt.Sprintf("服务器:%v一键停服", serverIds)
case consts.BtnKeyRow_Server_Up:
msg = fmt.Sprintf("服务器:%v起服", serverIds)
case consts.BtnKeyRow_Server_Down:
msg = fmt.Sprintf("服务器:%v停服", serverIds)
}
}
2025-05-16 15:17:10 +08:00
return &dto2.CommonRowsSelectionRsp{
2025-05-13 18:13:22 +08:00
Msg: fmt.Sprintf("执行%v操作成功!", msg),
2025-05-12 18:43:41 +08:00
NeedRefresh: true,
}, nil
}
2025-05-13 18:13:22 +08:00
// getAllRunningServers 获取本地配置的服务器列表和远程获取的运行中服务器列表求个交集
func getAllRunningServers(projectEt *entity.Project) (internal.ServerInfoList, error) {
alisrvAddr := projectEt.GetApiAddr()
if alisrvAddr == "" {
return nil, errcode.New(errcode.ServerError, "项目%v没有配置api服务器地址", projectEt.Po.Name)
}
2025-05-09 18:28:15 +08:00
2025-05-13 18:13:22 +08:00
remoteRunningServers, err := internal.GetRemoteServerInfoList(alisrvAddr)
if err != nil {
return nil, err
}
localConfServers, err := repo.ServerRepoInstance.List(projectEt.Po.ID)
2025-05-09 18:28:15 +08:00
if err != nil {
return nil, err
}
2025-05-13 18:13:22 +08:00
allRunningServers := make(internal.ServerInfoList, 0, len(localConfServers))
for _, localServer := range localConfServers {
serverInfo := localServer.Po.(*model.Server)
for _, remoteServer := range remoteRunningServers {
if serverInfo.ServerConfID == remoteServer.ServerId {
remoteServer.ProjectId = serverInfo.ProjectId
allRunningServers = append(allRunningServers, remoteServer)
break
}
}
2025-05-09 18:28:15 +08:00
}
2025-05-13 18:13:22 +08:00
return allRunningServers, nil
2025-04-24 20:39:31 +08:00
}