Столкнулся с проблемой того, что при редактировании оргструктуры в сценариях методы
addChild() и moveToParent() не работали. Точнее сказать await System.organisationStructure.save(tree) вроде бы и выполнялся без ошибок, но по факту изменения не сохранялись.
Проблема была в том что изменения объекта OrganisationStructureItem несвязанного с переменной tree, в которую вы загрузили оргструктуру, а потом будете её сохранять, не влечёт измение этого дерева. О чём речь:
Код:
const tree = await System.organisationStructure.fetchTree();
const parent = await System.organisationStructure.search().where(f => f.__id.eq("parent_uid")).first();
const org_item = await System.organisationStructure.search().where(f => f.__id.eq("uid")).first();
org_item!.moveToParent(parent!);
const errors = await System.organisationStructure.save(tree);
Несмотря на то, что и parent и org_item существуют в текущей оргструктуре, изменения не сохранятся.
Анологично если мы передаём OrganisationStructureItem в функцию для постройки дерева.
Код:
const tree = await System.organisationStructure.fetchTree();
const parent = await System.organisationStructure.search().where(f => f.__id.eq("parent_uid")).first();
const childs = parent!.getChildren();
for (let child of childs) {
CreateChilds(child);
}
const errors = await System.organisationStructure.save(tree);
function CreateChilds(parent: OrganisationStructureItem): void {
const child = System.organisationStructure.createItem("Department", OrganisationStructureItemType.Department)
parent.addChild(child);
}
Несмотря на то что мы получили дочерние элменты методом getChildren(), этот код не будет работать как мы ожидаем.
Правильный способ получения ссылки на элмент оргструктуры это искать его в самом дереве tree
Код:
const tree = await System.organisationStructure.fetchTree();
const org_item = tree.find("Department name");
Поиск по названию вернёт первый попавшийся элемент, поэтому лучше искать другим способом, через корень дерева.
Код:
const tree = await System.organisationStructure.fetchTree();
const root = tree.getRoot();
const item = root.find(i => i.data.name === 'Менеджеры' && i.data.type === OrganisationStructureItemType.Group);
А в функцию можно передать id элемента и найти внутри неё элемент тем же способом по id.
Код:
const tree = await System.organisationStructure.fetchTree();
const root = tree.getRoot();
const childs = root!.getChildren();
for (let child of childs) {
CreateChilds(child.id);
}
const errors = await System.organisationStructure.save(tree);
function CreateChilds(parent_id: string): void {
const parent = root.find(i=>i.id == parent_id);
const child = System.organisationStructure.createItem("Department", OrganisationStructureItemType.Department);
parent!.addChild(child);
const childs = parent!.getChildren();
}