Pārlūkot izejas kodu

fix #19900 #19888 加班申请单、用车申请单

chengc 1 nedēļu atpakaļ
vecāks
revīzija
dff21b4abf

+ 1 - 0
assets/i18n/en.json

@@ -720,6 +720,7 @@
     "returnCarSuccess": "Return registration successful",
     "returnCarFailed": "Return registration failed",
     "vehicleReturned": "Vehicle Returned",
+    "editReturnInfo": "Edit Return Info",
     "selectLicensePlateHint": "Please select license plate",
     "selectDepartTime": "Please select estimated departure time",
     "selectApplicantHint": "Please select applicant",

+ 1 - 0
assets/i18n/zh_CN.json

@@ -720,6 +720,7 @@
     "returnCarSuccess": "还车登记成功",
     "returnCarFailed": "还车登记失败",
     "vehicleReturned": "已还车",
+    "editReturnInfo": "修改还车信息",
     "selectLicensePlateHint": "请选择车牌号",
     "selectDepartTime": "请选择预计出车时间",
     "selectApplicantHint": "请选择申请人",

+ 1 - 0
assets/i18n/zh_TW.json

@@ -720,6 +720,7 @@
     "returnCarSuccess": "還車登記成功",
     "returnCarFailed": "還車登記失敗",
     "vehicleReturned": "已還車",
+    "editReturnInfo": "修改還車資訊",
     "selectLicensePlateHint": "請選擇車牌號",
     "selectDepartTime": "請選擇預計出車時間",
     "selectApplicantHint": "請選擇申請人",

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

@@ -105,13 +105,11 @@ class _ExpenseDetailPageState extends ConsumerState<ExpenseDetailPage> {
               canManualSubmit: canManualSubmit,
               closedText: l10n.get('statusClosed'),
               transferredText: l10n.get('statusTransferred'),
-              onEdit: status['canEdit'] == true
-                  ? () => GoRouter.of(context)
-                        .push('/expense/edit/${widget.billNo}')
-                        .then((result) {
-                          if (result == true && mounted) _loadData();
-                        })
-                  : null,
+              onEdit: () => GoRouter.of(context)
+                    .push('/expense/edit/${widget.billNo}')
+                    .then((result) {
+                      if (result == true && mounted) _loadData();
+                    }),
               onSubmit: () async {
                 final l10n = AppLocalizations.of(context);
                 final dd = _expense?.expenseDate != null

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

@@ -59,18 +59,31 @@ class _OvertimeApplyDetailPageState
       final detail = await api.fetchDetail(widget.billNo);
       if (!mounted) return;
 
-      // 单据状态(非关键,尽力加载),与详情合并到一个 setState 避免中间闪烁
+      // 单据状态 + 审核配置(非关键,尽力加载),与详情合并到一个 setState 避免中间闪烁
       Map<String, dynamic>? status;
+      Map<String, dynamic>? auditConfig;
       try {
-        status = await api.getBillStatus(widget.billNo);
+        final results = await Future.wait([
+          api.getBillStatus(widget.billNo),
+          api.getBillAuditConfig('JB'),
+        ]);
+        final Map<String, dynamic> s = results[0];
+        final Map<String, dynamic> c = results[1];
+        status = s;
+        auditConfig = c;
       } catch (_) {}
 
+      final hasAuditFlow = auditConfig?['hasAuditFlow'] == true;
+      final autoSubmit = auditConfig?['autoSubmit'] == true;
+      final canManualSubmit = hasAuditFlow && !autoSubmit;
+
       if (mounted) {
         setState(() {
           _data = detail;
           _billStatusBar = (status != null)
               ? BillStatusBar(
                   billStatus: status,
+                  canManualSubmit: canManualSubmit,
                   onEdit: () {
                     context
                         .push('/overtime-apply/edit/${widget.billNo}')

+ 33 - 2
lib/features/vehicle/vehicle_apply_detail_page.dart

@@ -62,20 +62,28 @@ class _VehicleApplyDetailPageState
         final detail = await api.fetchDetail(widget.billNo);
         if (!mounted) return;
 
-        // 获取单据状态 + 还车权限(非致命),与详情合并到一个 setState 避免中间闪烁
+        // 获取单据状态 + 审核配置 + 还车权限(非致命),与详情合并到一个 setState 避免中间闪烁
         Map<String, dynamic>? status;
+        Map<String, dynamic>? auditConfig;
         Map<String, dynamic>? rights;
         try {
           final results = await Future.wait([
             api.getBillStatus(widget.billNo),
+            api.getBillAuditConfig('YC'),
             api.getUserRights('RHB'),
           ]);
           final Map<String, dynamic> s = results[0];
-          final Map<String, dynamic> r = results[1];
+          final Map<String, dynamic> c = results[1];
+          final Map<String, dynamic> r = results[2];
           status = s;
+          auditConfig = c;
           rights = r;
         } catch (_) {}
 
+        final hasAuditFlow = auditConfig?['hasAuditFlow'] == true;
+        final autoSubmit = auditConfig?['autoSubmit'] == true;
+        final canManualSubmit = hasAuditFlow && !autoSubmit;
+
         final canReturn =
             rights?['canAdd'] == true || rights?['canModify'] == true;
         if (mounted) {
@@ -84,6 +92,7 @@ class _VehicleApplyDetailPageState
             _billStatusBar = (status != null)
                 ? BillStatusBar(
                     billStatus: status,
+                    canManualSubmit: canManualSubmit,
                     returnedText: AppLocalizations.of(
                       context,
                     ).get('vehicleReturned'),
@@ -154,6 +163,28 @@ class _VehicleApplyDetailPageState
                             );
                           }
                         : null,
+                    onEditReturn: () {
+                      ReturnCarDialog.show(
+                        context,
+                        billNo: widget.billNo,
+                        odometerBegin: _data?.odometerBegin ?? 0,
+                        recordDd: _data?.recordDd,
+                        onSubmit: (returnData) async {
+                          final api = ref.read(vehicleApplyApiProvider);
+                          returnData['usrCheck'] = HostAppChannel.usr;
+                          try {
+                            await api.submitReturn(
+                              widget.billNo,
+                              returnData,
+                            );
+                            if (mounted) _loadData();
+                            return true;
+                          } catch (_) {
+                            return false;
+                          }
+                        },
+                      );
+                    },
                   )
                 : null;
             _loading = false;

+ 29 - 3
lib/shared/widgets/bill_status_bar.dart

@@ -34,6 +34,9 @@ class BillStatusBar {
   /// "还车"按钮回调(仅用车申请单使用)
   final VoidCallback? onReturn;
 
+  /// "修改还车信息"按钮回调(仅用车申请单使用,已还车后显示)
+  final VoidCallback? onEditReturn;
+
   /// 点击状态标签回调(查看审批轨迹)
   final VoidCallback? onTapStatusTag;
 
@@ -56,6 +59,7 @@ class BillStatusBar {
     this.onSubmit,
     this.onCancelSubmit,
     this.onReturn,
+    this.onEditReturn,
     this.onTapStatusTag,
     this.closedText,
     this.transferredText,
@@ -79,6 +83,7 @@ class BillStatusBar {
   // ── 按钮显隐 ──
 
   bool get showEdit {
+    if (_isReturned) return false;
     final s = _approvalStatus;
     if (s == 'SHCOUNT0' || s == 'SHCOUNT3') return _canEdit;
     if (s == 'SHCOUNT6') return _canEdit;
@@ -87,14 +92,14 @@ class BillStatusBar {
 
   bool get showSubmit {
     if (!canManualSubmit) return false;
-    if (_isClosed || _isTransferred) return false;
+    if (_isClosed || _isTransferred || _isReturned) return false;
     final s = _approvalStatus;
     return s == 'SHCOUNT0' || s == 'SHCOUNT3';
   }
 
   bool get showCancelSubmit {
     if (!canManualSubmit) return false;
-    if (_isClosed || _isTransferred) return false;
+    if (_isClosed || _isTransferred || _isReturned) return false;
     return _approvalStatus == 'SHCOUNT1';
   }
 
@@ -107,8 +112,13 @@ class BillStatusBar {
         !_isTransferred;
   }
 
+  bool get showEditReturn {
+    if (onEditReturn == null) return false;
+    return _isReturned;
+  }
+
   bool get _showButtons =>
-      showEdit || showSubmit || showCancelSubmit || showReturn;
+      showEdit || showSubmit || showCancelSubmit || showReturn || showEditReturn;
 
   // ── 状态标签数据 ──
 
@@ -263,6 +273,21 @@ class BillStatusBar {
               ),
             ),
           ],
+          if (showEditReturn) ...[
+            if (showEdit || showSubmit || showCancelSubmit || showReturn)
+              const SizedBox(width: 12),
+            Expanded(
+              child: TDButton(
+                icon: Icons.assignment_return_outlined,
+                text: _editReturnLabel(l10n),
+                size: TDButtonSize.medium,
+                type: TDButtonType.outline,
+                shape: TDButtonShape.round,
+                theme: TDButtonTheme.primary,
+                onTap: onEditReturn,
+              ),
+            ),
+          ],
         ],
       ),
     );
@@ -275,4 +300,5 @@ class BillStatusBar {
   String _submitLabel(AppLocalizations l10n) => l10n.get('submit');
   String _cancelSubmitLabel(AppLocalizations l10n) => l10n.get('cancelSubmit');
   String _returnLabel(AppLocalizations l10n) => l10n.get('returnCar');
+  String _editReturnLabel(AppLocalizations l10n) => l10n.get('editReturnInfo');
 }