audit_flow_helper.dart 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. final shouldSubmit = await _showDialog(colors, context, l10n);
  33. if (shouldSubmit == true) {
  34. await onShSubmit();
  35. }
  36. } catch (_) {
  37. // getBillAuditConfig 或 SHSubmit 失败均不阻塞流程
  38. }
  39. }
  40. static Future<bool?> _showDialog(
  41. AppColorsExtension colors,
  42. BuildContext context,
  43. AppLocalizations l10n,
  44. ) {
  45. return showDialog<bool>(
  46. context: context,
  47. builder: (ctx) => TDAlertDialog(
  48. title: l10n.get('submit'),
  49. content: l10n.get('auditFlowPrompt'),
  50. buttonStyle: TDDialogButtonStyle.text,
  51. leftBtn: TDDialogButtonOptions(
  52. title: l10n.get('skipAudit'),
  53. titleColor: colors.textSecondary,
  54. action: () => Navigator.pop(ctx, false),
  55. ),
  56. rightBtn: TDDialogButtonOptions(
  57. title: l10n.get('submitToAudit'),
  58. titleColor: colors.primary,
  59. action: () => Navigator.pop(ctx, true),
  60. ),
  61. ),
  62. );
  63. }
  64. }