fix(ct): статус СТ до оповещения и без ложной плашки Teams
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -67,7 +67,6 @@ export const Step4Approval: React.FC<Props> = (props) => {
|
|||||||
)}
|
)}
|
||||||
{a.ct?.status === "on_approval" && <Alert variant="info">СТ находится на согласовании.</Alert>}
|
{a.ct?.status === "on_approval" && <Alert variant="info">СТ находится на согласовании.</Alert>}
|
||||||
|
|
||||||
{a.notifyWarning && <Alert variant="warn">{a.notifyWarning}</Alert>}
|
|
||||||
|
|
||||||
{/* Approval chain */}
|
{/* Approval chain */}
|
||||||
<section className={styles.section}>
|
<section className={styles.section}>
|
||||||
|
|||||||
@@ -49,7 +49,6 @@ export function useStep4Approval(args: UseStep4ApprovalArgs) {
|
|||||||
const [actionDialog, setActionDialog] = useState<ActionDialogState | null>(null);
|
const [actionDialog, setActionDialog] = useState<ActionDialogState | null>(null);
|
||||||
const [isSubmitting, setIsSubmitting] = useState(false);
|
const [isSubmitting, setIsSubmitting] = useState(false);
|
||||||
const [submitError, setSubmitError] = useState<string | null>(null);
|
const [submitError, setSubmitError] = useState<string | null>(null);
|
||||||
const [notifyWarning, setNotifyWarning] = useState<string | null>(null);
|
|
||||||
const [isSendingToIncore, setIsSendingToIncore] = useState(false);
|
const [isSendingToIncore, setIsSendingToIncore] = useState(false);
|
||||||
const [incoreStep, setIncoreStep] = useState<IncoreStep | null>(null);
|
const [incoreStep, setIncoreStep] = useState<IncoreStep | null>(null);
|
||||||
const [incoreError, setIncoreError] = useState<string | null>(null);
|
const [incoreError, setIncoreError] = useState<string | null>(null);
|
||||||
@@ -236,8 +235,9 @@ export function useStep4Approval(args: UseStep4ApprovalArgs) {
|
|||||||
try {
|
try {
|
||||||
await service.triggerApprovalNotification(spId);
|
await service.triggerApprovalNotification(spId);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
// Оповещение — best-effort: поток может ответить с таймаутом (504), хотя сообщение
|
||||||
|
// уже ушло. Не пугаем пользователя ложной плашкой, только логируем для отладки.
|
||||||
console.error('[Step4] triggerApprovalNotification failed for spId', spId, e);
|
console.error('[Step4] triggerApprovalNotification failed for spId', spId, e);
|
||||||
setNotifyWarning('Голос записан, но уведомление в Teams не удалось отправить. Проверьте Power Automate.');
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -250,6 +250,18 @@ export function useStep4Approval(args: UseStep4ApprovalArgs) {
|
|||||||
setChain(updatedChain);
|
setChain(updatedChain);
|
||||||
onSave({ approvalChain: 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) {
|
if (currentMember?.spApprovalId) {
|
||||||
await notify(currentMember.spApprovalId);
|
await notify(currentMember.spApprovalId);
|
||||||
}
|
}
|
||||||
@@ -259,12 +271,7 @@ export function useStep4Approval(args: UseStep4ApprovalArgs) {
|
|||||||
await notify(nextPending.spApprovalId);
|
await notify(nextPending.spApprovalId);
|
||||||
}
|
}
|
||||||
|
|
||||||
const allApproved = updatedChain.every(
|
|
||||||
(m) => m.status === 'approved' || m.status === 'skipped' || m.status === 'recommends',
|
|
||||||
);
|
|
||||||
if (allApproved) {
|
if (allApproved) {
|
||||||
await service.updateCTStatus(ct!.id, 'approved');
|
|
||||||
onSave({ ct: { ...ct!, status: 'approved' } });
|
|
||||||
onStepComplete(4);
|
onStepComplete(4);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -321,8 +328,8 @@ export function useStep4Approval(args: UseStep4ApprovalArgs) {
|
|||||||
try {
|
try {
|
||||||
await service.triggerApprovalNotification(firstApprover.spApprovalId);
|
await service.triggerApprovalNotification(firstApprover.spApprovalId);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
// best-effort (см. notify выше) — ложную плашку не показываем.
|
||||||
console.error('[Step4] triggerApprovalNotification (send) failed for spId', firstApprover.spApprovalId, e);
|
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,
|
ct,
|
||||||
chain,
|
chain,
|
||||||
submitError,
|
submitError,
|
||||||
notifyWarning,
|
|
||||||
dismissNotifyWarning: () => setNotifyWarning(null),
|
|
||||||
isSubmitting,
|
isSubmitting,
|
||||||
isSendingToIncore,
|
isSendingToIncore,
|
||||||
incoreStep,
|
incoreStep,
|
||||||
|
|||||||
Reference in New Issue
Block a user