Код:
async function showReverseFromApps2(): Promise<void> {
Context.data.data_by_element = undefined
Context.data.show_app_loader = true
if (!Context.data.apps_and_fields){
await getApps2()
}
try {
// Получаем пользователя
const element = await getElement();
if (!element) {
console.error("element not found");
Context.data.show_app_loader = false
Context.data.data_by_element = undefined
return;
}
const reversedResult: ReversedResultItem[] = [];
// Обрабатываем все приложения
for (const app of Context.data.apps_and_fields) {
await processAppFields(app, element, reversedResult);
}
const element_table: ElementTable = {id: Context.data.old_element_id!, app_list: reversedResult }
Context.data.data_by_element = element_table //reversedResult;
console.log(Context.data.data_by_element);
} catch (error) {
console.error("Error in showReverseFromApps:", error);
}
//Скрываем загрузчик и контейнер
// container.style.display = "none"
Context.data.show_app_loader = false
// Вспомогательные функции
async function getElement() {
//@ts-ignore
return await Imports![Context.data.search_ns_code!]!.app[Context.data.search_app_code!].search()
.where((emp: { __id: { eq: (arg0: any) => any } }) => emp.__id.eq(Context.data.old_element_id!))
.first();
}
async function processAppFields(app: any, element: any, reversedResult: ReversedResultItem[]) {
for (const field of app.fields) {
try {
if (field.type === "TABLE" && !field.view?.name?.startsWith('old')) {
await processTableField(app, field, element, reversedResult);
} else
{
await processRegularField(app, field, element, reversedResult);
}
} catch (error) {
console.error(`Error processing field ${field.code} in app ${app.app_code}:`, error);
}
}
}
async function processTableField(app: any, field: any, element: any, reversedResult: ReversedResultItem[]) {
const tableColumns = field.data.fields.map((column: any) => ({
column_name: column.name,
column_code: column.code,
single: column.single ? true : false
}));
const employeeColumns = field.data.fields.filter((col: any) =>
col.data?.code === Context.data.search_app_code!
);
if (employeeColumns.length === 0) return;
//@ts-ignore
const appSearch = Imports![Context.data.ns_code!]!.app[app.app_code].search().where((elem, g) => g.and(
elem.__deletedAt.eq(null),
//@ts-ignore
elem[field.code].neq(null)
))
//@ts-ignore
let elements = await getAllElements(appSearch) //Используем именно этот вариант, поскольку далее идёт фильтрация
for (const column of employeeColumns) {
const filteredElements = elements.filter((elem: any) =>
elem.data[field.code]?.some((row: any) =>
column.single
? row[column.code]?.id === element.id
: row[column.code]?.some((emp: any) => emp.id === element.id)
));
addElementsToResult(filteredElements, app.app_code, app.app_name, field, tableColumns, reversedResult);
}
}
async function processRegularField(app: any, field: any, element: any, reversedResult: ReversedResultItem[]) {
//@ts-ignore
const appSearch = Imports![Context.data.ns_code!]!.app[app.app_code].search().where((elem, g) => g.and(
elem.__deletedAt.eq(null),
//@ts-ignore
field.single
? elem[field.code].link(element)
: elem[field.code].has(element),
))
//@ts-ignore
let elements = await getAllElements(appSearch) //Используем именно этот вариант, поскольку далее идёт фильтрация
addElementsToResult(elements, app.app_code, app.app_name, field, undefined, reversedResult);
}
function addElementsToResult(
elements: any[],
appCode: string,
appName: string,
field: any,
tableColumns: TableColumn[] | undefined,
reversedResult: ReversedResultItem[]
) {
for (const element of elements) {
let existingElement = reversedResult.find(el => el.id === element.id);
if (!existingElement) {
existingElement = {
id: element.id,
name: element.data.__name,
element: element,
app_code: appCode,
app_name: appName,
fields: []
};
reversedResult.push(existingElement);
}
if (!existingElement.fields.some(f =>
f.field_code === field.code && f.field_type === field.type
))
{
existingElement.fields.push({
single: field.single,
field_name: field.view.name,
field_code: field.code,
field_type: field.type,
...(tableColumns && { table_columns: tableColumns })
});
}
}
}
async function getAllElements(appSearch: any ): Promise<any> {
let numberOfFilteredElements = await appSearch.count();
let rangeElements = {
from: 0,
to: numberOfFilteredElements,
*[Symbol.iterator]() {
for (let value = this.from; value <= this.to;) {
yield appSearch.from(value).size(5000).all();
value = value + 5000;
}
}
}
const itemsPromises = [...rangeElements];
const result = await Promise.all(itemsPromises);
const revenueCache = result.reduce((acc: [], val: []) => acc.concat(val), []);
return revenueCache
}
}