добавлен комментарий
This commit is contained in:
@@ -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
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user