diff --git a/TOOLS/resource-generator/internal/params/params.go b/TOOLS/resource-generator/internal/params/params.go index 5461d49..4f3d65a 100644 --- a/TOOLS/resource-generator/internal/params/params.go +++ b/TOOLS/resource-generator/internal/params/params.go @@ -16,6 +16,7 @@ import ( ) // Merge объединяет несколько наборов параметров, убирая дубликаты по Code. +// При совпадении Code SubParams объединяются union'ом (новые поля из modify добавляются к create). func Merge(sets ...[]types.Param) []types.Param { seen := map[string]types.Param{} for _, s := range sets { @@ -24,8 +25,13 @@ func Merge(sets ...[]types.Param) []types.Param { if key == "" { continue } - if _, ok := seen[key]; !ok { + if existing, ok := seen[key]; !ok { seen[key] = p + } else if p.HasSubParams && len(p.SubParams) > 0 { + merged := unionSubParams(existing.SubParams, p.SubParams) + existing.SubParams = merged + existing.HasSubParams = len(merged) > 0 + seen[key] = existing } } } @@ -37,6 +43,22 @@ func Merge(sets ...[]types.Param) []types.Param { return out } +// unionSubParams добавляет sub-params из extra, которых ещё нет в base (сравнение по Code). +func unionSubParams(base, extra []types.Param) []types.Param { + inBase := make(map[string]struct{}, len(base)) + for _, p := range base { + inBase[strings.ToLower(strings.TrimSpace(p.Code))] = struct{}{} + } + out := append([]types.Param(nil), base...) + for _, p := range extra { + if _, seen := inBase[strings.ToLower(strings.TrimSpace(p.Code))]; !seen { + out = append(out, p) + } + } + sort.Slice(out, func(i, j int) bool { return out[i].Code < out[j].Code }) + return out +} + // AlignParamTypes выравнивает типы параметров по схеме. func AlignParamTypes(params []types.Param, schema []types.Param) []types.Param { if len(params) == 0 || len(schema) == 0 {