From cc44f779756f2ab096258989b3da187b6fe8afce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A2=D0=B8=D0=BC=D1=83=D1=80=20=D0=93=D0=BE=D1=80=D0=BE?= =?UTF-8?q?=D0=B4=D0=B5=D1=86=D0=BA=D0=B8=D0=B9?= Date: Thu, 3 Sep 2026 14:26:38 +0500 Subject: [PATCH] =?UTF-8?q?fix(ct):=20=D1=81=D1=82=D0=B0=D1=82=D1=83=D1=81?= =?UTF-8?q?=20=D0=A1=D0=A2=20=D0=B4=D0=BE=20=D0=BE=D0=BF=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D1=89=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B8=20=D0=B1=D0=B5=D0=B7=20?= =?UTF-8?q?=D0=BB=D0=BE=D0=B6=D0=BD=D0=BE=D0=B9=20=D0=BF=D0=BB=D0=B0=D1=88?= =?UTF-8?q?=D0=BA=D0=B8=20Teams?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 (1M context) --- .../Step4Approval/Step4Approval.tsx | 1 - .../Step4Approval/useStep4Approval.ts | 25 +++++++++++-------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/webparts/ctFormsPortal/forms/ct/components/Step4Approval/Step4Approval.tsx b/src/webparts/ctFormsPortal/forms/ct/components/Step4Approval/Step4Approval.tsx index 925d031..18784d8 100644 --- a/src/webparts/ctFormsPortal/forms/ct/components/Step4Approval/Step4Approval.tsx +++ b/src/webparts/ctFormsPortal/forms/ct/components/Step4Approval/Step4Approval.tsx @@ -67,7 +67,6 @@ export const Step4Approval: React.FC = (props) => { )} {a.ct?.status === "on_approval" && СТ находится на согласовании.} - {a.notifyWarning && {a.notifyWarning}} {/* Approval chain */}
diff --git a/src/webparts/ctFormsPortal/forms/ct/components/Step4Approval/useStep4Approval.ts b/src/webparts/ctFormsPortal/forms/ct/components/Step4Approval/useStep4Approval.ts index 1714f0f..7cb8806 100644 --- a/src/webparts/ctFormsPortal/forms/ct/components/Step4Approval/useStep4Approval.ts +++ b/src/webparts/ctFormsPortal/forms/ct/components/Step4Approval/useStep4Approval.ts @@ -49,7 +49,6 @@ export function useStep4Approval(args: UseStep4ApprovalArgs) { const [actionDialog, setActionDialog] = useState(null); const [isSubmitting, setIsSubmitting] = useState(false); const [submitError, setSubmitError] = useState(null); - const [notifyWarning, setNotifyWarning] = useState(null); const [isSendingToIncore, setIsSendingToIncore] = useState(false); const [incoreStep, setIncoreStep] = useState(null); const [incoreError, setIncoreError] = useState(null); @@ -236,8 +235,9 @@ export function useStep4Approval(args: UseStep4ApprovalArgs) { try { await service.triggerApprovalNotification(spId); } catch (e) { + // Оповещение — best-effort: поток может ответить с таймаутом (504), хотя сообщение + // уже ушло. Не пугаем пользователя ложной плашкой, только логируем для отладки. console.error('[Step4] triggerApprovalNotification failed for spId', spId, e); - setNotifyWarning('Голос записан, но уведомление в Teams не удалось отправить. Проверьте Power Automate.'); } }; @@ -250,6 +250,18 @@ export function useStep4Approval(args: UseStep4ApprovalArgs) { setChain(updatedChain); onSave({ approvalChain: updatedChain }); + const allApproved = updatedChain.every( + (m) => m.status === 'approved' || m.status === 'skipped' || m.status === 'recommends', + ); + + // Финальное согласование: сначала переводим СТ в «Согласовано», и только ПОТОМ + // шлём оповещение. Иначе поток прочитает статус ещё «На согласовании» и отправит + // не то письмо. Порядок как в ветке отклонения (сначала статус, затем notify). + if (allApproved) { + await service.updateCTStatus(ct!.id, 'approved'); + onSave({ ct: { ...ct!, status: 'approved' } }); + } + if (currentMember?.spApprovalId) { await notify(currentMember.spApprovalId); } @@ -259,12 +271,7 @@ export function useStep4Approval(args: UseStep4ApprovalArgs) { await notify(nextPending.spApprovalId); } - const allApproved = updatedChain.every( - (m) => m.status === 'approved' || m.status === 'skipped' || m.status === 'recommends', - ); if (allApproved) { - await service.updateCTStatus(ct!.id, 'approved'); - onSave({ ct: { ...ct!, status: 'approved' } }); onStepComplete(4); } } else { @@ -321,8 +328,8 @@ export function useStep4Approval(args: UseStep4ApprovalArgs) { try { await service.triggerApprovalNotification(firstApprover.spApprovalId); } catch (e) { + // best-effort (см. notify выше) — ложную плашку не показываем. console.error('[Step4] triggerApprovalNotification (send) failed for spId', firstApprover.spApprovalId, e); - setNotifyWarning('СТ отправлена на согласование, но уведомление в Teams не удалось отправить. Проверьте Power Automate.'); } } @@ -432,8 +439,6 @@ export function useStep4Approval(args: UseStep4ApprovalArgs) { ct, chain, submitError, - notifyWarning, - dismissNotifyWarning: () => setNotifyWarning(null), isSubmitting, isSendingToIncore, incoreStep,