добавлен комментарий

This commit is contained in:
gorbenko.pavel
2026-08-10 17:52:25 +05:00
parent 926a514821
commit 7ef0ee6245
6 changed files with 86 additions and 49 deletions
@@ -801,22 +801,29 @@ async function approvalListFor(
// Сколько строк маршрута максимум забираем за раз при дочитывании комментариев:
// на странице ≤20 заявок, у каждой обычно единицы шагов — запас многократный.
const RETURN_COMMENT_ROW_LIMIT = 2000;
const DECISION_COMMENT_ROW_LIMIT = 2000;
/**
* Проставляет returnComment — комментарий согласующего, вернувшего заявку на
* доработку. Причина возврата хранится в СТРОКЕ МАРШРУТА (колонка Comment
* списка «— согласование»), а не в самой заявке, поэтому её нельзя получить
* тем же запросом, что и список: нужен отдельный проход по спискам согласования.
* Проставляет decisionComment — комментарий согласующего к его решению по
* заявке: причину возврата на доработку либо отклонения (что именно искать,
* задаёт decisionStatus). Комментарий хранится в СТРОКЕ МАРШРУТА (колонка
* Comment списка «— согласование»), а не в самой заявке, поэтому его нельзя
* получить тем же запросом, что и список: нужен отдельный проход по спискам
* согласования.
*
* Одного статуса достаточно, чтобы найти нужную строку, и для «своих
* возвращённых» (вернул кто-то другой), и для «отклонённых мной»: и возврат, и
* отклонение останавливают маршрут, поэтому такая строка по заявке одна.
*
* Вызывается ТОЛЬКО там, где причина показывается (см. RequestsTableView) —
* счётчику в меню, например, она не нужна, и лишние запросы ему ни к чему.
* Мутирует переданные строки — как и hydrateAuthors рядом.
*/
export async function hydrateReturnComments(
export async function hydrateDecisionComments(
context: WebPartContext,
types: IRequestType[],
rows: IMyRequest[]
rows: IMyRequest[],
decisionStatus: string
): Promise<void> {
if (rows.length === 0) return;
@@ -844,27 +851,28 @@ export async function hydrateReturnComments(
const stepRows = (await approvalList.items
.filter(typeRows.map((r) => `TicketId eq ${r.id}`).join(' or '))
.select('TicketId', 'ApprovalStatus', 'Comment')
.top(RETURN_COMMENT_ROW_LIMIT)()) as Array<Record<string, unknown>>;
.top(DECISION_COMMENT_ROW_LIMIT)()) as Array<Record<string, unknown>>;
const commentByTicket = new Map<number, string>();
stepRows.forEach((r) => {
if (r.ApprovalStatus !== REQUEST_STATUS.returned) return;
if (r.ApprovalStatus !== decisionStatus) return;
const ticketId = r.TicketId as number | undefined;
const comment = ((r.Comment as string) || '').trim();
// Возврат по заявке один (при переотправке маршрут переписывается
// целиком, см. writeRoute) — но если строк вдруг несколько, берём
// первую непустую, а не последнюю пустую.
// Такая строка по заявке одна (и возврат, и отклонение останавливают
// маршрут, а при переотправке он переписывается целиком — см.
// writeRoute), но если их вдруг несколько, берём первую НЕПУСТУЮ,
// а не последнюю пустую.
if (ticketId && comment && !commentByTicket.has(ticketId)) {
commentByTicket.set(ticketId, comment);
}
});
typeRows.forEach((r) => {
r.returnComment = commentByTicket.get(r.id);
r.decisionComment = commentByTicket.get(r.id);
});
} catch (e) {
console.error(
`[Текущие заявки] «${type.name}»: не удалось прочитать причину возврата:`,
`[Текущие заявки] «${type.name}»: не удалось прочитать комментарий к решению:`,
(e as Error).message
);
}