diff --git a/actions/changes.go b/actions/changes.go new file mode 100644 index 0000000..bcdcf54 --- /dev/null +++ b/actions/changes.go @@ -0,0 +1,24 @@ +package actions + +import ( + "zzman/model" + + "gorm.io/gorm" +) + +func RecordChange(tx *gorm.DB, changes []model.Change) error { + if len(changes) == 0 { + return nil + } + + batchSize := 1000 + for i := 0; i < len(changes); i += batchSize { + end := min(i+batchSize, len(changes)) + batch := changes[i:end] + err := tx.Create(&batch).Error + if err != nil { + return err + } + } + return nil +} diff --git a/actions/edges.go b/actions/edges.go index a3016e7..937d9a9 100644 --- a/actions/edges.go +++ b/actions/edges.go @@ -42,6 +42,7 @@ func SaveEdges(tx *gorm.DB, edges []model.Edge) error { Columns: []clause.Column{{Name: "macaddr"}}, UpdateAll: true, }).Create(&batch).Error + if err != nil { return fmt.Errorf("failed to save edges batch %d-%d: %w", i, end-1, err) } diff --git a/actions/sync.go b/actions/sync.go index 351cb46..8f62b0b 100644 --- a/actions/sync.go +++ b/actions/sync.go @@ -25,7 +25,7 @@ func Sync() (err error) { // 获取所有城市的节点数据 for i, city := range cities { - slog.Info(fmt.Sprintf("正在同步城市,城市:%s,哈希:%s", city.Name, city.Hash)) + slog.Debug(fmt.Sprintf("正在同步城市,城市:%s,哈希:%s", city.Name, city.Hash)) // 新节点信息 resp, err := jd.EdgeDevice(jd.EdgeDeviceReq{ @@ -37,7 +37,7 @@ func Sync() (err error) { return fmt.Errorf("获取城市 %s:%s 的边缘设备失败: %w", city.Name, city.Hash, err) } var newEdges = resp.Edges - slog.Info(fmt.Sprintf("获取节点数据完成,城市:%s,节点数:%d", city.Name, len(newEdges))) + slog.Debug(fmt.Sprintf("获取节点数据完成,城市:%s,节点数:%d", city.Name, len(newEdges))) err = model.DB.Transaction(func(tx *gorm.DB) error { // 旧节点信息 diff --git a/actions/update.go b/actions/update.go index be804cb..7c28771 100644 --- a/actions/update.go +++ b/actions/update.go @@ -4,6 +4,7 @@ import ( "fmt" "log/slog" "strconv" + "time" "zzman/clients/jd" "zzman/model" u "zzman/util" @@ -29,6 +30,8 @@ func Update(args ...UpdateArgs) error { } func update(tx *gorm.DB, arg UpdateArgs) error { + var now = time.Now() + gateways, err := FindGateways(tx) if err != nil { return fmt.Errorf("获取所有网关失败:%w", err) @@ -110,6 +113,7 @@ func update(tx *gorm.DB, arg UpdateArgs) error { // 更新网关配置 var configs2Create []model.Config var configs2Update []model.ConfigUpdate + var changes []model.Change for iGateway, gateway := range gateways2Update { @@ -125,6 +129,13 @@ func update(tx *gorm.DB, arg UpdateArgs) error { IsChange: u.P(0), }) + changes = append(changes, model.Change{ + Time: now, + Gateway: gateway.Macaddr, + OldEdge: oldConfig.Macaddr, + NewEdge: newConfig.Macaddr, + }) + newConfigs[gateway][iCity] = ConfigInfo{ Type: 1, // 更新 Item: jd.EdgeInfo{ @@ -146,6 +157,13 @@ func update(tx *gorm.DB, arg UpdateArgs) error { InnerIp: fmt.Sprintf("172.16.%d.%d", gateway.Id, iCity+2), }) + changes = append(changes, model.Change{ + Time: now, + Gateway: gateway.Macaddr, + OldEdge: "", + NewEdge: newConfig.Macaddr, + }) + newConfigs[gateway][iCity] = ConfigInfo{ Type: 2, // 新增 Item: jd.EdgeInfo{ @@ -168,6 +186,10 @@ func update(tx *gorm.DB, arg UpdateArgs) error { if err != nil { return fmt.Errorf("更新城市 %s 的偏移量失败:%w", city.Name, err) } + err = RecordChange(tx, changes) + if err != nil { + return fmt.Errorf("记录变更失败:%w", err) + } } // 提交所有网关配置到云端 diff --git a/model/change.go b/model/change.go new file mode 100644 index 0000000..7b94c6b --- /dev/null +++ b/model/change.go @@ -0,0 +1,17 @@ +package model + +import "time" + +type Change struct { + Id int `gorm:"column:id;primaryKey"` + Time time.Time `gorm:"column:time"` + Gateway string `gorm:"column:macaddr"` + OldEdge string `gorm:"column:edge_old"` + NewEdge string `gorm:"column:edge_new"` + Network string `gorm:"column:network"` + Info string `gorm:"column:info"` +} + +func (Change) TableName() string { + return "change" +}