package controllers import ( "context" "fwh-toolbox-server/database" taskqueue "fwh-toolbox-server/taskQueue" "fwh-toolbox-server/types" "time" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo/options" ) type SiteAnalysisInfo = types.SiteAnalysisInfo type SiteAnalysisOptions = types.SiteAnalysisOptions type SiteAnalysisConfig = types.SiteAnalysisConfig type SiteAnalysisConfigWrite = types.SiteAnalysisConfigWrite // 从数据库获取站点分析列表 func GetSiteAnalysisManageList(page, size uint, sn, progress *string) (*ResPage[SiteAnalysisInfo], error) { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() collection := database.GetCollection("SiteAnalysisConfig") filter := bson.M{} // 条件 if sn != nil { filter["sn"] = *sn } if progress != nil { filter["progress"] = *progress } findOptions := options.Find(). SetProjection(bson.M{ "_id": 1, "sn": 1, "description": 1, "item": 1, "progress": 1, }). SetSkip(int64((page - 1) * size)). SetLimit(int64(size)) cursor, err := collection.Find(ctx, filter, findOptions) if err != nil { return nil, err } defer cursor.Close(ctx) var configList []SiteAnalysisInfo for cursor.Next(ctx) { var cfg SiteAnalysisInfo if err := cursor.Decode(&cfg); err != nil { return nil, err } configList = append(configList, cfg) } // 查询总数 total, err := collection.CountDocuments(ctx, filter) if err != nil { return nil, err } res := ResPage[SiteAnalysisInfo]{ Data: configList, PageSize: size, PageNum: page, Total: uint(total), } return &res, nil } // 从数据库获取一条站点分析配置 func GetSiteAnalysisConfig(id primitive.ObjectID) (*SitesMonitorConfig, error) { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() collection := database.GetCollection("SiteMonitorConfig") var cfg SitesMonitorConfig err := collection.FindOne(ctx, bson.M{"_id": id}).Decode(&cfg) if err != nil { return nil, err } return &cfg, nil } // 插入一条站点分析配置到数据库 func InsertSiteAnalysisConfig(writeConfig SiteAnalysisConfigWrite) error { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() config := SiteAnalysisConfig{ SiteAnalysisConfigWrite: writeConfig, Item: []string{}, Progress: "pending", } // 生成Item标签 if writeConfig.EnableTimeline { config.Item = append(config.Item, "时间线") } collection := database.GetCollection("SiteMonitorConfig") res, err := collection.InsertOne(ctx, config) if err != nil { return err } taskqueue.EnqueueSiteAnalysisTask(taskqueue.TaskSiteAnalysis{ Id: res.InsertedID.(primitive.ObjectID), Sn: writeConfig.Sn, TimePeriod: writeConfig.TimePeriod, SiteAnalysisOptions: SiteAnalysisOptions{ EnableTimeline: writeConfig.EnableTimeline, }, }) return nil } // 更新一条站点分析配置到数据库 func UpdateSiteAnalysisConfig(id primitive.ObjectID, writeConfig SiteAnalysisConfigWrite) error { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() config := SiteAnalysisConfig{ SiteAnalysisConfigWrite: writeConfig, Item: []string{}, Progress: "pending", } // 生成Item标签 if writeConfig.EnableTimeline { config.Item = append(config.Item, "时间线") } collection := database.GetCollection("SiteMonitorConfig") // _, err := collection.InsertOne(ctx, config) filter := bson.M{"_id": id} // 按ID匹配 update := bson.M{ "$set": config, // 如果存在就更新所有字段 } opts := options.Update().SetUpsert(true) _, err := collection.UpdateOne(ctx, filter, update, opts) if err != nil { return err } taskqueue.EnqueueSiteAnalysisTask(taskqueue.TaskSiteAnalysis{ Id: writeConfig.Id, Sn: writeConfig.Sn, TimePeriod: writeConfig.TimePeriod, SiteAnalysisOptions: SiteAnalysisOptions{ EnableTimeline: writeConfig.EnableTimeline, }, }) return nil } // 删除一条站点分析配置 func DeleteSiteAnalysisConfig(id primitive.ObjectID) error { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() filter := bson.M{"_id": id} // 删除条件 collection := database.GetCollection("SiteMonitorConfig") _, err := collection.DeleteOne(ctx, filter) if err != nil { return err } // TODO 需删除相关数据 return nil }