import 'package:flutter/material.dart'; import 'package:tdesign_flutter/tdesign_flutter.dart'; import '../../core/i18n/app_localizations.dart'; import '../../core/theme/app_colors_extension.dart'; import '../widgets/loading_dialog.dart'; /// 审核流处理工具。 /// /// BillSave 成功后调用,根据 [getBillAuditConfig] 返回值决定: /// - 无审核流 → 直接 return /// - 有审核流 + 自动提交([skipOnAutoSubmit]=false)→ 直接调 [onShSubmit] /// - 有审核流 + 自动提交([skipOnAutoSubmit]=true)→ 直接 return(ERP 已处理) /// - 有审核流 + 不自动提交 → 弹窗询问,用户确认后调 [onShSubmit] /// - getBillAuditConfig 出错 → 直接 return class AuditFlowHelper { AuditFlowHelper._(); /// [getConfig] 调用 getBillAuditConfig,[onShSubmit] 调用 SHSubmit。 /// 调用方需确保 [context] 来自当前 mounted 的 widget。 /// [skipOnAutoSubmit] 为 true 时,自动提交场景不调 shSubmit(AE/BX 等 ERP 侧已处理的单据)。 static Future handle({ required BuildContext context, required AppLocalizations l10n, required Future> Function() getConfig, required Future Function() onShSubmit, bool skipOnAutoSubmit = false, }) async { final colors = Theme.of(context).extension()!; try { final config = await getConfig(); final hasFlow = config['hasAuditFlow'] == true; final autoSubmit = config['autoSubmit'] == true; if (!hasFlow) return; if (autoSubmit) { if (!skipOnAutoSubmit) { // ignore: use_build_context_synchronously await _runWithLoading(context, l10n, onShSubmit); } return; } // ignore: use_build_context_synchronously final shouldSubmit = await _showDialog(colors, context, l10n); if (shouldSubmit == true) { // ignore: use_build_context_synchronously await _runWithLoading(context, l10n, onShSubmit); } } catch (_) { // getBillAuditConfig 或 SHSubmit 失败均不阻塞流程 } } /// SHSubmit 执行期间显示 loading,成功失败均自动隐藏。 static Future _runWithLoading( BuildContext context, AppLocalizations l10n, Future Function() onShSubmit, ) async { // ignore: use_build_context_synchronously LoadingDialog.show(context, text: l10n.get('submitting')); try { await onShSubmit(); } finally { // ignore: use_build_context_synchronously LoadingDialog.hide(context); } } static Future _showDialog( AppColorsExtension colors, BuildContext context, AppLocalizations l10n, ) { return showDialog( context: context, builder: (ctx) => TDAlertDialog( title: l10n.get('submit'), content: l10n.get('auditFlowPrompt'), buttonStyle: TDDialogButtonStyle.text, leftBtn: TDDialogButtonOptions( title: l10n.get('skipAudit'), titleColor: colors.textSecondary, action: () => Navigator.pop(ctx, false), ), rightBtn: TDDialogButtonOptions( title: l10n.get('submitToAudit'), titleColor: colors.primary, action: () => Navigator.pop(ctx, true), ), ), ); } }