audit_flow_helper.dart 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import 'package:flutter/material.dart';
  2. import 'package:tdesign_flutter/tdesign_flutter.dart';
  3. import '../../core/i18n/app_localizations.dart';
  4. import '../../core/theme/app_colors_extension.dart';
  5. /// 审核流处理工具。
  6. ///
  7. /// BillSave 成功后调用,根据 [getBillAuditConfig] 返回值决定:
  8. /// - 无审核流 → 直接 return
  9. /// - 有审核流 + 自动提交 → 直接调 [onShSubmit]
  10. /// - 有审核流 + 不自动提交 → 弹窗询问,用户确认后调 [onShSubmit]
  11. /// - getBillAuditConfig 出错 → 直接 return
  12. class AuditFlowHelper {
  13. AuditFlowHelper._();
  14. /// [getConfig] 调用 getBillAuditConfig,[onShSubmit] 调用 SHSubmit。
  15. /// 调用方需确保 [context] 来自当前 mounted 的 widget。
  16. static Future<void> handle({
  17. required BuildContext context,
  18. required AppLocalizations l10n,
  19. required Future<Map<String, dynamic>> Function() getConfig,
  20. required Future<void> Function() onShSubmit,
  21. }) async {
  22. final colors = Theme.of(context).extension<AppColorsExtension>()!;
  23. try {
  24. final config = await getConfig();
  25. final hasFlow = config['hasAuditFlow'] == true;
  26. final autoSubmit = config['autoSubmit'] == true;
  27. if (!hasFlow) return;
  28. if (autoSubmit) {
  29. await onShSubmit();
  30. return;
  31. }
  32. // ignore: use_build_context_synchronously
  33. final shouldSubmit = await _showDialog(colors, context, l10n);
  34. if (shouldSubmit == true) {
  35. await onShSubmit();
  36. }
  37. } catch (_) {
  38. // getBillAuditConfig 或 SHSubmit 失败均不阻塞流程
  39. }
  40. }
  41. static Future<bool?> _showDialog(
  42. AppColorsExtension colors,
  43. BuildContext context,
  44. AppLocalizations l10n,
  45. ) {
  46. return showDialog<bool>(
  47. context: context,
  48. builder: (ctx) => TDAlertDialog(
  49. title: l10n.get('submit'),
  50. content: l10n.get('auditFlowPrompt'),
  51. buttonStyle: TDDialogButtonStyle.text,
  52. leftBtn: TDDialogButtonOptions(
  53. title: l10n.get('skipAudit'),
  54. titleColor: colors.textSecondary,
  55. action: () => Navigator.pop(ctx, false),
  56. ),
  57. rightBtn: TDDialogButtonOptions(
  58. title: l10n.get('submitToAudit'),
  59. titleColor: colors.primary,
  60. action: () => Navigator.pop(ctx, true),
  61. ),
  62. ),
  63. );
  64. }
  65. }