Иногда для решения определенных задач необходимо получить оргструктуру целиком.
Примером такой необходимости могут быть построение отчетов или распределение задач.
Код:
declare const console: any;
// Структура финального JSON
type Json_org = {
name:string,
department: string,
group: string,
position: string,
employee: any,
id:any,
_children:Json_org[]
}
// Объект для наполнения
let arr_json_org: Json_org [] = [];
// Рекурсия, собираем данные по каждому элементу орг.стр
async function rec (str: any, arr_jorg: Json_org []): Promise<void> {
for(let for_arr_jorg of arr_jorg){
for(let i = 0; i < str.length; i++){
if(str[i] != null){
if(str[i]["parent"] == for_arr_jorg["id"]){
let str_id = str[i]["__id"];
let new_record = {} as Json_org;
if(str[i]["type"] == "DEPARTMENT"){
new_record.department = "Отдел";
new_record.id = str[i]["__id"];
new_record.name = str[i]["name"];
new_record._children = [];
for_arr_jorg._children.push(new_record);
}
if(str[i]["type"] == "GROUP"){
new_record.group = "Группа";
new_record.id = str[i]["__id"];
new_record.name = str[i]["name"];
new_record._children = [];
for_arr_jorg._children.push(new_record);
}
if(str[i]["type"] == "POSITION"){
new_record.position = "Должность";
// Ищем сотрудника назначенного на должность.
//const deps = await System.organisationStructure.search().where((i,g) => g.and(i.__id.eq(str_id), i.__deletedAt.eq(null))).all();
//const position = await System.users.search().where((f,g) => g.and(f.osIds.has(deps[0]), f.__deletedAt.eq(null))).first();
new_record.id = str[i]["__id"];
new_record.name = str[i]["name"];
new_record._children = [];
for_arr_jorg._children.push(new_record);
}
//Необязательно.
delete str[i]
}
}
}
if(for_arr_jorg._children.length > 0 && for_arr_jorg._children != undefined){
await rec(str,for_arr_jorg._children);
}
}
}
// Получаем данные для передачи в рекурсивную функцию.
async function test (): Promise<void> {
const res = await fetch('https://URL.elma365.ru/api/query/system/orgstruct/items?size=10000&active=true', {
method: 'GET'
});
const product = await res.json();
for(let for_product of product["result"]){
if(!for_product["parent"]){
let new_record = {} as Json_org;
if(for_product["type"] == "DEPARTMENT"){
new_record.department = "Отдел";
}else if(for_product["type"] == "GROUP"){
new_record.group = "Группа";
}else if(for_product["type"] == "POSITION"){
new_record.position = "Должность";
}
new_record.id = for_product["__id"];
new_record.name = for_product["name"];
new_record._children = [];
arr_json_org.push(new_record);
}
}
await rec(product["result"], arr_json_org);
console.log(JSON.stringify(arr_json_org));
}
Скрипт тестировался на стороне клиента