From eb322fd6b88273f1dada1f850f4473d5f054dd66 Mon Sep 17 00:00:00 2001
From: yyb <995253665@qq.com>
Date: 星期四, 21 五月 2026 17:48:19 +0800
Subject: [PATCH] 差旅报销费用报销

---
 src/pages/oa/ApproveManage/approve-list/approve.vue |  104 ++++++++++++++++++++++++++++++----------------------
 1 files changed, 60 insertions(+), 44 deletions(-)

diff --git a/src/pages/oa/ApproveManage/approve-list/approve.vue b/src/pages/oa/ApproveManage/approve-list/approve.vue
index 3ed6220..9201818 100644
--- a/src/pages/oa/ApproveManage/approve-list/approve.vue
+++ b/src/pages/oa/ApproveManage/approve-list/approve.vue
@@ -1,17 +1,22 @@
 <!--
   OA / 瀹℃壒绠$悊 / 瀹℃壒澶勭悊
-  璺敱锛�/pages/oa/ApproveManage/approve-list/approve
+  宸梾/璐圭敤鎶ラ攢浣跨敤鎶ラ攢璇︽儏 + 瀹℃壒鍒楄〃 approve 鎺ュ彛
 -->
 <template>
   <view class="oa-detail-page">
-    <PageHeader title="瀹℃壒澶勭悊"
+    <PageHeader :title="pageTitle"
                 @back="goBack" />
 
-    <scroll-view v-if="row"
+    <scroll-view v-if="displayReady"
                  class="oa-detail-scroll"
                  scroll-y
                  :show-scrollbar="false">
-      <ApproveInstanceDetailBody :row="row"
+      <ReimburseInstanceDetailBody v-if="isReimburse"
+                                 :reimburse-row="reimburseRow"
+                                 :module-key="detailModuleKey" />
+
+      <ApproveInstanceDetailBody v-else
+                                 :row="row"
                                  :module-key="detailModuleKey" />
 
       <view class="section-card opinion-card">
@@ -32,10 +37,10 @@
     <view v-else
           class="oa-empty">
       <up-empty mode="data"
-                text="鏈幏鍙栧埌瀹℃壒鏁版嵁" />
+                :text="loading ? '鍔犺浇涓�' : '鏈幏鍙栧埌瀹℃壒鏁版嵁'" />
     </view>
 
-    <view v-if="row"
+    <view v-if="displayReady"
           class="oa-page-footer">
       <text class="oa-footer-btn btn-default"
             :class="{ 'is-disabled': submitting }"
@@ -55,6 +60,7 @@
   import { onLoad } from "@dcloudio/uni-app";
   import PageHeader from "@/components/PageHeader.vue";
   import ApproveInstanceDetailBody from "./_components/ApproveInstanceDetailBody.vue";
+  import ReimburseInstanceDetailBody from "../../ReimburseManage/_components/ReimburseInstanceDetailBody.vue";
   import { approveApprovalInstance } from "@/api/oa/approvalInstance.js";
   import {
     buildApproveInstanceDto,
@@ -62,16 +68,44 @@
     loadInstanceRow,
   } from "../../_utils/approveListUtils.js";
   import { inferModuleKeyFromRow } from "../../_utils/approvalModuleApplyExtras.js";
+  import {
+    inferReimburseModuleKeyFromInstance,
+    isReimburseApprovalInstance,
+    loadReimburseDetailForInstance,
+  } from "../../_utils/reimburseApproveBridge.js";
+  import { getApprovalModuleConfig } from "../../_utils/approvalModuleRegistry.js";
 
-  const instanceId = ref("");
   const row = ref(null);
-  const detailModuleKey = computed(() => inferModuleKeyFromRow(row.value));
+  const reimburseRow = ref(null);
+  const loading = ref(false);
   const approveOpinion = ref("");
   const submitting = ref(false);
 
-  const goBack = () => {
-    uni.navigateBack();
-  };
+  const isReimburse = computed(() => isReimburseApprovalInstance(row.value));
+
+  const detailModuleKey = computed(() => {
+    if (isReimburse.value) {
+      return (
+        reimburseRow.value?.moduleKey ||
+        inferReimburseModuleKeyFromInstance(row.value)
+      );
+    }
+    return inferModuleKeyFromRow(row.value);
+  });
+
+  const pageTitle = computed(() => {
+    if (isReimburse.value) {
+      const label = getApprovalModuleConfig(detailModuleKey.value)?.label || "鎶ラ攢";
+      return `${label}瀹℃壒`;
+    }
+    return "瀹℃壒澶勭悊";
+  });
+
+  const displayReady = computed(() =>
+    isReimburse.value ? Boolean(reimburseRow.value) : Boolean(row.value)
+  );
+
+  const goBack = () => uni.navigateBack();
 
   const submitApprove = uiResult => {
     if (!row.value?.id || submitting.value) return;
@@ -99,7 +133,7 @@
           const prevRoute = pages[pages.length - 2]?.route || "";
           const delta = prevRoute.includes("approve-list/detail") ? 2 : 1;
           uni.navigateBack({ delta });
-        }, 300);
+        }, 400);
       })
       .catch(() => {
         uni.showToast({ title: "瀹℃壒鎿嶄綔澶辫触", icon: "none" });
@@ -109,56 +143,38 @@
       });
   };
 
-  onLoad(options => {
+  onLoad(async options => {
     if (!options?.id) {
       uni.showToast({ title: "缂哄皯瀹℃壒 ID", icon: "none" });
       setTimeout(goBack, 500);
       return;
     }
-    instanceId.value = options.id;
     const cached = loadInstanceRow(options.id);
     if (!cached) {
-      uni.showToast({ title: "璇蜂粠鍒楄〃杩涘叆瀹℃壒", icon: "none" });
+      uni.showToast({ title: "璇蜂粠鍒楄〃杩涘叆", icon: "none" });
       setTimeout(goBack, 500);
       return;
     }
     if (!canApproveInstance(cached)) {
-      uni.showToast({ title: "褰撳墠瀹℃壒涓嶅彲澶勭悊", icon: "none" });
+      uni.showToast({ title: "褰撳墠瀹℃壒鏃犻渶鎮ㄥ鐞�", icon: "none" });
       setTimeout(goBack, 500);
       return;
     }
     row.value = cached;
+    if (isReimburseApprovalInstance(cached)) {
+      loading.value = true;
+      try {
+        const { reimburseRow: mapped } = await loadReimburseDetailForInstance(cached);
+        reimburseRow.value = mapped;
+      } catch {
+        uni.showToast({ title: "鍔犺浇鎶ラ攢璇︽儏澶辫触", icon: "none" });
+      } finally {
+        loading.value = false;
+      }
+    }
   });
 </script>
 
 <style scoped lang="scss">
   @import "../../_styles/oa-approval-list.scss";
-
-  $primary: #2979ff;
-
-  .opinion-card {
-    margin-top: 10px;
-    background: #fff;
-    border-radius: 12px;
-    overflow: hidden;
-    box-shadow: 0 2px 12px rgba(31, 45, 61, 0.05);
-  }
-
-  .section-head {
-    padding: 12px 16px;
-    border-bottom: 1px solid #f2f4f7;
-  }
-
-  .section-title {
-    font-size: 15px;
-    font-weight: 600;
-    color: #1f2d3d;
-    padding-left: 10px;
-    border-left: 3px solid $primary;
-    line-height: 1.2;
-  }
-
-  .opinion-wrap {
-    padding: 12px 16px 16px;
-  }
 </style>

--
Gitblit v1.9.3