fix: черновик без маршрута планирует маршрут заново при открытии

У части черновиков не оказалось строк маршрута, и форма показывала пустую
матрицу: отправить такую заявку было некому. Теперь при открытии
черновика без строк маршрут планируется заново (loadRoutePhase), во всех
формах; поданные заявки по-прежнему читают записанные строки. Почему
строки пропали у первоначального случая — пока не выяснено.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Тимур Городецкий
2026-10-09 12:18:15 +05:00
parent b64ec76998
commit bbef3062f4
18 changed files with 247 additions and 176 deletions
@@ -22,6 +22,8 @@ import {
StatusBadge,
useMatrixEditor,
getPlannedMatrix,
loadRoutePhase,
isOpenedRouteReady,
resolveWriteListId,
notifyActiveStep,
useRequestTypeId,
@@ -29,7 +31,6 @@ import {
isEditableStatus,
IApproverToWrite,
unassignedStepMessage,
APPROVAL_PHASE,
executorsToWrite
} from '../../shared/approval';
import {
@@ -181,15 +182,14 @@ const Ticket1CForm: React.FC<IRequestFormProps> = ({
[data.WorkType, data.Department]
);
const matrixKey = `${userEmail}-${editId ?? 'new'}-${data.WorkType}-${data.Department}`;
const matrixReady = !!editId || (!!data.WorkType && !!requestTypeId);
const matrixReady =
isOpenedRouteReady(editId, requestStatus, requestTypeId) && (!!editId || (!!data.WorkType && !!requestTypeId));
const loadMatrix = useCallback(
() =>
editId
? approval
.getMatrixForRequest(editId)
.then((rows) => rows.filter((r) => r.phase !== APPROVAL_PHASE.execution))
: getPlannedMatrix(context, requestTypeId as number, userEmail, approval, 'Approval', null, fieldValues),
[context, userEmail, approval, editId, fieldValues, requestTypeId]
loadRoutePhase(approval, editId, requestStatus, 'Approval', () =>
getPlannedMatrix(context, requestTypeId as number, userEmail, approval, 'Approval', null, fieldValues)
),
[context, userEmail, approval, editId, requestStatus, fieldValues, requestTypeId]
);
const matrix = useMatrixEditor(loadMatrix, matrixKey, false, matrixReady, (login) => approval.getJobTitle(login));
@@ -197,12 +197,10 @@ const Ticket1CForm: React.FC<IRequestFormProps> = ({
// в карточке Planner, в портале отмечает «Выполнено» (см. plannerHandoff.ts).
const loadExecutors = useCallback(
() =>
editId
? approval
.getMatrixForRequest(editId)
.then((rows) => rows.filter((r) => r.phase === APPROVAL_PHASE.execution))
: getPlannedMatrix(context, requestTypeId as number, userEmail, approval, 'Execution', null, fieldValues),
[context, userEmail, approval, editId, fieldValues, requestTypeId]
loadRoutePhase(approval, editId, requestStatus, 'Execution', () =>
getPlannedMatrix(context, requestTypeId as number, userEmail, approval, 'Execution', null, fieldValues)
),
[context, userEmail, approval, editId, requestStatus, fieldValues, requestTypeId]
);
const executors = useMatrixEditor(loadExecutors, matrixKey, false, matrixReady, (login) => approval.getJobTitle(login));
// Должность нового «Руководителя» — approval-route её не знает (резолвил шаг