package servicemanagement import ( "context" "fmt" "git.x2erp.com/qdy/go-base/ctx" "git.x2erp.com/qdy/go-base/logger" "git.x2erp.com/qdy/go-base/model/response" "git.x2erp.com/qdy/go-base/util" "git.x2erp.com/qdy/go-db/factory/database" ) // ServiceInfo 微服务信息 type ServiceInfo struct { ServiceName string `json:"service_name"` ConfigCount int `json:"config_count"` Creator string `json:"creator,omitempty"` CreatedAt string `json:"created_at,omitempty"` } // GetServices 获取微服务列表 func GetServices(ctx context.Context, dbFactory *database.DBFactory, reqCtx *ctx.RequestContext) *response.QueryResult[[]ServiceInfo] { logger.Debug("GetServices-开始获取微服务列表") // 获取数据库连接 db := dbFactory.GetDB() // 查询distinct service_name及其相关信息 query := ` SELECT service_name, COUNT(*) as config_count, MIN(creator) as creator, MIN(created_at) as created_at FROM config_startup_svc GROUP BY service_name ORDER BY service_name ` rows, err := db.QueryxContext(ctx, query) if err != nil { logger.ErrorC(reqCtx, fmt.Sprintf("查询微服务列表失败: %v", err)) return util.CreateErrorResult[[]ServiceInfo](fmt.Sprintf("查询微服务列表失败: %v", err), reqCtx) } defer rows.Close() var services []ServiceInfo for rows.Next() { var service ServiceInfo var creator, createdAt interface{} err := rows.Scan(&service.ServiceName, &service.ConfigCount, &creator, &createdAt) if err != nil { logger.ErrorC(reqCtx, fmt.Sprintf("扫描微服务数据失败: %v", err)) continue } // 处理可能为nil的字段 if creator != nil { service.Creator = fmt.Sprintf("%v", creator) } if createdAt != nil { service.CreatedAt = fmt.Sprintf("%v", createdAt) } services = append(services, service) } if err := rows.Err(); err != nil { logger.ErrorC(reqCtx, fmt.Sprintf("遍历微服务数据失败: %v", err)) return util.CreateErrorResult[[]ServiceInfo](fmt.Sprintf("遍历微服务数据失败: %v", err), reqCtx) } logger.Debug(fmt.Sprintf("获取到 %d 个微服务", len(services))) return util.CreateSuccessResultData[[]ServiceInfo](services, reqCtx) }