audit_flow_helper.dart 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. /// - 有审核流 + 自动提交([skipOnAutoSubmit]=false)→ 直接调 [onShSubmit]
  10. /// - 有审核流 + 自动提交([skipOnAutoSubmit]=true)→ 直接 return(ERP 已处理)
  11. /// - 有审核流 + 不自动提交 → 弹窗询问,用户确认后调 [onShSubmit]
  12. /// - getBillAuditConfig 出错 → 直接 return
  13. class AuditFlowHelper {
  14. AuditFlowHelper._();
  15. /// [getConfig] 调用 getBillAuditConfig,[onShSubmit] 调用 SHSubmit。
  16. /// 调用方需确保 [context] 来自当前 mounted 的 widget。
  17. /// [skipOnAutoSubmit] 为 true 时,自动提交场景不调 shSubmit(AE/BX 等 ERP 侧已处理的单据)。
  18. static Future<void> handle({
  19. required BuildContext context,
  20. required AppLocalizations l10n,
  21. required Future<Map<String, dynamic>> Function() getConfig,
  22. required Future<void> Function() onShSubmit,
  23. bool skipOnAutoSubmit = false,
  24. }) async {
  25. final colors = Theme.of(context).extension<AppColorsExtension>()!;
  26. try {
  27. final config = await getConfig();
  28. final hasFlow = config['hasAuditFlow'] == true;
  29. final autoSubmit = config['autoSubmit'] == true;
  30. if (!hasFlow) return;
  31. if (autoSubmit) {
  32. if (!skipOnAutoSubmit) await onShSubmit();
  33. return;
  34. }
  35. // ignore: use_build_context_synchronously
  36. final shouldSubmit = await _showDialog(colors, context, l10n);
  37. if (shouldSubmit == true) {
  38. await onShSubmit();
  39. }
  40. } catch (_) {
  41. // getBillAuditConfig 或 SHSubmit 失败均不阻塞流程
  42. }
  43. }
  44. static Future<bool?> _showDialog(
  45. AppColorsExtension colors,
  46. BuildContext context,
  47. AppLocalizations l10n,
  48. ) {
  49. return showDialog<bool>(
  50. context: context,
  51. builder: (ctx) => TDAlertDialog(
  52. title: l10n.get('submit'),
  53. content: l10n.get('auditFlowPrompt'),
  54. buttonStyle: TDDialogButtonStyle.text,
  55. leftBtn: TDDialogButtonOptions(
  56. title: l10n.get('skipAudit'),
  57. titleColor: colors.textSecondary,
  58. action: () => Navigator.pop(ctx, false),
  59. ),
  60. rightBtn: TDDialogButtonOptions(
  61. title: l10n.get('submitToAudit'),
  62. titleColor: colors.primary,
  63. action: () => Navigator.pop(ctx, true),
  64. ),
  65. ),
  66. );
  67. }
  68. }