audit_flow_helper.dart 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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. import '../widgets/loading_dialog.dart';
  6. /// 审核流处理工具。
  7. ///
  8. /// BillSave 成功后调用,根据 [getBillAuditConfig] 返回值决定:
  9. /// - 无审核流 → 直接 return
  10. /// - 有审核流 + 自动提交([skipOnAutoSubmit]=false)→ 直接调 [onShSubmit]
  11. /// - 有审核流 + 自动提交([skipOnAutoSubmit]=true)→ 直接 return(ERP 已处理)
  12. /// - 有审核流 + 不自动提交 → 弹窗询问,用户确认后调 [onShSubmit]
  13. /// - getBillAuditConfig 出错 → 直接 return
  14. class AuditFlowHelper {
  15. AuditFlowHelper._();
  16. /// [getConfig] 调用 getBillAuditConfig,[onShSubmit] 调用 SHSubmit。
  17. /// 调用方需确保 [context] 来自当前 mounted 的 widget。
  18. /// [skipOnAutoSubmit] 为 true 时,自动提交场景不调 shSubmit(AE/BX 等 ERP 侧已处理的单据)。
  19. static Future<void> handle({
  20. required BuildContext context,
  21. required AppLocalizations l10n,
  22. required Future<Map<String, dynamic>> Function() getConfig,
  23. required Future<void> Function() onShSubmit,
  24. bool skipOnAutoSubmit = false,
  25. }) async {
  26. final colors = Theme.of(context).extension<AppColorsExtension>()!;
  27. try {
  28. final config = await getConfig();
  29. final hasFlow = config['hasAuditFlow'] == true;
  30. final autoSubmit = config['autoSubmit'] == true;
  31. if (!hasFlow) return;
  32. if (autoSubmit) {
  33. if (!skipOnAutoSubmit) {
  34. // ignore: use_build_context_synchronously
  35. await _runWithLoading(context, l10n, onShSubmit);
  36. }
  37. return;
  38. }
  39. // ignore: use_build_context_synchronously
  40. final shouldSubmit = await _showDialog(colors, context, l10n);
  41. if (shouldSubmit == true) {
  42. // ignore: use_build_context_synchronously
  43. await _runWithLoading(context, l10n, onShSubmit);
  44. }
  45. } catch (_) {
  46. // getBillAuditConfig 或 SHSubmit 失败均不阻塞流程
  47. }
  48. }
  49. /// SHSubmit 执行期间显示 loading,成功失败均自动隐藏。
  50. static Future<void> _runWithLoading(
  51. BuildContext context,
  52. AppLocalizations l10n,
  53. Future<void> Function() onShSubmit,
  54. ) async {
  55. // ignore: use_build_context_synchronously
  56. LoadingDialog.show(context, text: l10n.get('submitting'));
  57. try {
  58. await onShSubmit();
  59. } finally {
  60. // ignore: use_build_context_synchronously
  61. LoadingDialog.hide(context);
  62. }
  63. }
  64. static Future<bool?> _showDialog(
  65. AppColorsExtension colors,
  66. BuildContext context,
  67. AppLocalizations l10n,
  68. ) {
  69. return showDialog<bool>(
  70. context: context,
  71. builder: (ctx) => TDAlertDialog(
  72. title: l10n.get('submit'),
  73. content: l10n.get('auditFlowPrompt'),
  74. buttonStyle: TDDialogButtonStyle.text,
  75. leftBtn: TDDialogButtonOptions(
  76. title: l10n.get('skipAudit'),
  77. titleColor: colors.textSecondary,
  78. action: () => Navigator.pop(ctx, false),
  79. ),
  80. rightBtn: TDDialogButtonOptions(
  81. title: l10n.get('submitToAudit'),
  82. titleColor: colors.primary,
  83. action: () => Navigator.pop(ctx, true),
  84. ),
  85. ),
  86. );
  87. }
  88. }