From 8a709ba6db50831048f9c3e2452ea6dc6c3de36f Mon Sep 17 00:00:00 2001
From: Bang Hu <hu_bang@hotmail.com>
Date: 星期五, 12 九月 2025 15:45:33 +0800
Subject: [PATCH] bug修改代码提交

---
 src/views/tradeManage/detail/index.vue |  568 ++++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 448 insertions(+), 120 deletions(-)

diff --git a/src/views/tradeManage/detail/index.vue b/src/views/tradeManage/detail/index.vue
index 098fffc..9e0589f 100644
--- a/src/views/tradeManage/detail/index.vue
+++ b/src/views/tradeManage/detail/index.vue
@@ -2,79 +2,104 @@
   <div class="default-main">
     <!-- 璁㈠崟淇℃伅 + 鐢宠浜轰俊鎭� + 浜ゆ槗鍐呭锛堝悎骞朵负鍚屼竴鍗$墖锛� -->
     <el-card shadow="never">
-      <el-descriptions
-        :column="2"
-        border
-        class="mt10 order-desc fixed-label"
-        label-width="180px"
-        :label-style="labelStyle"
-        :content-style="contentStyle"
-      >
-        <el-descriptions-item :span="2" class="section-header">
-          <template #label>
-            <el-icon class="section-icon"><Document /></el-icon>
-            <span>璁㈠崟淇℃伅</span>
-          </template>
-          <template #default></template>
-        </el-descriptions-item>
-        <el-descriptions-item label="璁㈠崟缂栧彿">{{ detail.orderNo }}</el-descriptions-item>
-        <el-descriptions-item label="浜ゆ槗璧勬簮绫诲瀷">{{ detail.resourceTypeName }}</el-descriptions-item>
-        <el-descriptions-item label="鐢宠鏃堕棿">{{ detail.applyTime }}</el-descriptions-item>
-        <el-descriptions-item label="浜ゆ槗鐘舵��">
-          <el-tag :type="getStatusType(detail.status)" size="small">{{ detail.statusName }}</el-tag>
-        </el-descriptions-item>
-      </el-descriptions>
-      
-      <!-- 鐢宠浜轰俊鎭紙涓庤鍗曚俊鎭悓鍗$墖锛屽鐢ㄥ垎闅旀爣棰樻牱寮忥級 -->
-      <el-descriptions
-        :column="2"
-        border
-        class="mt15 order-desc fixed-label"
-        label-width="180px"
-        :label-style="labelStyle"
-        :content-style="contentStyle"
-      >
-        <el-descriptions-item :span="2" class="section-header">
-          <template #label>
-            <el-icon class="section-icon"><User /></el-icon>
-            <span>鐢宠浜轰俊鎭�</span>
-          </template>
-          <template #default></template>
-        </el-descriptions-item>
-        <el-descriptions-item label="濮撳悕">{{ detail.userName || '-' }}</el-descriptions-item>
-        <el-descriptions-item label="鍗曚綅">{{ detail.unitName || '-' }}</el-descriptions-item>
-        <el-descriptions-item label="閮ㄩ棬">{{ detail.userDept || '-' }}</el-descriptions-item>
-        <el-descriptions-item label="鐢ㄦ埛鍚�">{{ detail.userAccount || '-' }}</el-descriptions-item>
-      </el-descriptions>
+      <!-- 璁㈠崟淇℃伅 - 浣跨敤鑷畾涔夎〃鏍煎竷灞� -->
+      <div class="order-info-section">
+        <div class="section-header">
+          <el-icon class="section-icon"><Document /></el-icon>
+          <span>璁㈠崟淇℃伅</span>
+        </div>
+        <div class="order-info-grid">
+          <div class="order-info-item">
+            <div class="order-label">璁㈠崟缂栧彿</div>
+            <div class="order-content">{{ detail.orderNo }}</div>
+          </div>
+          <div class="order-info-item">
+            <div class="order-label">浜ゆ槗璧勬簮绫诲瀷</div>
+            <div class="order-content">{{ detail.resourceTypeName }}</div>
+          </div>
+          <div class="order-info-item">
+            <div class="order-label">鐢宠鏃堕棿</div>
+            <div class="order-content">{{ detail.applyTime }}</div>
+          </div>
+          <div class="order-info-item">
+            <div class="order-label">浜ゆ槗鐘舵��</div>
+            <div class="order-content">
+              <el-tag :type="getStatusType(detail.status)" size="small">{{ detail.statusName }}</el-tag>
+            </div>
+          </div>
+        </div>
+      </div>
 
-      <!-- 浜ゆ槗鍐呭锛堢揣闅忕敵璇蜂汉淇℃伅锛屽悓鍗$墖锛屽鐢ㄥ垎闅旀爣棰樻牱寮忥級 -->
-      <el-descriptions
-        :column="2"
-        border
-        class="mt15 order-desc fixed-label"
-        label-width="180px"
-        :label-style="labelStyle"
-        :content-style="contentStyle"
-      >
-        <el-descriptions-item :span="2" class="section-header">
-          <template #label>
-            <el-icon class="section-icon"><Goods /></el-icon>
-            <span>浜ゆ槗鍐呭</span>
-          </template>
-          <template #default></template>
-        </el-descriptions-item>
-        <el-descriptions-item label="浜у搧鍚嶇О">
-          <el-link type="primary" :underline="false">{{ detail.productName }}</el-link>
-        </el-descriptions-item>
-        <el-descriptions-item label="鎻愪緵鑰�">{{ detail.supplier }}</el-descriptions-item>
-        <el-descriptions-item label="琛屼笟棰嗗煙">{{ detail.industry }}</el-descriptions-item>
-        <el-descriptions-item label="鍗曚綅宸ョ▼">{{ detail.projectUnit }}</el-descriptions-item>
-        <el-descriptions-item label="浜у搧绫诲瀷">{{ detail.productType || '-' }}</el-descriptions-item>
-        <el-descriptions-item label="浜у搧绠�浠�">
-          <div class="desc-wrap">{{ detail.productDesc }}</div>
-        </el-descriptions-item>
-      </el-descriptions>
-      
+      <!-- 鐢宠浜轰俊鎭� - 浣跨敤鑷畾涔夎〃鏍煎竷灞� -->
+      <div class="applicant-info-section">
+        <div class="section-header">
+          <el-icon class="section-icon"><User /></el-icon>
+          <span>鐢宠浜轰俊鎭�</span>
+        </div>
+        <div class="applicant-info-grid">
+          <div class="applicant-info-item">
+            <div class="applicant-label">濮撳悕</div>
+            <div class="applicant-content">{{ detail.userName || '-' }}</div>
+          </div>
+          <div class="applicant-info-item">
+            <div class="applicant-label">鍗曚綅</div>
+            <div class="applicant-content">{{ detail.unitName || '-' }}</div>
+          </div>
+          <div class="applicant-info-item">
+            <div class="applicant-label">閮ㄩ棬</div>
+            <div class="applicant-content">{{ detail.userDept || '-' }}</div>
+          </div>
+          <div class="applicant-info-item">
+            <div class="applicant-label">鐢ㄦ埛鍚�</div>
+            <div class="applicant-content">{{ detail.userAccount || '-' }}</div>
+          </div>
+        </div>
+      </div>
+
+      <!-- 浜ゆ槗鍐呭 - 浣跨敤鑷畾涔夎〃鏍煎竷灞� -->
+      <div class="transaction-content-section">
+        <div class="section-header">
+          <el-icon class="section-icon"><Goods /></el-icon>
+          <span>浜ゆ槗鍐呭</span>
+        </div>
+        <div class="transaction-content-grid">
+          <div class="transaction-content-item">
+            <div class="transaction-label">浜у搧鍚嶇О</div>
+            <div class="transaction-content">
+              <el-link type="primary" :underline="false">{{ detail.productName }}</el-link>
+            </div>
+          </div>
+          <div class="transaction-content-item">
+            <div class="transaction-label">鎻愪緵鑰�</div>
+            <div class="transaction-content">{{ detail.supplier }}</div>
+          </div>
+          <div class="transaction-content-item">
+            <div class="transaction-label">琛屼笟棰嗗煙</div>
+            <div class="transaction-content">{{ detail.industry }}</div>
+          </div>
+          <div class="transaction-content-item">
+            <div class="transaction-label">鍗曚綅宸ョ▼</div>
+            <div class="transaction-content">
+              <el-tooltip effect="dark" :content="detail.projectUnit || '-'" placement="top" :disabled="!(detail.projectUnit && String(detail.projectUnit).trim())" popper-class="tooltip-wrap">
+                <div class="ellipsis-1">{{ detail.projectUnit || '-' }}</div>
+              </el-tooltip>
+            </div>
+          </div>
+          <div class="transaction-content-item">
+            <div class="transaction-label">浜у搧绫诲瀷</div>
+            <div class="transaction-content">{{ detail.productType || '-' }}</div>
+          </div>
+          <div class="transaction-content-item">
+            <div class="transaction-label">浜у搧绠�浠�</div>
+            <div class="transaction-content">
+              <el-tooltip effect="dark" :content="detail.productDesc || '-'" placement="top" :disabled="!(detail.productDesc && String(detail.productDesc).trim())" popper-class="tooltip-wrap" trigger="click">
+                <div class="desc-wrap ellipsis-3">{{ detail.productDesc || '-' }}</div>
+              </el-tooltip>
+            </div>
+          </div>
+        </div>
+      </div>
+
       <!-- 璁㈠崟璇︽儏锛堢Щ鍔ㄥ埌浜ゆ槗鍐呭涓嬮潰锛屽悓涓�鍗$墖鍐咃級 -->
       <div ref="orderTableWrapRef">
         <el-table
@@ -226,11 +251,11 @@
      </el-card>
 
     <!-- 瀹℃壒杩借釜 -->
-    <el-card class="mt15" shadow="never" v-if="detail.records?.length">
+    <el-card class="mt15" shadow="never">
       <div class="title">瀹℃壒杩借釜</div>
-      
+
       <!-- 鏍囩椤� -->
-      <el-tabs v-model="activeTab" class="approval-tabs">
+      <!-- <el-tabs v-model="activeTab" class="approval-tabs">
         <el-tab-pane label="瀹℃壒璁板綍" name="records">
           <el-table
             :data="detail.records"
@@ -279,13 +304,65 @@
             </el-table-column>
           </el-table>
         </el-tab-pane>
-      </el-tabs>
-      
-      <!-- 杩斿洖鎸夐挳 -->
-      <div class="action-buttons">
-        <el-button @click="goBack">杩斿洖</el-button>
+      </el-tabs> -->
+
+      <!-- 澶栭儴绯荤粺瀹℃壒杞ㄨ抗 iframe -->
+      <div class="iframe-wrap" v-if="workflowIframeUrl">
+        <iframe :src="workflowIframeUrl" class="workflow-iframe" referrerpolicy="no-referrer"></iframe>
+      </div>
+
+    </el-card>
+
+    <!-- 浜ゆ槗璇勪环锛堝綋宸茶瘎浠锋椂鏄剧ず锛� -->
+    <el-card class="mt15" shadow="never" v-if="showEvaluation">
+      <div class="title">浜ゆ槗璇勪环</div>
+      <div class="evaluation-content">
+        <div class="evaluation-form">
+          <div class="rating-section">
+            <div class="rating-items">
+              <div class="rating-row">
+                <div class="rating-item">
+                  <label class="required">缁煎悎璇勫垎:</label>
+                  <el-rate :model-value="evaluation.overallRating" :max="5" disabled :colors="['#99A9BF', '#F7BA2A', '#FF9900']" />
+                </div>
+                <div class="rating-item">
+                  <label class="required">鏈嶅姟璇勫垎:</label>
+                  <el-rate :model-value="evaluation.serviceRating" :max="5" disabled :colors="['#99A9BF', '#F7BA2A', '#FF9900']" />
+                </div>
+              </div>
+              <div class="rating-row">
+                <div class="rating-item">
+                  <label class="required">璐ㄩ噺璇勫垎:</label>
+                  <el-rate :model-value="evaluation.qualityRating" :max="5" disabled :colors="['#99A9BF', '#F7BA2A', '#FF9900']" />
+                </div>
+                <div class="rating-item">
+                  <label class="required">閫熷害璇勫垎:</label>
+                  <el-rate :model-value="evaluation.speedRating" :max="5" disabled :colors="['#99A9BF', '#F7BA2A', '#FF9900']" />
+                </div>
+              </div>
+            </div>
+          </div>
+
+          <div class="form-item">
+            <label class="required">璇勪环鍐呭:</label>
+            <div class="eval-text">{{ evaluation.content || '-' }}</div>
+          </div>
+
+          <div class="form-item">
+            <label>鍏朵粬淇℃伅:</label>
+            <div class="eval-meta">
+              <span>鏄惁鍖垮悕锛歿{ evaluation.isAnonymous ? '鏄�' : '鍚�' }}</span>
+              <span class="split">|</span>
+              <span>璇勪环鏃堕棿锛歿{ evaluation.evaluateTime || '-' }}</span>
+            </div>
+          </div>
+        </div>
       </div>
     </el-card>
+    <!-- 杩斿洖鎸夐挳 -->
+    <div class="action-buttons">
+        <el-button @click="goBack">杩斿洖</el-button>
+      </div>
   </div>
 </template>
 
@@ -296,14 +373,35 @@
 import { ElMessage } from 'element-plus'
 import orderApi from '@/api/orderApi'
 import createAxios from '@/utils/axios'
+import productApi from '@/api/productApi'
+import sysUserService from '@/api/sysUser'
+import { useUserInfo } from '@/stores/modules/userInfo'
 
+const hostUrl =  import.meta.env.VITE_AXIOS_BASE_URL
 const route = useRoute()
 const router = useRouter()
 const detail = reactive<any>({ items: [], records: [], nodes: [] })
+const evaluation = reactive<any>({
+  content: '',
+  overallRating: 0,
+  serviceRating: 0,
+  qualityRating: 0,
+  speedRating: 0,
+  isAnonymous: false,
+  evaluateTime: ''
+})
 const orderTableWrapRef = ref<HTMLElement | null>(null)
 const activeTab = ref('records')
+const userStore = useUserInfo()
+// 澶栭儴瀹℃壒杞ㄨ抗iframe鍦板潃
+const workflowIframeUrl = computed(() => {
+  const pid = (detail.workflowId || route.query.processinstId || '').toString().trim()
+  if (!pid) return ''
+  return `${hostUrl}/activity/history?processinstId=${encodeURIComponent(pid)}&token=${userStore.getAdminToken}`
+})
 const labelStyle = { width: '180px', maxWidth: '180px' }
 const contentStyle = { width: 'calc(50% - 180px)' }
+
 
 // 鏂囦欢鐩稿叧
 const fileList = ref<any[]>([])
@@ -318,6 +416,11 @@
   const statusOrder = ['WAIT_UPLOAD', 'WAIT_AUTHORIZE', 'WAIT_CONFIRM', 'COMPLETED', 'EVALUATED']
   const currentStatus = statusServerToUi[statusName]
   return currentStatus && statusOrder.indexOf(currentStatus) >= statusOrder.indexOf('WAIT_CONFIRM')
+})
+
+// 鏄惁鏄剧ず璇勪环鍗$墖锛堝凡璇勪环鏃舵樉绀猴級
+const showEvaluation = computed(() => {
+  return (detail.isEvaluate === '宸茶瘎浠�')
 })
 
 // 璁$畻琛ㄦ牸鏁版嵁锛屾坊鍔犳眹鎬昏
@@ -361,23 +464,56 @@
 onMounted(async () => {
   const orderId = String(route.params.id || '')
   if (!orderId) return
-  
+
   try {
     // 骞惰鑾峰彇璁㈠崟璇︽儏鍜屽崗璁被鍨嬫鏌�
     const [orderRes, agreementRes] = await Promise.all([
       orderApi.getOrderDetail(orderId),
       orderApi.checkAgreementPriceType(orderId)
     ])
-    
+
     const res = orderRes as any
     const data = res?.data || {}
-    
+
     // 璁剧疆鏄惁涓哄崗璁鍗�
     const agreementResult = agreementRes as any
     isAgreementOrder.value = agreementResult?.data === true
 
     const statusName: string = data.orderStatus || ''
     const uiStatus = statusServerToUi[statusName] || 'INFO'
+
+    // 鏍规嵁浜у搧id鑾峰彇浜у搧淇℃伅锛屾洿鏂板ご閮ㄥ睍绀�
+    try {
+      if (data.productId) {
+        const detailRes: any = await productApi.getProductById({ id: data.productId })
+        if (detailRes?.code === 200 && detailRes.data) {
+          // 鐢ㄤ骇鍝佽鎯呰ˉ鍏ㄥご淇℃伅
+          data.productName = detailRes.data.name || data.productName
+          data.providerName = detailRes.data.submissionUnit || data.providerName
+          data.industry = detailRes.data.industrialChainName || data.industry
+          data.productDesc = detailRes.data.describe || data.productDesc
+          data.projectUnit = detailRes.data.importantAreaName || data.productDesc
+          data.productType = detailRes.data.typeName || data.productDesc
+        }
+      }
+    } catch (e) {
+      // 蹇界暐浜у搧璇︽儏澶辫触锛屼笉闃诲璁㈠崟璇︽儏
+    }
+
+    // 鑾峰彇鐢ㄦ埛淇℃伅
+    try {
+        const userRes: any = await sysUserService.getUserdetail({ userId: data.userId })
+        if (userRes?.code === 200 && userRes.data) {
+            // 鐢ㄤ骇鍝佽鎯呰ˉ鍏ㄥご淇℃伅
+            data.unitName = userRes.data.unitName || data.unitName
+            data.userName = userRes.data.name || data.userName
+            data.userDept = userRes.data.departmentName || data.userDept
+            data.userPhone = userRes.data.phone || data.userPhone
+            data.userAccount = userRes.data.username || data.userAccount
+        }
+    }catch (e){
+
+    }
 
     // 鏄犲皠璁㈠崟璇︽儏澶撮儴淇℃伅
     const head = {
@@ -397,6 +533,7 @@
       projectUnit: data.projectUnit || '-',
       productType: data.productType || '-',
       productDesc: data.productDesc || '-',
+      isEvaluate: data.isEvaluate || '鏈瘎浠�'
     }
 
     // 鏄庣粏椤规槧灏�
@@ -430,7 +567,20 @@
       cashTotal: cashTotalNum.toLocaleString(),
       records: [],
       nodes: [],
+      workflowId: data.workflowId || data.processinstId || ''
     })
+
+    // 鏄犲皠浜ゆ槗璇勪环淇℃伅锛堝鏋滃瓨鍦級
+    if (data.evaluation) {
+      evaluation.content = data.evaluation.content || ''
+      evaluation.overallRating = Number(data.evaluation.rating || data.evaluation.overallRating || 0)
+      evaluation.serviceRating = Number(data.evaluation.serviceRating || 0)
+      evaluation.qualityRating = Number(data.evaluation.qualityRating || 0)
+      // 鍚庣涓� deliveryRating锛屽榻愬墠绔� speedRating 鍛藉悕
+      evaluation.speedRating = Number(data.evaluation.deliveryRating || data.evaluation.speedRating || 0)
+      evaluation.isAnonymous = Boolean(data.evaluation.isAnonymous)
+      evaluation.evaluateTime = formatDateTime((data.evaluation.replyTime || data.evaluation.createdAt || data.evaluation.createTime) as any)
+    }
 
     // 鍒濆鍖栦氦鏄撲俊鎭娉ㄦ暟鎹�
     remarkItems.value = (detail.items || []).map((item: any, index: number) => {
@@ -443,11 +593,11 @@
         endDateObj.setFullYear(endDateObj.getFullYear() + item.period)
         endDate = endDateObj.toISOString().split('T')[0] // 鏍煎紡鍖栦负 YYYY-MM-DD
       }
-      
-      return { 
+
+      return {
         name: item.name,
         start: data.applyTime ? data.applyTime.split('T')[0] : '', // 浣跨敤璁㈠崟鐢宠鏃堕棿
-        end: endDate, 
+        end: endDate,
         forever: item.period === 0, // 鏈熼檺涓�0鏃惰缃负姘镐箙
         remark: item.remarks || '' // 浣跨敤濂椾欢淇℃伅涓殑remarks瀛楁
       }
@@ -510,7 +660,7 @@
 }
 
 // 琛ㄥご鏂囧瓧灞呬腑锛屼絾绗竴琛岀殑"璇︽儏"鏂囧瓧闈犲乏瀵归綈
-const headerCenterStyle: CSSProperties = { 
+const headerCenterStyle: CSSProperties = {
   textAlign: 'center',
   fontSize: '14px',
   background: '#f3f6fb'
@@ -520,7 +670,7 @@
 const bodyCellStyle: CSSProperties = { fontSize: '12px' }
 
 // 瀹℃壒杩借釜琛ㄦ牸鏍峰紡
-const recordTableHeaderStyle: CSSProperties = { 
+const recordTableHeaderStyle: CSSProperties = {
   textAlign: 'center',
   fontSize: '14px',
   background: '#f3f6fb'
@@ -528,7 +678,7 @@
 const recordTableCellStyle: CSSProperties = { fontSize: '12px' }
 
 // 鏂囦欢鍒楄〃琛ㄦ牸琛ㄥご鏂囧瓧灞呬腑锛屼絾绗竴鍒楃殑"浜ゆ槗鏂囦欢"鏂囧瓧闈犲乏瀵归綈
-const fileTableHeaderStyle: CSSProperties = { 
+const fileTableHeaderStyle: CSSProperties = {
   textAlign: 'center',
   fontSize: '14px',
   background: '#f3f6fb'
@@ -587,23 +737,23 @@
     'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', // .xlsx
     'application/vnd.openxmlformats-officedocument.presentationml.presentation', // .pptx
   ]
-  
+
   // 濡傛灉MIME绫诲瀷鍖归厤锛岀洿鎺ヨ繑鍥瀟rue
   if (previewableTypes.includes(file.type || '')) {
     return true
   }
-  
+
   // 濡傛灉MIME绫诲瀷涓虹┖鎴栦笉鍖归厤锛屾牴鎹枃浠舵墿灞曞悕鍒ゆ柇
   const fileName = file.name || ''
   const fileExtension = fileName.toLowerCase().split('.').pop()
-  
+
   const previewableExtensions = [
     'jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp',
     'txt', 'html', 'htm', 'css', 'js',
     'pdf',
     'docx', 'xlsx', 'pptx'
   ]
-  
+
   return previewableExtensions.includes(fileExtension)
 }
 
@@ -619,13 +769,13 @@
     ElMessage.warning('鏂囦欢閾炬帴涓嶅瓨鍦�')
     return
   }
-  
+
   // 鑾峰彇鏂囦欢鎵╁睍鍚�
   const fileName = file.name || ''
   const fileExtension = fileName.toLowerCase().split('.').pop()
-  
+
   let previewUrl = file.url
-  
+
   // 濡傛灉鏂囦欢瀛樺偍鍦∕inIO锛屼紭鍏堜娇鐢ㄩ瑙圲RL
   if (file.url.includes('order-attachments')) {
     try {
@@ -637,13 +787,14 @@
           fileName: file.url
         }
       })
-      
+
       console.log('棰勮URL鍝嶅簲:', previewResponse)
-      
+
       // 妫�鏌ュ搷搴旀牸寮�
       const responseData = previewResponse as any
       if (responseData && responseData.code === 200 && responseData.data) {
-        previewUrl = responseData.data
+        previewUrl = responseData.data.replaceAll("http://192.168.20.52:9000", import.meta.env.VITE_FILE_PREVIEW_URL)
+        // previewUrl = responseData.data
         console.log('浣跨敤棰勮URL:', previewUrl)
       } else {
         console.log('棰勮URL鑾峰彇澶辫触锛屼娇鐢ㄤ笅杞芥柟寮�')
@@ -657,7 +808,7 @@
             originalName: file.name
           }
         })
-        
+
         // 鍒涘缓棰勮URL
         const blob = new Blob([response as any])
         previewUrl = window.URL.createObjectURL(blob)
@@ -669,30 +820,30 @@
       return
     }
   }
-  
+
   // 鍥剧墖鏂囦欢鐩存帴鍦ㄦ柊绐楀彛鎵撳紑
-  if ((file.type && file.type.startsWith('image/')) || 
+  if ((file.type && file.type.startsWith('image/')) ||
       ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'].includes(fileExtension)) {
     console.log('棰勮鍥剧墖鏂囦欢:', previewUrl)
     window.open(previewUrl, '_blank')
     return
   }
-  
+
   // PDF鏂囦欢鍦ㄦ柊绐楀彛鎵撳紑
   if (file.type === 'application/pdf' || fileExtension === 'pdf') {
     console.log('棰勮PDF鏂囦欢:', previewUrl)
     window.open(previewUrl, '_blank')
     return
   }
-  
+
   // 鏂囨湰鏂囦欢鍦ㄦ柊绐楀彛鎵撳紑
-  if ((file.type && file.type.startsWith('text/')) || 
+  if ((file.type && file.type.startsWith('text/')) ||
       ['txt', 'html', 'htm', 'css', 'js'].includes(fileExtension)) {
     console.log('棰勮鏂囨湰鏂囦欢:', previewUrl)
     window.open(previewUrl, '_blank')
     return
   }
-  
+
   // Office鏂囨。鍜屽叾浠栨枃浠剁被鍨嬶紝灏濊瘯鍦ㄦ柊绐楀彛鎵撳紑
   try {
     console.log('棰勮鍏朵粬鏂囦欢:', previewUrl)
@@ -709,14 +860,14 @@
     ElMessage.warning('鏂囦欢閾炬帴涓嶅瓨鍦�')
     return
   }
-  
+
   console.log('寮�濮嬩笅杞芥枃浠�:', file.name, 'URL:', file.url)
-  
+
   try {
     // 濡傛灉鏂囦欢瀛樺偍鍦∕inIO锛屼娇鐢ㄥ悗绔洿鎺ヤ笅杞紸PI
     if (file.url.includes('order-attachments')) {
       console.log('浣跨敤MinIO涓嬭浇API')
-      
+
       // 浣跨敤axios閫氳繃浠g悊璁块棶鍚庣API
       const response = await createAxios({
         url: `/admin/file/download`,
@@ -727,28 +878,28 @@
           originalName: file.name
         }
       })
-      
+
       console.log('涓嬭浇鍝嶅簲:', response)
-      
+
       // 鍒涘缓涓嬭浇閾炬帴
       const blob = new Blob([response as any])
       const downloadUrl = window.URL.createObjectURL(blob)
-      
+
       console.log('鍒涘缓涓嬭浇閾炬帴:', downloadUrl)
-      
+
       const link = document.createElement('a')
       link.href = downloadUrl
       link.download = file.name || 'download'
       link.target = '_blank'
       link.rel = 'noopener noreferrer'
-      
+
       document.body.appendChild(link)
       link.click()
       document.body.removeChild(link)
-      
+
       // 娓呯悊URL瀵硅薄
       window.URL.revokeObjectURL(downloadUrl)
-      
+
       ElMessage.success('鏂囦欢涓嬭浇鎴愬姛')
     } else {
       console.log('浣跨敤鐩存帴URL涓嬭浇')
@@ -758,11 +909,11 @@
       link.download = file.name || 'download'
       link.target = '_blank'
       link.rel = 'noopener noreferrer'
-      
+
       document.body.appendChild(link)
       link.click()
       document.body.removeChild(link)
-      
+
       ElMessage.success('寮�濮嬩笅杞芥枃浠�')
     }
   } catch (error) {
@@ -955,10 +1106,183 @@
   width: calc(50% - 180px) !important;
 }
 
+/* 璁㈠崟淇℃伅鑷畾涔夊竷灞�鏍峰紡 */
+.order-info-section {
+  border: 1px solid #e4e7ed;
+  border-radius: 4px;
+  margin-top: 10px;
+  overflow: hidden;
+}
+
+.order-info-section .section-header {
+  background: #f3f6fb;
+  padding: 12px 16px;
+  border-bottom: 1px solid #e4e7ed;
+  font-weight: 600;
+  display: flex;
+  align-items: center;
+}
+
+.order-info-section .section-icon {
+  margin-right: 6px;
+  color: #409eff;
+}
+
+.order-info-grid {
+  display: grid;
+  grid-template-columns: 15% 30% 15% 40%;
+  width: 100%;
+}
+
+.order-info-item {
+  display: contents;
+}
+
+.order-info-item .order-label {
+  padding: 12px 16px;
+  background: #fafafa;
+  border: 1px solid #e4e7ed;
+  font-size: 14px;
+  color: #606266;
+  display: flex;
+  align-items: center;
+}
+
+.order-info-item .order-content {
+  padding: 12px 16px;
+  border: 1px solid #e4e7ed;
+  font-size: 14px;
+  color: #303133;
+  display: flex;
+  align-items: center;
+}
+
+/* 鐢宠浜轰俊鎭嚜瀹氫箟甯冨眬鏍峰紡 */
+.applicant-info-section {
+  border: 1px solid #e4e7ed;
+  border-radius: 4px;
+  margin-top: 15px;
+  overflow: hidden;
+}
+
+.applicant-info-section .section-header {
+  background: #f3f6fb;
+  padding: 12px 16px;
+  border-bottom: 1px solid #e4e7ed;
+  font-weight: 600;
+  display: flex;
+  align-items: center;
+}
+
+.applicant-info-section .section-icon {
+  margin-right: 6px;
+  color: #409eff;
+}
+
+.applicant-info-grid {
+  display: grid;
+  grid-template-columns: 15% 30% 15% 40%;
+  width: 100%;
+}
+
+.applicant-info-item {
+  display: contents;
+}
+
+.applicant-info-item .applicant-label {
+  padding: 12px 16px;
+  background: #fafafa;
+  border: 1px solid #e4e7ed;
+  font-size: 14px;
+  color: #606266;
+  display: flex;
+  align-items: center;
+}
+
+.applicant-info-item .applicant-content {
+  padding: 12px 16px;
+  border: 1px solid #e4e7ed;
+  font-size: 14px;
+  color: #303133;
+  display: flex;
+  align-items: center;
+}
+
+/* 浜ゆ槗鍐呭鑷畾涔夊竷灞�鏍峰紡 */
+.transaction-content-section {
+  border: 1px solid #e4e7ed;
+  border-radius: 4px;
+  margin-top: 15px;
+  overflow: hidden;
+}
+
+.transaction-content-section .section-header {
+  background: #f3f6fb;
+  padding: 12px 16px;
+  border-bottom: 1px solid #e4e7ed;
+  font-weight: 600;
+  display: flex;
+  align-items: center;
+}
+
+.transaction-content-section .section-icon {
+  margin-right: 6px;
+  color: #409eff;
+}
+
+.transaction-content-grid {
+  display: grid;
+  grid-template-columns: 15% 30% 15% 40%;
+  width: 100%;
+}
+
+.transaction-content-item {
+  display: contents;
+}
+
+.transaction-content-item .transaction-label {
+  padding: 12px 16px;
+  background: #fafafa;
+  border: 1px solid #e4e7ed;
+  font-size: 14px;
+  color: #606266;
+  display: flex;
+  align-items: center;
+}
+
+.transaction-content-item .transaction-content {
+  padding: 12px 16px;
+  border: 1px solid #e4e7ed;
+  font-size: 14px;
+  color: #303133;
+  display: flex;
+  align-items: center;
+}
+
+
 .desc-wrap {
   white-space: pre-wrap;
   line-height: 22px;
 }
+
+/* 鍗曡鐪佺暐锛堢敤浜庘�滃崟浣嶅伐绋嬧�濓級 */
+.ellipsis-1 {
+  max-height: 22px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+/* 澶氳鐪佺暐锛堢敤浜庘�滀骇鍝佺畝浠嬧�濓紝鍥哄畾涓�3琛岋紝鍙寜闇�璋冩暣锛� */
+.ellipsis-3 {
+  display: -webkit-box;
+  line-clamp: 3;
+  -webkit-line-clamp: 3;
+  -webkit-box-orient: vertical;
+  overflow: hidden;
+}
+
+
 
 /* 瀹℃壒杩借釜鏍囩椤垫牱寮� */
 .approval-tabs {
@@ -1006,13 +1330,17 @@
   text-align: left !important;
 }
 
+/* 澶栭儴瀹℃壒杞ㄨ抗 iframe 鏍峰紡 */
+.iframe-wrap { margin-top: 10px; }
+.workflow-iframe { width: 100%; height: 500px; border: none; border-radius: 6px; }
+
 /* 鏂囦欢鎿嶄綔鎸夐挳鏍峰紡 */
 .file-actions {
   display: flex;
   gap: 8px;
   align-items: center;
   justify-content: center;
-  
+
   .preview-btn {
     color: #409eff;
     &:hover {
@@ -1023,7 +1351,7 @@
       cursor: not-allowed;
     }
   }
-  
+
   .download-btn {
     color: #67c23a;
     &:hover {

--
Gitblit v1.8.0