diff --git a/internal/service/config_assets.go b/internal/service/config_assets.go index 8e12c2f..a26df11 100644 --- a/internal/service/config_assets.go +++ b/internal/service/config_assets.go @@ -1226,19 +1226,22 @@ func (s *ConfigPreviewService) SaveDeviceAssignment(asset DeviceAssignmentAsset) return fmt.Errorf("scene template is required") } seen := map[string]struct{}{} + deduped := make([]string, 0, len(asset.RecognitionUnits)) for _, ref := range asset.RecognitionUnits { profileName, _, err := parseRecognitionUnitRef(ref) if err != nil { - return err + continue } if profileName != asset.ProfileName { - return fmt.Errorf("all recognition units must belong to scene template %q", asset.ProfileName) + continue } if _, ok := seen[ref]; ok { - return fmt.Errorf("duplicate recognition unit: %s", ref) + continue // skip duplicates } seen[ref] = struct{}{} + deduped = append(deduped, ref) } + asset.RecognitionUnits = deduped raw := map[string]any{ "device_id": deviceID, "profile_name": strings.TrimSpace(asset.ProfileName), diff --git a/safesightd-linux-arm64 b/safesightd-linux-arm64 index 021ee9b..66cc270 100644 Binary files a/safesightd-linux-arm64 and b/safesightd-linux-arm64 differ diff --git a/scripts/deploy/reset-assignments.py b/scripts/deploy/reset-assignments.py new file mode 100644 index 0000000..5d467db --- /dev/null +++ b/scripts/deploy/reset-assignments.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python3 +import sqlite3 +c = sqlite3.connect('/opt/safesightd/data/app.db') +c.execute('DELETE FROM device_assignments') +c.execute('DELETE FROM recognition_units') +c.execute('DELETE FROM device_config_state') +c.commit() +c.close() +print('已清理旧分配数据,请重新下发')