package smdl import ( "admin/apps/game/domain/entity" "admin/apps/game/domain/projects/smdl/internal" "admin/apps/game/domain/repo" "admin/apps/game/model" "admin/internal/consts" "admin/internal/errcode" dto2 "admin/internal/model/dto" "admin/lib/xlog" "fmt" "strings" ) type ServerHook struct { } 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) { alisrvAddr := projectInfo.GetApiAddr() if alisrvAddr == "" { return 0, nil, nil, errcode.New(errcode.ServerError, "项目%v没有配置api服务器地址", projectInfo.Po.Name) } serverInfoList, err := internal.GetRemoteServerInfoList(alisrvAddr) if err != nil { return 0, nil, nil, err } for _, row := range rows { var findRemoteServerInfo *internal.ServerInfo for _, curRunning := range serverInfoList { et := (&entity.CommonResource{}).FromPo(&model.Server{}).FromDto(row) if et.ToPo().(*model.Server).ServerConfID == curRunning.ServerId { // 运行中,给描述信息添加运行信息 findRemoteServerInfo = curRunning break } } if findRemoteServerInfo != nil { row["RunningStatus"] = "运行中" row["Ccu"] = findRemoteServerInfo.Ccu row["TotalRoleCount"] = findRemoteServerInfo.TotalRoleCount row["TotalAccountCount"] = findRemoteServerInfo.TotalAccountCount if findRemoteServerInfo.IsServerDown { row["IsServerDown"] = "是" } else { row["IsServerDown"] = "否" } } else { row["RunningStatus"] = "未知" row["Ccu"] = 0 row["TotalRoleCount"] = 0 row["TotalAccountCount"] = 0 row["IsWhitelistLogin"] = "否" } } return totalCount, fields, rows, nil } func (hook *ServerHook) RowsSelection(projectInfo *entity.Project, resource string, btnKey string, dtoObjs []dto2.CommonDtoValues) (*dto2.CommonRowsSelectionRsp, error) { msg := "" serverIds := make([]string, 0, len(dtoObjs)) apiAddr := projectInfo.GetApiAddr() allRunningServers, err := getAllRunningServers(projectInfo) if err != nil { return nil, err } opServers := make([]string, 0) opHandler := func(serverRunningInfo *internal.ServerInfo) error { opServers = append(opServers, serverRunningInfo.ServerId) 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) } } return &dto2.CommonRowsSelectionRsp{ Msg: fmt.Sprintf("执行%v操作成功!", msg), NeedRefresh: true, ShortDesc: "[" + strings.Join(opServers, ",") + "]", }, nil } // 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) } remoteRunningServers, err := internal.GetRemoteServerInfoList(alisrvAddr) if err != nil { return nil, err } localConfServers, err := repo.ServerRepoInstance.List(projectEt.Po.ID) if err != nil { return nil, err } 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 } } } return allRunningServers, nil }