feat: migrated 1c form

This commit is contained in:
Тимур Городецкий
2026-08-11 10:39:04 +05:00
parent dcf3f06121
commit a8e54f2b35
24 changed files with 1185 additions and 6 deletions
@@ -1,7 +1,7 @@
import { AadHttpClient, HttpClientResponse } from '@microsoft/sp-http';
import { WebPartContext } from '@microsoft/sp-webpart-base';
import { APPROVAL_API_CLIENT_ID, APPROVAL_API_BASE_URL } from '../config';
import { ApprovalStatus, IApiResponse, IRequestType, IResolvedRoute } from './models/IApprovalRouteApi';
import { ApprovalStatus, IApiResponse, IRequestType, IResolvedRoute, IResolveFieldValue } from './models/IApprovalRouteApi';
// Все обращения к внешнему approval-route API — только здесь.
// Клиент авторизуется через AadHttpClient (SSO по текущему пользователю).
@@ -30,12 +30,18 @@ export async function getRequestTypes(context: WebPartContext): Promise<IRequest
// 'Approval' — согласующие (кто одобряет),
// 'Execution' — исполнители (кто выполняет после согласования).
// Один и тот же маршрут, разные наборы шагов.
//
// fieldValues — условие видимости шагов (см. IResolveFieldValue): для форм с
// шагами, зависящими от значения колонки списка (напр. WorkType), передать
// текущее значение поля здесь. Формы без условных шагов его не передают —
// бэкенд получает пустой массив, как раньше.
export async function resolveRoute(
context: WebPartContext,
requestTypeId: number,
userEmail: string,
status: ApprovalStatus = 'Approval',
departmentId: string | null = null
departmentId: string | null = null,
fieldValues: IResolveFieldValue[] = []
): Promise<IResolvedRoute> {
const c = await client(context);
const url = `${APPROVAL_API_BASE_URL}/api/template-routes/resolve`;
@@ -51,7 +57,7 @@ export async function resolveRoute(
userEmail,
projectId: null,
status,
fieldValues: [],
fieldValues,
departmentId: departmentId || null
})
});
@@ -2,7 +2,7 @@ import { WebPartContext } from '@microsoft/sp-webpart-base';
import { resolveRoute } from './approvalRoute.service';
import { ApprovalListService, IApproverToWrite } from './approvalList.service';
import { IMatrixRow } from './models/IMatrixRow';
import { ApprovalStatus } from './models/IApprovalRouteApi';
import { ApprovalStatus, IResolveFieldValue } from './models/IApprovalRouteApi';
import { APPROVAL_PHASE, REQUEST_STATUS } from './models/statuses';
// Планируемый маршрут для НОВОЙ заявки: resolve по email инициатора → строки матрицы.
@@ -15,10 +15,11 @@ export async function getPlannedMatrix(
userEmail: string,
approval: ApprovalListService,
status: ApprovalStatus = 'Approval',
departmentId?: string | null
departmentId?: string | null,
fieldValues?: IResolveFieldValue[]
): Promise<IMatrixRow[]> {
if (!userEmail) return [];
const route = await resolveRoute(context, requestTypeId, userEmail, status, departmentId);
const route = await resolveRoute(context, requestTypeId, userEmail, status, departmentId, fieldValues);
const phase = status === 'Execution' ? APPROVAL_PHASE.execution : APPROVAL_PHASE.approval;
const ordered = route.steps.slice().sort((a, b) => a.orderNo - b.orderNo);
return Promise.all(
@@ -16,6 +16,7 @@ export type {
IRequestType,
IResolvedRoute,
IResolvedRouteStep,
IResolveFieldValue,
} from './models/IApprovalRouteApi';
export { getRequestTypes, resolveRoute } from './approvalRoute.service';
@@ -20,6 +20,16 @@ export interface IApiResponse<T> {
data: T;
}
// Условие видимости шага маршрута (настраивается в админке маршрутов —
// «Показывать шаг только при выполнении условия», сравнение «Поле списка»/
// «Оператор»/«Значение»). fieldName — внутреннее имя колонки списка (напр.
// "WorkType"), value — фактическое значение из формы (напр. "Создание
// пользователя в 1С"), с которым бэкенд сравнивает эту колонку.
export interface IResolveFieldValue {
fieldName: string;
value: string;
}
// GET /api/template-routes/resolve → data
export interface IResolvedRoute {
routeId: number;