feat: маршрут заявки в 1С учитывает базу 1С

Новая матрица маршрута #8 назначает согласующих по выбранной базе
(ЗУП, АТП, ATS), а форма передавала в approval-route только вид работ
и отдел — такие шаги никогда не срабатывали. Теперь DB1C уходит в
fieldValues одной строкой через пробел (мультивыбор, value у API
только строка), и маршрут пересчитывается при смене набора баз.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Тимур Городецкий
2026-10-13 09:36:48 +05:00
parent 96f53da020
commit a6f4218e7e
2 changed files with 19 additions and 13 deletions
@@ -12,11 +12,13 @@
Если для вида работ согласование не требуется — заявка сразу «Выполнение». Если для вида работ согласование не требуется — заявка сразу «Выполнение».
Работу отдел 1С ведёт в карточке Microsoft Planner (см. «Особое поведение»). Работу отдел 1С ведёт в карточке Microsoft Planner (см. «Особое поведение»).
- Особенности: маршрут условный — набор шагов зависит от полей **«Виды работ»** - Особенности: маршрут условный — набор шагов зависит от полей **«Виды работ»**
(`WorkType`) и **«Отдел»** (`Department`, свободный текст из профиля AAD, см. (`WorkType`), **«База 1С»** (`DB1C`) и **«Отдел»** (`Department`, свободный текст
«Особое поведение»), которые передаются в `resolveRoute`/`getPlannedMatrix` через из профиля AAD, см. «Особое поведение»), которые передаются в
параметр `fieldValues: [{ fieldName: 'WorkType', value: data.WorkType }, `resolveRoute`/`getPlannedMatrix` через параметр `fieldValues` (см.
{ fieldName: 'Department', value: data.Department }]` (см. `IResolveFieldValue` в `IResolveFieldValue` в `shared/approval/models/IApprovalRouteApi.ts`). «База 1С» —
`shared/approval/models/IApprovalRouteApi.ts`). В админке маршрутов условие по мультивыбор, а `value` у API только строка, поэтому все выбранные базы уходят
одной записью через пробел; условия по ней в админке — только «содержит»
(напр. «База 1С содержит ЗУП»). В админке маршрутов условие по
отделу настроено оператором «содержит» (напр. «Department содержит Бухгалтерия»), отделу настроено оператором «содержит» (напр. «Department содержит Бухгалтерия»),
поэтому важно фактическое значение поля, а не Id из справочника — отдельного поэтому важно фактическое значение поля, а не Id из справочника — отдельного
DepartmentId у этой формы нет. Для части видов работ маршрут пуст — согласование DepartmentId у этой формы нет. Для части видов работ маршрут пуст — согласование
@@ -168,20 +168,24 @@ const Ticket1CForm: React.FC<IRequestFormProps> = ({
const requestTypeIdState = useRequestTypeId(context, requestType.id); const requestTypeIdState = useRequestTypeId(context, requestType.id);
const requestTypeId = requestTypeIdState.id; const requestTypeId = requestTypeIdState.id;
// Маршрут полностью и однозначно определяется видом работ и отделом — настроен // Маршрут полностью и однозначно определяется видом работ, базой 1С и отделом —
// в админке маршрутов (условные шаги по WorkType и Department, см. fieldValues), // настроен в админке маршрутов (условные шаги по WorkType, DB1C и Department,
// а не выбирается заявителем. Поэтому матрица здесь ВСЕГДА нередактируема // см. fieldValues), а не выбирается заявителем. Поэтому матрица здесь ВСЕГДА
// (editable=false) — заявитель только видит, кто согласует, без возможности // нередактируема (editable=false) — заявитель только видит, кто согласует, без
// добавить/убрать/переставить согласующего. // возможности добавить/убрать/переставить согласующего.
// Условия шагов (и согласования, и исполнения) — по виду работ и отделу. // Базы 1С — мультивыбор, а approval-route принимает value только строкой:
// передаём все выбранные базы одной записью через пробел (как CompaniesJson в
// RecruitingHire), условия в админке — «База 1С содержит ЗУП/АТП/ATS».
const databasesFieldValue = data.DB1C.slice().sort().join(' ');
const fieldValues = useMemo( const fieldValues = useMemo(
() => [ () => [
{ fieldName: 'WorkType', value: data.WorkType }, { fieldName: 'WorkType', value: data.WorkType },
{ fieldName: 'DB1C', value: databasesFieldValue },
{ fieldName: 'Department', value: data.Department } { fieldName: 'Department', value: data.Department }
], ],
[data.WorkType, data.Department] [data.WorkType, databasesFieldValue, data.Department]
); );
const matrixKey = `${userEmail}-${editId ?? 'new'}-${data.WorkType}-${data.Department}`; const matrixKey = `${userEmail}-${editId ?? 'new'}-${data.WorkType}-${databasesFieldValue}-${data.Department}`;
const matrixReady = const matrixReady =
isOpenedRouteReady(editId, requestStatus, requestTypeId) && (!!editId || (!!data.WorkType && !!requestTypeId)); isOpenedRouteReady(editId, requestStatus, requestTypeId) && (!!editId || (!!data.WorkType && !!requestTypeId));
const loadMatrix = useCallback( const loadMatrix = useCallback(