| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- 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';
- /// 审核流处理工具。
- ///
- /// 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<void> handle({
- required BuildContext context,
- required AppLocalizations l10n,
- required Future<Map<String, dynamic>> Function() getConfig,
- required Future<void> Function() onShSubmit,
- bool skipOnAutoSubmit = false,
- }) async {
- final colors = Theme.of(context).extension<AppColorsExtension>()!;
- try {
- final config = await getConfig();
- final hasFlow = config['hasAuditFlow'] == true;
- final autoSubmit = config['autoSubmit'] == true;
- if (!hasFlow) return;
- if (autoSubmit) {
- if (!skipOnAutoSubmit) await onShSubmit();
- return;
- }
- // ignore: use_build_context_synchronously
- final shouldSubmit = await _showDialog(colors, context, l10n);
- if (shouldSubmit == true) {
- await onShSubmit();
- }
- } catch (_) {
- // getBillAuditConfig 或 SHSubmit 失败均不阻塞流程
- }
- }
- static Future<bool?> _showDialog(
- AppColorsExtension colors,
- BuildContext context,
- AppLocalizations l10n,
- ) {
- return showDialog<bool>(
- 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),
- ),
- ),
- );
- }
- }
|