chengc 1 неделя назад
Родитель
Сommit
479bb0e5f1

+ 13 - 0
lib/core/navigation/host_app_channel.dart

@@ -113,6 +113,19 @@ class HostAppChannel {
     }
     }
   }
   }
 
 
+  /// 跳转原生审核过程页面
+  static Future<void> showAuditTrail(String billId, String billNo, {int bilItm = 0}) async {
+    try {
+      await _channel.invokeMethod('showShState', {
+        'billId': billId,
+        'billNo': billNo,
+        'bilItm': bilItm,
+      });
+    } catch (_) {
+      // 原生端未实现时静默忽略
+    }
+  }
+
   /// 重新从宿主 App 拉取配置(用于用户切换 / 登录完成后刷新)。
   /// 重新从宿主 App 拉取配置(用于用户切换 / 登录完成后刷新)。
   static Future<void> refresh() async {
   static Future<void> refresh() async {
     try {
     try {

+ 2 - 4
lib/features/expense/expense_detail_page.dart

@@ -10,7 +10,7 @@ import '../../shared/widgets/form_field_row.dart';
 import '../../shared/widgets/app_skeletons.dart';
 import '../../shared/widgets/app_skeletons.dart';
 import '../../shared/widgets/attachment_download_helper.dart';
 import '../../shared/widgets/attachment_download_helper.dart';
 import '../../shared/widgets/action_bar.dart';
 import '../../shared/widgets/action_bar.dart';
-import '../../shared/widgets/audit_trail_dialog.dart';
+import '../../core/navigation/host_app_channel.dart';
 import 'expense_model.dart';
 import 'expense_model.dart';
 import '../../core/i18n/app_localizations.dart';
 import '../../core/i18n/app_localizations.dart';
 import '../../shared/models/bill_attachment.dart';
 import '../../shared/models/bill_attachment.dart';
@@ -260,9 +260,7 @@ class _ExpenseDetailPageState extends ConsumerState<ExpenseDetailPage> {
   }
   }
 
 
   Future<void> _showAuditTrail(String billId) async {
   Future<void> _showAuditTrail(String billId) async {
-    final api = ref.read(expenseApiProvider);
-    final billNo = widget.billNo;
-    await AuditTrailDialog.show(context, fetcher: () => api.getAuditTrail(billId, billNo));
+    await HostAppChannel.showAuditTrail(billId, widget.billNo);
   }
   }
 
 
   // ═══ 基本信息 ═══
   // ═══ 基本信息 ═══

+ 3 - 3
lib/features/expense/expense_model.dart

@@ -98,15 +98,15 @@ class ExpenseModel {
           json['applicantName'] as String? ?? json['usrNo'] as String? ?? '',
           json['applicantName'] as String? ?? json['usrNo'] as String? ?? '',
       deptId: json['dept'] as String? ?? '',
       deptId: json['dept'] as String? ?? '',
       deptName: json['deptName'] as String? ?? json['dept'] as String? ?? '',
       deptName: json['deptName'] as String? ?? json['dept'] as String? ?? '',
-      currencyCode: json['curId'] as String? ?? '',
+      currencyCode: (json['curId'] as String?) ?? (json['currencyCode'] as String?) ?? '',
       isGenerateVoucher: (json['vohId'] as String?) == 'T' || json['isGenerateVoucher'] == true,
       isGenerateVoucher: (json['vohId'] as String?) == 'T' || json['isGenerateVoucher'] == true,
       voucherNo: json['vohNo'] as String? ?? '',
       voucherNo: json['vohNo'] as String? ?? '',
       approvedAmount: (json['approvedAmount'] as num?)?.toDouble() ?? 0.0,
       approvedAmount: (json['approvedAmount'] as num?)?.toDouble() ?? 0.0,
       totalAmount: (json['totalAmount'] as num?)?.toDouble() ?? 0.0,
       totalAmount: (json['totalAmount'] as num?)?.toDouble() ?? 0.0,
       totalAmtnSh: (json['totalAmtnSh'] as num?)?.toDouble() ?? 0.0,
       totalAmtnSh: (json['totalAmtnSh'] as num?)?.toDouble() ?? 0.0,
       purpose: json['reason'] as String? ?? json['purpose'] as String? ?? '',
       purpose: json['reason'] as String? ?? json['purpose'] as String? ?? '',
-      remark: json['rem'] as String? ?? '',
-      paymentMethod: json['payId'] as String? ?? '',
+      remark: (json['rem'] as String?) ?? (json['remark'] as String?) ?? '',
+      paymentMethod: (json['payId'] as String?) ?? (json['paymentMethod'] as String?) ?? '',
       isInvoiceVerified: json['isInvoiceVerified'] as bool? ?? false,
       isInvoiceVerified: json['isInvoiceVerified'] as bool? ?? false,
       isTaxIdMatched: json['isTaxIdMatched'] as bool? ?? false,
       isTaxIdMatched: json['isTaxIdMatched'] as bool? ?? false,
       isCategoryCompliant: json['isCategoryCompliant'] as bool? ?? false,
       isCategoryCompliant: json['isCategoryCompliant'] as bool? ?? false,

+ 2 - 4
lib/features/expense_apply/expense_apply_detail_page.dart

@@ -15,7 +15,7 @@ import '../../shared/widgets/app_skeletons.dart';
 import '../../shared/models/bill_file_rights.dart';
 import '../../shared/models/bill_file_rights.dart';
 import '../../shared/widgets/attachment_download_helper.dart';
 import '../../shared/widgets/attachment_download_helper.dart';
 import '../../shared/widgets/action_bar.dart';
 import '../../shared/widgets/action_bar.dart';
-import '../../shared/widgets/audit_trail_dialog.dart';
+import '../../core/navigation/host_app_channel.dart';
 import 'expense_apply_model.dart';
 import 'expense_apply_model.dart';
 import 'widgets/expense_apply_detail_view_dialog.dart';
 import 'widgets/expense_apply_detail_view_dialog.dart';
 import '../../core/i18n/app_localizations.dart';
 import '../../core/i18n/app_localizations.dart';
@@ -281,9 +281,7 @@ class _ExpenseApplyDetailPageState
   }
   }
 
 
   Future<void> _showAuditTrail(String billId) async {
   Future<void> _showAuditTrail(String billId) async {
-    final api = ref.read(expenseApplyApiProvider);
-    final billNo = widget.billNo;
-    await AuditTrailDialog.show(context, fetcher: () => api.getAuditTrail(billId, billNo));
+    await HostAppChannel.showAuditTrail(billId, widget.billNo);
   }
   }
 
 
   // ═══ 基本信息 ═══
   // ═══ 基本信息 ═══