Bladeren bron

OA单据详情页状态优化

chengc 1 week geleden
bovenliggende
commit
7097d754db

+ 1 - 0
assets/i18n/en.json

@@ -69,6 +69,7 @@
     "withdraw": "Withdraw Application",
     "withdrawAction": "Withdraw",
     "cancelSubmit": "Cancel Submit",
+    "cancelling": "Cancelling…",
     "modify": "Modify",
     "returnCar": "Return Car",
     "withdrawApplication": "Withdraw Application",

+ 1 - 0
assets/i18n/zh_CN.json

@@ -66,6 +66,7 @@
     "withdraw": "撤回申请",
     "withdrawAction": "撤回",
     "cancelSubmit": "取消提交",
+    "cancelling": "正在取消…",
     "modify": "修改",
     "returnCar": "还车",
     "withdrawApplication": "撤回申请",

+ 1 - 0
assets/i18n/zh_TW.json

@@ -69,6 +69,7 @@
     "withdraw": "撤回申請",
     "withdrawAction": "撤回",
     "cancelSubmit": "取消提交",
+    "cancelling": "正在取消…",
     "modify": "修改",
     "returnCar": "還車",
     "withdrawApplication": "撤回申請",

+ 2 - 0
lib/features/expense/expense_create_page.dart

@@ -25,6 +25,7 @@ import '../../shared/models/bill_file_rights.dart';
 import '../../shared/widgets/action_bar.dart';
 import '../../shared/widgets/loading_dialog.dart';
 import '../../shared/widgets/attachment_picker.dart';
+import 'expense_list_controller.dart';
 import '../../shared/helpers/audit_flow_helper.dart';
 import 'expense_apply_import_page.dart';
 
@@ -1153,6 +1154,7 @@ class _ExpenseCreatePageState extends ConsumerState<ExpenseCreatePage> {
               );
             }
             TDToast.showSuccess(l10n.get('billCreated'), context: context);
+            ref.read(expenseRefreshProvider.notifier).state++;
             GoRouter.of(context).go('/expense/list');
           }
         } catch (e) {

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

@@ -94,15 +94,14 @@ class _ExpenseDetailPageState extends ConsumerState<ExpenseDetailPage> {
         ]);
         final Map<String, dynamic> status = results[0];
         final Map<String, dynamic> auditConfig = results[1];
-        final canManualSubmit =
-            auditConfig['hasAuditFlow'] == true &&
-            auditConfig['autoSubmit'] != true;
+        final hasAuditFlow =
+            auditConfig['hasAuditFlow'] == true;
         if (mounted) {
           setState(() {
             final l10n = AppLocalizations.of(context);
             _billStatusBar = BillStatusBar(
               billStatus: status,
-              canManualSubmit: canManualSubmit,
+              hasAuditFlow: hasAuditFlow,
               closedText: l10n.get('statusClosed'),
               transferredText: l10n.get('statusTransferred'),
               onEdit: () => GoRouter.of(context)
@@ -128,7 +127,7 @@ class _ExpenseDetailPageState extends ConsumerState<ExpenseDetailPage> {
                 final dd = _expense?.expenseDate != null
                     ? du.DateUtils.formatDate(_expense!.expenseDate!)
                     : '';
-                LoadingDialog.show(context, text: l10n.get('submitting'));
+                LoadingDialog.show(context, text: l10n.get('cancelling'));
                 try {
                   await api.shSubmit(
                     bilNo: widget.billNo,

+ 2 - 0
lib/features/expense/expense_edit_page.dart

@@ -19,6 +19,7 @@ import '../../shared/helpers/audit_flow_helper.dart';
 import 'expense_api.dart';
 import '../../core/i18n/app_localizations.dart';
 import 'expense_model.dart';
+import 'expense_list_controller.dart';
 import '../../core/theme/app_colors.dart';
 import '../../core/theme/app_colors_extension.dart';
 import '../../core/navigation/host_app_channel.dart';
@@ -1087,6 +1088,7 @@ class _ExpenseEditPageState extends ConsumerState<ExpenseEditPage> {
           }
           if (mounted) {
             TDToast.showSuccess(l10n.get('billModified'), context: context);
+            ref.read(expenseRefreshProvider.notifier).state++;
             GoRouter.of(context).go('/expense/list');
           }
         } catch (e) {

+ 2 - 0
lib/features/expense_apply/expense_apply_create_page.dart

@@ -19,6 +19,7 @@ import '../../shared/widgets/nav_bar_config.dart';
 import '../../shared/widgets/attachment_picker.dart';
 import '../../core/theme/app_colors.dart';
 import 'expense_apply_model.dart';
+import 'expense_apply_list_controller.dart';
 import '../../shared/helpers/audit_flow_helper.dart';
 import '../../core/theme/app_colors_extension.dart';
 import '../../core/constants/enums.dart';
@@ -1011,6 +1012,7 @@ class _ExpenseApplyCreatePageState
               );
             }
             TDToast.showSuccess(l10n.get('billCreated'), context: context);
+            ref.read(expenseApplyRefreshProvider.notifier).state++;
             GoRouter.of(context).go('/expense-apply/list');
           }
         } catch (e) {

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

@@ -113,8 +113,6 @@ class _ExpenseApplyDetailPageState
       } catch (_) {}
 
       final hasAuditFlow = auditConfig?['hasAuditFlow'] == true;
-      final autoSubmit = auditConfig?['autoSubmit'] == true;
-      final canManualSubmit = hasAuditFlow && !autoSubmit;
 
       if (mounted) {
         setState(() {
@@ -125,7 +123,7 @@ class _ExpenseApplyDetailPageState
           _billStatusBar = (status != null)
               ? BillStatusBar(
                   billStatus: status,
-                  canManualSubmit: canManualSubmit,
+                  hasAuditFlow: hasAuditFlow,
                   transferredText: AppLocalizations.of(
                     context,
                   ).get('statusConvertedToExpense'),
@@ -155,7 +153,7 @@ class _ExpenseApplyDetailPageState
                     final applyDate = _data?.expenseApplyDate != null
                         ? du.DateUtils.formatDate(_data!.expenseApplyDate!)
                         : '';
-                    LoadingDialog.show(context, text: l10n.get('submitting'));
+                    LoadingDialog.show(context, text: l10n.get('cancelling'));
                     try {
                       await a.shSubmit(
                         bilNo: widget.billNo,

+ 2 - 0
lib/features/expense_apply/expense_apply_edit_page.dart

@@ -19,6 +19,7 @@ import '../../core/theme/app_colors_extension.dart';
 import '../../core/constants/enums.dart';
 import 'expense_apply_api.dart';
 import 'widgets/expense_apply_detail_dialog.dart';
+import 'expense_apply_list_controller.dart';
 import '../../shared/widgets/searchable_picker_sheet.dart';
 import '../../shared/helpers/audit_flow_helper.dart';
 import '../../core/utils/amount_utils.dart';
@@ -782,6 +783,7 @@ class _ExpenseApplyEditPageState extends ConsumerState<ExpenseApplyEditPage> {
           }
           if (mounted) {
             TDToast.showSuccess(l10n.get('billModified'), context: context);
+            ref.read(expenseApplyRefreshProvider.notifier).state++;
             GoRouter.of(context).go('/expense-apply/list');
           }
         } catch (e) {

+ 2 - 0
lib/features/overtime/overtime_apply_create_page.dart

@@ -20,6 +20,7 @@ import '../../core/theme/app_colors.dart';
 import '../../core/theme/app_colors_extension.dart';
 import 'overtime_apply_api.dart';
 import 'overtime_apply_model.dart';
+import 'overtime_apply_list_controller.dart';
 import '../expense_apply/expense_apply_api.dart';
 import 'widgets/overtime_apply_detail_dialog.dart';
 
@@ -881,6 +882,7 @@ class _OvertimeApplyCreatePageState
           }
           if (mounted) {
             TDToast.showSuccess(l10n.get('billCreated'), context: context);
+            ref.read(overtimeApplyRefreshProvider.notifier).state++;
             GoRouter.of(context).go('/overtime-apply/list');
           }
         } catch (e) {

+ 2 - 4
lib/features/overtime/overtime_apply_detail_page.dart

@@ -74,8 +74,6 @@ class _OvertimeApplyDetailPageState
       } catch (_) {}
 
       final hasAuditFlow = auditConfig?['hasAuditFlow'] == true;
-      final autoSubmit = auditConfig?['autoSubmit'] == true;
-      final canManualSubmit = hasAuditFlow && !autoSubmit;
 
       if (mounted) {
         setState(() {
@@ -83,7 +81,7 @@ class _OvertimeApplyDetailPageState
           _billStatusBar = (status != null)
               ? BillStatusBar(
                   billStatus: status,
-                  canManualSubmit: canManualSubmit,
+                  hasAuditFlow: hasAuditFlow,
                   onEdit: () {
                     context
                         .push('/overtime-apply/edit/${widget.billNo}')
@@ -111,7 +109,7 @@ class _OvertimeApplyDetailPageState
                         ? du.DateUtils.formatDate(_data!.jbDd!)
                         : '';
                     if (jbDdStr.isEmpty) return;
-                    LoadingDialog.show(context, text: l10n.get('submitting'));
+                    LoadingDialog.show(context, text: l10n.get('cancelling'));
                     try {
                       await api.shSubmit(
                         bilNo: widget.billNo,

+ 2 - 0
lib/features/overtime/overtime_apply_edit_page.dart

@@ -18,6 +18,7 @@ import '../../shared/helpers/audit_flow_helper.dart';
 import '../../core/theme/app_colors.dart';
 import '../../core/theme/app_colors_extension.dart';
 import 'overtime_apply_api.dart';
+import 'overtime_apply_list_controller.dart';
 import 'widgets/overtime_apply_detail_dialog.dart';
 import '../../shared/widgets/searchable_picker_sheet.dart';
 import '../expense_apply/expense_apply_api.dart';
@@ -823,6 +824,7 @@ class _OvertimeApplyEditPageState extends ConsumerState<OvertimeApplyEditPage> {
           }
           if (mounted) {
             TDToast.showSuccess(l10n.get('billModified'), context: context);
+            ref.read(overtimeApplyRefreshProvider.notifier).state++;
             GoRouter.of(context).go('/overtime-apply/list');
           }
         } catch (e) {

+ 2 - 0
lib/features/vehicle/vehicle_apply_create_page.dart

@@ -23,6 +23,7 @@ import '../../shared/widgets/location_picker.dart';
 import '../../shared/helpers/audit_flow_helper.dart';
 import 'vehicle_apply_api.dart';
 import 'vehicle_apply_model.dart';
+import 'vehicle_apply_list_controller.dart';
 
 class VehicleApplyCreatePage extends ConsumerStatefulWidget {
   const VehicleApplyCreatePage({super.key});
@@ -757,6 +758,7 @@ class _VehicleApplyCreatePageState
           }
           if (mounted) {
             TDToast.showSuccess(l10n.get('billCreated'), context: context);
+            ref.read(vehicleApplyRefreshProvider.notifier).state++;
             GoRouter.of(context).go('/vehicle-apply/list');
           }
         } catch (e) {

+ 25 - 12
lib/features/vehicle/vehicle_apply_detail_page.dart

@@ -81,8 +81,6 @@ class _VehicleApplyDetailPageState
         } catch (_) {}
 
         final hasAuditFlow = auditConfig?['hasAuditFlow'] == true;
-        final autoSubmit = auditConfig?['autoSubmit'] == true;
-        final canManualSubmit = hasAuditFlow && !autoSubmit;
 
         final canReturn =
             rights?['canAdd'] == true || rights?['canModify'] == true;
@@ -92,7 +90,7 @@ class _VehicleApplyDetailPageState
             _billStatusBar = (status != null)
                 ? BillStatusBar(
                     billStatus: status,
-                    canManualSubmit: canManualSubmit,
+                    hasAuditFlow: hasAuditFlow,
                     returnedText: AppLocalizations.of(
                       context,
                     ).get('vehicleReturned'),
@@ -124,7 +122,7 @@ class _VehicleApplyDetailPageState
                       final dd = _data?.ycDd != null
                           ? du.DateUtils.formatDate(_data!.ycDd!)
                           : '';
-                      LoadingDialog.show(context, text: l10n.get('submitting'));
+                      LoadingDialog.show(context, text: l10n.get('cancelling'));
                       try {
                         await api.shSubmit(
                           bilNo: widget.billNo,
@@ -412,14 +410,29 @@ class _VehicleApplyDetailPageState
           showArrow: false,
         ),
         const SizedBox(height: 16),
-        TripRouteCard(
-          originLabel: app.originAdr.isNotEmpty ? app.originAdr : '-',
-          destLabel: app.destAdr.isNotEmpty ? app.destAdr : '-',
-          originLat: app.originLatitude,
-          originLng: app.originLongitude,
-          destLat: app.destLatitude,
-          destLng: app.destLongitude,
-        ),
+        if (app.originAdr.isEmpty && app.destAdr.isEmpty) ...[
+          FormFieldRow(
+            label: l10n.get('origin'),
+            value: '-',
+            readOnly: true,
+            showArrow: false,
+          ),
+          const SizedBox(height: 16),
+          FormFieldRow(
+            label: l10n.get('destination'),
+            value: '-',
+            readOnly: true,
+            showArrow: false,
+          ),
+        ] else
+          TripRouteCard(
+            originLabel: app.originAdr.isNotEmpty ? app.originAdr : '-',
+            destLabel: app.destAdr.isNotEmpty ? app.destAdr : '-',
+            originLat: app.originLatitude,
+            originLng: app.originLongitude,
+            destLat: app.destLatitude,
+            destLng: app.destLongitude,
+          ),
       ],
     );
   }

+ 1 - 0
lib/features/vehicle/vehicle_apply_edit_page.dart

@@ -812,6 +812,7 @@ class _VehicleApplyEditPageState extends ConsumerState<VehicleApplyEditPage> {
           }
           if (mounted) {
             TDToast.showSuccess(l10n.get('billModified'), context: context);
+            ref.read(vehicleApplyRefreshProvider.notifier).state++;
             GoRouter.of(context).go('/vehicle-apply/list');
           }
         } catch (e) {

+ 7 - 7
lib/shared/widgets/bill_status_bar.dart

@@ -49,9 +49,8 @@ class BillStatusBar {
   /// 已还车状态文本(如"已还车",仅用车申请单使用,优先级最高)
   final String? returnedText;
 
-  /// 是否允许手动提交审核流。为 false 时提交/取消提交按钮不显示。
-  /// 当 ERP 已自动处理存盘立即提交时,无需在详情页再次手动操作。
-  final bool canManualSubmit;
+  /// 单据类型是否配置了审核流。为 false 时提交/取消提交按钮不显示。
+  final bool hasAuditFlow;
 
   const BillStatusBar({
     this.billStatus,
@@ -64,7 +63,7 @@ class BillStatusBar {
     this.closedText,
     this.transferredText,
     this.returnedText,
-    this.canManualSubmit = true,
+    this.hasAuditFlow = false,
   });
 
   // ── 派生状态 ──
@@ -91,16 +90,17 @@ class BillStatusBar {
   }
 
   bool get showSubmit {
-    if (!canManualSubmit) return false;
+    if (!hasAuditFlow) return false;
     if (_isClosed || _isTransferred || _isReturned) return false;
     final s = _approvalStatus;
     return s == 'SHCOUNT0' || s == 'SHCOUNT3';
   }
 
   bool get showCancelSubmit {
-    if (!canManualSubmit) return false;
+    if (!hasAuditFlow) return false;
     if (_isClosed || _isTransferred || _isReturned) return false;
-    return _approvalStatus == 'SHCOUNT1';
+    final s = _approvalStatus;
+    return s == 'SHCOUNT1' || s == 'SHCOUNT5';
   }
 
   bool get showReturn {