feat: выбор сотрудника из полной кадровой базы (Employee/FullBase)
PeoplePicker находит только тех, у кого есть учётка M365, — рабочих на объектах в нём нет. Пикер ищет по части Ф.И.О. в Employee/FullBase, показывает только работающих, а совместителя — строкой на каждое место работы, чтобы сразу выбрать нужную компанию. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
import { AadHttpClient, HttpClientResponse } from '@microsoft/sp-http';
|
||||
import { WebPartContext } from '@microsoft/sp-webpart-base';
|
||||
import { APPROVAL_API_CLIENT_ID, DICTIONARY_API_BASE_URL } from '../config';
|
||||
import { IEmployeeFullBaseRecord } from './models/IEmployeeFullBaseRecord';
|
||||
|
||||
// null из API → '' (см. IEmployeeFullBaseRecord).
|
||||
function textOrEmpty(value: unknown): string {
|
||||
return typeof value === 'string' ? value.trim() : '';
|
||||
}
|
||||
|
||||
function toRecord(r: Record<string, unknown>): IEmployeeFullBaseRecord {
|
||||
return {
|
||||
id: textOrEmpty(r.id),
|
||||
fio: textOrEmpty(r.fio),
|
||||
iin: textOrEmpty(r.iin),
|
||||
code: textOrEmpty(r.code),
|
||||
company: textOrEmpty(r.company),
|
||||
// Должности в базе бывают с хвостовым пробелом («Монтажник ») — textOrEmpty его срезает.
|
||||
position: textOrEmpty(r.position),
|
||||
department: textOrEmpty(r.department),
|
||||
// В API опечатка «admision» — переименовываем на входе, дальше по коду правильное имя.
|
||||
admissionDate: textOrEmpty(r.admisionDate),
|
||||
dismissalDate: textOrEmpty(r.dismissalDate),
|
||||
email: textOrEmpty(r.email)
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* GET /Employee/FullBase?Fio=... — работающие сотрудники по части Ф.И.О.
|
||||
*
|
||||
* Без фильтра эндпоинт отдаёт всю базу (тысячи записей, с уволенными), поэтому
|
||||
* ищем на сервере по мере ввода, как PositionPicker — и ничего не кешируем.
|
||||
*
|
||||
* Уволенных отсекаем по dismissalDate на клиенте. Параметр Status у эндпоинта
|
||||
* есть, но его значения не задокументированы — ДОПУЩЕНИЕ, проверить и, если он
|
||||
* фильтрует работающих, перейти на него.
|
||||
*/
|
||||
export async function searchActiveEmployees(
|
||||
context: WebPartContext,
|
||||
fio: string,
|
||||
maxResults: number
|
||||
): Promise<IEmployeeFullBaseRecord[]> {
|
||||
const query = fio.trim();
|
||||
if (!query) return [];
|
||||
|
||||
const client = await context.aadHttpClientFactory.getClient(APPROVAL_API_CLIENT_ID);
|
||||
const response: HttpClientResponse = await client.get(
|
||||
`${DICTIONARY_API_BASE_URL}/Employee/FullBase?Fio=${encodeURIComponent(query)}`,
|
||||
AadHttpClient.configurations.v1
|
||||
);
|
||||
if (response.status === 404) return [];
|
||||
if (!response.ok) {
|
||||
throw new Error(`Employee/FullBase: ${response.status} ${response.statusText}`);
|
||||
}
|
||||
const body = (await response.json()) as Array<Record<string, unknown>>;
|
||||
return body
|
||||
.map(toRecord)
|
||||
.filter((r) => !r.dismissalDate)
|
||||
.slice(0, maxResults);
|
||||
}
|
||||
Reference in New Issue
Block a user