From 429b6e4d00594183bbcf02aba24d2df2d3f4c95b Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期五, 15 五月 2026 17:18:24 +0800
Subject: [PATCH] 协同审批详情功能及修改限制

---
 src/pages/cooperativeOffice/collaborativeApproval/approve.vue |  812 +++++++++++++++++++++++++++++----------------------------
 1 files changed, 410 insertions(+), 402 deletions(-)

diff --git a/src/pages/cooperativeOffice/collaborativeApproval/approve.vue b/src/pages/cooperativeOffice/collaborativeApproval/approve.vue
index aaad83e..b3c8687 100644
--- a/src/pages/cooperativeOffice/collaborativeApproval/approve.vue
+++ b/src/pages/cooperativeOffice/collaborativeApproval/approve.vue
@@ -1,8 +1,7 @@
 <template>
   <view class="approve-page">
-
-    <PageHeader title="瀹℃牳" @back="goBack" />
-
+    <PageHeader title="瀹℃牳"
+                @back="goBack" />
     <!-- 鐢宠淇℃伅 -->
     <view class="application-info">
       <view class="info-header">
@@ -25,7 +24,6 @@
           <text class="info-label">鐢宠鏃ユ湡</text>
           <text class="info-value">{{ approvalData.approveTime }}</text>
         </view>
-        
         <!-- approveType=2 璇峰亣鐩稿叧瀛楁 -->
         <template v-if="approvalData.approveType === 2">
           <view class="info-row">
@@ -37,462 +35,472 @@
             <text class="info-value">{{ approvalData.endDate || '-' }}</text>
           </view>
         </template>
-        
         <!-- approveType=3 鍑哄樊鐩稿叧瀛楁 -->
-        <view v-if="approvalData.approveType === 3" class="info-row">
+        <view v-if="approvalData.approveType === 3"
+              class="info-row">
           <text class="info-label">鍑哄樊鍦扮偣</text>
           <text class="info-value">{{ approvalData.location || '-' }}</text>
         </view>
-        
         <!-- approveType=4 鎶ラ攢鐩稿叧瀛楁 -->
-        <view v-if="approvalData.approveType === 4" class="info-row">
+        <view v-if="approvalData.approveType === 4"
+              class="info-row">
           <text class="info-label">鎶ラ攢閲戦</text>
           <text class="info-value">{{ approvalData.price ? `楼${approvalData.price}` : '-' }}</text>
         </view>
       </view>
     </view>
-
     <!-- 瀹℃壒娴佺▼ -->
     <view class="approval-process">
       <view class="process-header">
         <text class="process-title">瀹℃壒娴佺▼</text>
       </view>
-      
       <view class="process-steps">
-        <view 
-          v-for="(step, index) in approvalSteps" 
-          :key="index" 
-          class="process-step"
-          :class="{
+        <view v-for="(step, index) in approvalSteps"
+              :key="index"
+              class="process-step"
+              :class="{
             'completed': step.status === 'completed',
             'current': step.status === 'current',
             'pending': step.status === 'pending',
             'rejected': step.status === 'rejected'
-          }"
-        >
+          }">
           <view class="step-indicator">
             <view class="step-dot">
-              <text v-if="step.status === 'completed'" class="step-icon">鉁�</text>
-              <text v-else-if="step.status === 'rejected'" class="step-icon">鉁�</text>
-              <text v-else class="step-number">{{ index + 1 }}</text>
+              <text v-if="step.status === 'completed'"
+                    class="step-icon">鉁�</text>
+              <text v-else-if="step.status === 'rejected'"
+                    class="step-icon">鉁�</text>
+              <text v-else
+                    class="step-number">{{ index + 1 }}</text>
             </view>
-            <view v-if="index < approvalSteps.length - 1" class="step-line"></view>
+            <view v-if="index < approvalSteps.length - 1"
+                  class="step-line"></view>
           </view>
-          
           <view class="step-content">
             <view class="step-info">
               <text class="step-title">{{ step.title }}</text>
               <text class="step-approver">{{ step.approverName }}</text>
-              <text v-if="step.approveTime" class="step-time">{{ step.approveTime }}</text>
+              <text v-if="step.approveTime"
+                    class="step-time">{{ step.approveTime }}</text>
             </view>
-            
-            <view v-if="step.opinion" class="step-opinion">
+            <view v-if="step.opinion"
+                  class="step-opinion">
               <text class="opinion-label">瀹℃壒鎰忚锛�</text>
               <text class="opinion-content">{{ step.opinion }}</text>
             </view>
             <!-- 绛惧悕灞曠ず -->
-            <view v-if="step.urlTem" class="step-opinion" style="margin-top:8px;">
+            <view v-if="step.urlTem"
+                  class="step-opinion"
+                  style="margin-top:8px;">
               <text class="opinion-label">绛惧悕锛�</text>
-              <image :src="step.urlTem" mode="widthFix" style="width:180px;border-radius:6px;border:1px solid #eee;" />
+              <image :src="step.urlTem"
+                     mode="widthFix"
+                     style="width:180px;border-radius:6px;border:1px solid #eee;" />
             </view>
           </view>
         </view>
       </view>
     </view>
-
     <!-- 瀹℃牳鎰忚杈撳叆 -->
-    <view v-if="canApprove" class="approval-input">
+    <view v-if="canApprove"
+          class="approval-input">
       <view class="input-header">
         <text class="input-title">瀹℃牳鎰忚</text>
       </view>
-      
       <view class="input-content">
-        <u-textarea
-          v-model="approvalOpinion"
-          rows="4"
-          placeholder="璇疯緭鍏ュ鏍告剰瑙�"
-          maxlength="200"
-          count
-        />
+        <u-textarea v-model="approvalOpinion"
+                    rows="4"
+                    placeholder="璇疯緭鍏ュ鏍告剰瑙�"
+                    maxlength="200"
+                    count />
       </view>
     </view>
-
     <!-- 搴曢儴鎿嶄綔鎸夐挳 -->
-    <view v-if="canApprove" class="footer-actions">
-      <u-button class="reject-btn" @click="handleReject">椹冲洖</u-button>
-      <u-button class="approve-btn" @click="handleApprove">閫氳繃</u-button>
+    <view v-if="canApprove"
+          class="footer-actions">
+      <u-button class="reject-btn"
+                @click="handleReject">椹冲洖</u-button>
+      <u-button class="approve-btn"
+                @click="handleApprove">閫氳繃</u-button>
     </view>
   </view>
 </template>
 
 <script setup>
-import { ref, onMounted, computed } from 'vue'
-import { approveProcessGetInfo, approveProcessDetails, updateApproveNode } from '@/api/collaborativeApproval/approvalProcess'
-import useUserStore from '@/store/modules/user'
-const showToast = (message) => {
-	uni.showToast({
-		title: message,
-		icon: 'none'
-	})
-}
-import PageHeader from "@/components/PageHeader.vue";
+  import { ref, onMounted, computed } from "vue";
+  import {
+    approveProcessGetInfo,
+    approveProcessDetails,
+    updateApproveNode,
+  } from "@/api/collaborativeApproval/approvalProcess";
+  import useUserStore from "@/store/modules/user";
+  const showToast = message => {
+    uni.showToast({
+      title: message,
+      icon: "none",
+    });
+  };
+  import PageHeader from "@/components/PageHeader.vue";
 
-const userStore = useUserStore()
-const approvalData = ref({})
-const approvalSteps = ref([])
-const approvalOpinion = ref('')
-const approveId = ref('')
+  const userStore = useUserStore();
+  const approvalData = ref({});
+  const approvalSteps = ref([]);
+  const approvalOpinion = ref("");
+  const approveId = ref("");
 
-// 浠庤鎯呮帴鍙e瓧娈靛榻� canApprove锛氫粎褰撴湁 isShen 鐨勮妭鐐规椂鍙鎵�
-const canApprove = computed(() => {
-  return approvalSteps.value.some(step => step.isShen === true)
-})
+  // 浠庤鎯呮帴鍙e瓧娈靛榻� canApprove锛氫粎褰撴湁 isShen 鐨勮妭鐐规椂鍙鎵�
+  const canApprove = computed(() => {
+    return approvalSteps.value.some(step => step.isShen === true);
+  });
 
-onMounted(() => {
-  approveId.value = uni.getStorageSync('approveId')
-  if (approveId.value) {
-    loadApprovalData()
-  }
-})
-
-const loadApprovalData = () => {
-  // 鍩烘湰鐢宠淇℃伅
-  approveProcessGetInfo({ id: approveId.value }).then(res => {
-    approvalData.value = res.data || {}
-  })
-  // 瀹℃壒鑺傜偣璇︽儏
-  approveProcessDetails(approveId.value).then(res => {
-    const list = Array.isArray(res.data) ? res.data : []
-    // 淇濆瓨鍘熷鑺傜偣鏁版嵁渚涙彁浜や娇鐢�
-    activities.value = list
-
-    approvalSteps.value = list.map((it, idx) => {
-      // 鑺傜偣鐘舵�佹槧灏勶細1=閫氳繃锛�2=涓嶉�氳繃锛屽惁鍒欑湅鏄惁褰撳墠(isShen)锛屽啀榛樿涓哄緟澶勭悊
-      let status = 'pending'
-      if (it.approveNodeStatus === 1) status = 'completed'
-      else if (it.approveNodeStatus === 2) status = 'rejected'
-      else if (it.isShen) status = 'current'
-      return {
-        title: `绗�${idx + 1}姝ュ鎵筦,
-        approverName: it.approveNodeUser || '鏈煡鐢ㄦ埛',
-        status,
-        approveTime: it.approveTime || null,
-        opinion: it.approveNodeReason || '',
-        urlTem: it.urlTem || '',
-        isShen: !!it.isShen
-      }
-    })
-  })
-}
-
-const goBack = () => {
-  uni.removeStorageSync('approveId');
-  uni.navigateBack()
-}
-
-const submitForm = (status) => {
-  // 鍙�夛細鏍¢獙瀹℃牳鎰忚
-  if (!approvalOpinion.value?.trim()) {
-    showToast('璇疯緭鍏ュ鏍告剰瑙�')
-    return
-  }
-  // 鎵惧埌褰撳墠鍙鎵硅妭鐐�
-  const filteredActivities = activities.value.filter(activity => activity.isShen)
-  if (!filteredActivities.length) {
-    showToast('褰撳墠鏃犲彲瀹℃壒鑺傜偣')
-    return
-  }
-  // 鍐欏叆鐘舵�佸拰鎰忚
-  filteredActivities[0].approveNodeStatus = status
-  filteredActivities[0].approveNodeReason = approvalOpinion.value || ''
-  // 璁$畻鏄惁涓烘渶鍚庝竴姝�
-  const isLast = activities.value.findIndex(a => a.isShen) === activities.value.length - 1
-  // 璋冪敤鍚庣
-  updateApproveNode({ ...filteredActivities[0], isLast }).then(() => {
-    const msg = status === 1 ? '瀹℃壒閫氳繃' : '瀹℃壒宸查┏鍥�'
-    showToast(msg)
-    // 鎻愮ず鍚庤繑鍥炰笂涓�涓〉闈�
-    setTimeout(() => {
-      goBack() // 鍐呴儴鏄� uni.navigateBack()
-    }, 800)
-  })
-}
-
-const handleApprove = () => {
-  uni.showModal({
-    title: '纭鎿嶄綔',
-    content: '纭畾瑕侀�氳繃姝ゅ鎵瑰悧锛�',
-    success: (res) => {
-      if (res.confirm) submitForm(1)
+  onMounted(() => {
+    approveId.value = uni.getStorageSync("approveId");
+    if (approveId.value) {
+      loadApprovalData();
     }
-  })
-}
+  });
 
-const handleReject = () => {
-  uni.showModal({
-    title: '纭鎿嶄綔',
-    content: '纭畾瑕侀┏鍥炴瀹℃壒鍚楋紵',
-    success: (res) => {
-      if (res.confirm) submitForm(2)
+  const loadApprovalData = () => {
+    // 鍩烘湰鐢宠淇℃伅
+    approveProcessGetInfo({ id: approveId.value }).then(res => {
+      approvalData.value = res.data || {};
+    });
+    // 瀹℃壒鑺傜偣璇︽儏
+    approveProcessDetails(approveId.value).then(res => {
+      const list = Array.isArray(res.data) ? res.data : [];
+      // 淇濆瓨鍘熷鑺傜偣鏁版嵁渚涙彁浜や娇鐢�
+      activities.value = list;
+
+      approvalSteps.value = list.map((it, idx) => {
+        // 鑺傜偣鐘舵�佹槧灏勶細1=閫氳繃锛�2=涓嶉�氳繃锛屽惁鍒欑湅鏄惁褰撳墠(isShen)锛屽啀榛樿涓哄緟澶勭悊
+        let status = "pending";
+        if (it.approveNodeStatus === 1) status = "completed";
+        else if (it.approveNodeStatus === 2) status = "rejected";
+        else if (it.isShen) status = "current";
+        return {
+          title: `绗�${idx + 1}姝ュ鎵筦,
+          approverName: it.approveNodeUser || "鏈煡鐢ㄦ埛",
+          status,
+          approveTime: it.approveTime || null,
+          opinion: it.approveNodeReason || "",
+          urlTem: it.urlTem || "",
+          isShen: !!it.isShen,
+        };
+      });
+    });
+  };
+
+  const goBack = () => {
+    uni.removeStorageSync("approveId");
+    uni.navigateBack();
+  };
+
+  const submitForm = status => {
+    // 鍙�夛細鏍¢獙瀹℃牳鎰忚
+    if (!approvalOpinion.value?.trim()) {
+      showToast("璇疯緭鍏ュ鏍告剰瑙�");
+      return;
     }
-  })
-}
-// 鍘熷鑺傜偣鏁版嵁锛堢敤浜庢彁浜ら�昏緫锛�
-const activities = ref([])
+    // 鎵惧埌褰撳墠鍙鎵硅妭鐐�
+    const filteredActivities = activities.value.filter(
+      activity => activity.isShen
+    );
+    if (!filteredActivities.length) {
+      showToast("褰撳墠鏃犲彲瀹℃壒鑺傜偣");
+      return;
+    }
+    // 鍐欏叆鐘舵�佸拰鎰忚
+    filteredActivities[0].approveNodeStatus = status;
+    filteredActivities[0].approveNodeReason = approvalOpinion.value || "";
+    // 璁$畻鏄惁涓烘渶鍚庝竴姝�
+    const isLast =
+      activities.value.findIndex(a => a.isShen) === activities.value.length - 1;
+    // 璋冪敤鍚庣
+    updateApproveNode({ ...filteredActivities[0], isLast }).then(() => {
+      const msg = status === 1 ? "瀹℃壒閫氳繃" : "瀹℃壒宸查┏鍥�";
+      showToast(msg);
+      // 鎻愮ず鍚庤繑鍥炰笂涓�涓〉闈�
+      setTimeout(() => {
+        goBack(); // 鍐呴儴鏄� uni.navigateBack()
+      }, 800);
+    });
+  };
+
+  const handleApprove = () => {
+    uni.showModal({
+      title: "纭鎿嶄綔",
+      content: "纭畾瑕侀�氳繃姝ゅ鎵瑰悧锛�",
+      success: res => {
+        if (res.confirm) submitForm(1);
+      },
+    });
+  };
+
+  const handleReject = () => {
+    uni.showModal({
+      title: "纭鎿嶄綔",
+      content: "纭畾瑕侀┏鍥炴瀹℃壒鍚楋紵",
+      success: res => {
+        if (res.confirm) submitForm(2);
+      },
+    });
+  };
+  // 鍘熷鑺傜偣鏁版嵁锛堢敤浜庢彁浜ら�昏緫锛�
+  const activities = ref([]);
 </script>
 
 <style scoped lang="scss">
-.approve-page {
-  min-height: 100vh;
-  background: #f8f9fa;
-  padding-bottom: 80px;
-}
-
-.header {
-  display: flex;
-  align-items: center;
-  background: #fff;
-  padding: 16px 20px;
-  border-bottom: 1px solid #f0f0f0;
-  position: sticky;
-  top: 0;
-  z-index: 100;
-}
-
-.title {
-  flex: 1;
-  text-align: center;
-  font-size: 18px;
-  font-weight: 600;
-  color: #333;
-}
-
-.application-info {
-  background: #fff;
-  margin: 16px;
-  border-radius: 12px;
-  overflow: hidden;
-}
-
-.info-header {
-  padding: 16px;
-  border-bottom: 1px solid #f0f0f0;
-  background: #f8f9fa;
-}
-
-.info-title {
-  font-size: 16px;
-  font-weight: 600;
-  color: #333;
-}
-
-.info-content {
-  padding: 16px;
-}
-
-.info-row {
-  display: flex;
-  align-items: center;
-  margin-bottom: 12px;
-  
-  &:last-child {
-    margin-bottom: 0;
+  .approve-page {
+    min-height: 100vh;
+    background: #f8f9fa;
+    padding-bottom: 80px;
   }
-}
 
-.info-label {
-  font-size: 14px;
-  color: #666;
-  width: 80px;
-  flex-shrink: 0;
-}
+  .header {
+    display: flex;
+    align-items: center;
+    background: #fff;
+    padding: 16px 20px;
+    border-bottom: 1px solid #f0f0f0;
+    position: sticky;
+    top: 0;
+    z-index: 100;
+  }
 
-.info-value {
-  font-size: 14px;
-  color: #333;
-  flex: 1;
-}
+  .title {
+    flex: 1;
+    text-align: center;
+    font-size: 18px;
+    font-weight: 600;
+    color: #333;
+  }
 
-.approval-process {
-  background: #fff;
-  margin: 16px;
-  border-radius: 12px;
-  overflow: hidden;
-}
+  .application-info {
+    background: #fff;
+    margin: 16px;
+    border-radius: 12px;
+    overflow: hidden;
+  }
 
-.process-header {
-  padding: 16px;
-  border-bottom: 1px solid #f0f0f0;
-  background: #f8f9fa;
-}
+  .info-header {
+    padding: 16px;
+    border-bottom: 1px solid #f0f0f0;
+    background: #f8f9fa;
+  }
 
-.process-title {
-  font-size: 16px;
-  font-weight: 600;
-  color: #333;
-}
+  .info-title {
+    font-size: 16px;
+    font-weight: 600;
+    color: #333;
+  }
 
-.process-steps {
-  padding: 20px;
-}
+  .info-content {
+    padding: 16px;
+  }
 
-.process-step {
-  display: flex;
-  position: relative;
-  margin-bottom: 24px;
-  
-  &:last-child {
-    margin-bottom: 0;
-    
-    .step-line {
-      display: none;
+  .info-row {
+    display: flex;
+    align-items: center;
+    margin-bottom: 12px;
+
+    &:last-child {
+      margin-bottom: 0;
     }
   }
-}
 
-.step-indicator {
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  margin-right: 16px;
-}
+  .info-label {
+    font-size: 14px;
+    color: #666;
+    width: 80px;
+    flex-shrink: 0;
+  }
 
-.step-dot {
-  width: 32px;
-  height: 32px;
-  border-radius: 50%;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  font-size: 14px;
-  font-weight: 600;
-  position: relative;
-  z-index: 2;
-}
+  .info-value {
+    font-size: 14px;
+    color: #333;
+    flex: 1;
+  }
 
-.process-step.completed .step-dot {
-  background: #52c41a;
-  color: #fff;
-}
+  .approval-process {
+    background: #fff;
+    margin: 16px;
+    border-radius: 12px;
+    overflow: hidden;
+  }
 
-.process-step.current .step-dot {
-  background: #1890ff;
-  color: #fff;
-  animation: pulse 2s infinite;
-}
+  .process-header {
+    padding: 16px;
+    border-bottom: 1px solid #f0f0f0;
+    background: #f8f9fa;
+  }
 
-.process-step.pending .step-dot {
-  background: #d9d9d9;
-  color: #999;
-}
+  .process-title {
+    font-size: 16px;
+    font-weight: 600;
+    color: #333;
+  }
 
-.step-line {
-  width: 2px;
-  height: 40px;
-  background: #d9d9d9;
-  margin-top: 8px;
-}
+  .process-steps {
+    padding: 20px;
+  }
 
-.process-step.completed .step-line {
-  background: #52c41a;
-}
+  .process-step {
+    display: flex;
+    position: relative;
+    margin-bottom: 24px;
 
-.process-step.rejected .step-dot {
-  background: #ff4d4f;
-  color: #fff;
-}
-.process-step.rejected .step-line {
-  background: #ff4d4f;
-}
+    &:last-child {
+      margin-bottom: 0;
 
-.step-content {
-  flex: 1;
-  padding-top: 4px;
-}
+      .step-line {
+        display: none;
+      }
+    }
+  }
 
-.step-info {
-  margin-bottom: 8px;
-}
+  .step-indicator {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    margin-right: 16px;
+  }
 
-.step-title {
-  font-size: 16px;
-  font-weight: 600;
-  color: #333;
-  display: block;
-  margin-bottom: 4px;
-}
+  .step-dot {
+    width: 32px;
+    height: 32px;
+    border-radius: 50%;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    font-size: 14px;
+    font-weight: 600;
+    position: relative;
+    z-index: 2;
+  }
 
-.step-approver {
-  font-size: 14px;
-  color: #666;
-  display: block;
-  margin-bottom: 4px;
-}
+  .process-step.completed .step-dot {
+    background: #52c41a;
+    color: #fff;
+  }
 
-.step-time {
-  font-size: 12px;
-  color: #999;
-  display: block;
-}
+  .process-step.current .step-dot {
+    background: #1890ff;
+    color: #fff;
+    animation: pulse 2s infinite;
+  }
 
-.step-opinion {
-  background: #f8f9fa;
-  padding: 12px;
-  border-radius: 8px;
-  border-left: 4px solid #52c41a;
-}
+  .process-step.pending .step-dot {
+    background: #d9d9d9;
+    color: #999;
+  }
 
-.opinion-label {
-  font-size: 12px;
-  color: #666;
-  display: block;
-  margin-bottom: 4px;
-}
+  .step-line {
+    width: 2px;
+    height: 40px;
+    background: #d9d9d9;
+    margin-top: 8px;
+  }
 
-.opinion-content {
-  font-size: 14px;
-  color: #333;
-  line-height: 1.5;
-}
+  .process-step.completed .step-line {
+    background: #52c41a;
+  }
 
-.approval-input {
-  background: #fff;
-  margin: 16px;
-  border-radius: 12px;
-  overflow: hidden;
-}
+  .process-step.rejected .step-dot {
+    background: #ff4d4f;
+    color: #fff;
+  }
+  .process-step.rejected .step-line {
+    background: #ff4d4f;
+  }
 
-.input-header {
-  padding: 16px;
-  border-bottom: 1px solid #f0f0f0;
-  background: #f8f9fa;
-}
+  .step-content {
+    flex: 1;
+    padding-top: 4px;
+  }
 
-.input-title {
-  font-size: 16px;
-  font-weight: 600;
-  color: #333;
-}
+  .step-info {
+    margin-bottom: 8px;
+  }
 
-.input-content {
-  padding: 16px;
-}
+  .step-title {
+    font-size: 16px;
+    font-weight: 600;
+    color: #333;
+    display: block;
+    margin-bottom: 4px;
+  }
 
-.footer-actions {
-  position: fixed;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  background: #fff;
-  display: flex;
-  justify-content: space-around;
-  align-items: center;
-  padding: 16px;
-  box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.1);
-  z-index: 1000;
-}
+  .step-approver {
+    font-size: 14px;
+    color: #666;
+    display: block;
+    margin-bottom: 4px;
+  }
 
-.reject-btn {
+  .step-time {
+    font-size: 12px;
+    color: #999;
+    display: block;
+  }
+
+  .step-opinion {
+    background: #f8f9fa;
+    padding: 12px;
+    border-radius: 8px;
+    border-left: 4px solid #52c41a;
+  }
+
+  .opinion-label {
+    font-size: 12px;
+    color: #666;
+    display: block;
+    margin-bottom: 4px;
+  }
+
+  .opinion-content {
+    font-size: 14px;
+    color: #333;
+    line-height: 1.5;
+  }
+
+  .approval-input {
+    background: #fff;
+    margin: 16px;
+    border-radius: 12px;
+    overflow: hidden;
+  }
+
+  .input-header {
+    padding: 16px;
+    border-bottom: 1px solid #f0f0f0;
+    background: #f8f9fa;
+  }
+
+  .input-title {
+    font-size: 16px;
+    font-weight: 600;
+    color: #333;
+  }
+
+  .input-content {
+    padding: 16px;
+  }
+
+  .footer-actions {
+    position: fixed;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background: #fff;
+    display: flex;
+    justify-content: space-around;
+    align-items: center;
+    padding: 16px;
+    box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.1);
+    z-index: 1000;
+  }
+
+  .reject-btn {
     width: 120px;
     background: #ff4d4f;
     color: #fff;
@@ -503,47 +511,47 @@
     background: #52c41a;
     color: #fff;
   }
-  
+
   /* 閫傞厤u-button鏍峰紡 */
   :deep(.u-button) {
     border-radius: 6px;
   }
 
-@keyframes pulse {
-  0% {
-    box-shadow: 0 0 0 0 rgba(24, 144, 255, 0.7);
+  @keyframes pulse {
+    0% {
+      box-shadow: 0 0 0 0 rgba(24, 144, 255, 0.7);
+    }
+    70% {
+      box-shadow: 0 0 0 10px rgba(24, 144, 255, 0);
+    }
+    100% {
+      box-shadow: 0 0 0 0 rgba(24, 144, 255, 0);
+    }
   }
-  70% {
-    box-shadow: 0 0 0 10px rgba(24, 144, 255, 0);
+  .signature-section {
+    background: #fff;
+    padding: 12px 16px 16px;
+    border-top: 1px solid #f0f0f0;
   }
-  100% {
-    box-shadow: 0 0 0 0 rgba(24, 144, 255, 0);
+  .signature-header {
+    margin-bottom: 8px;
   }
-}
-.signature-section {
-  background: #fff;
-  padding: 12px 16px 16px;
-  border-top: 1px solid #f0f0f0;
-}
-.signature-header {
-  margin-bottom: 8px;
-}
-.signature-title {
-  font-size: 14px;
-  font-weight: 600;
-  color: #333;
-}
-.signature-box {
-  width: 100%;
-  height: 180px;
-  background: #fff;
-  border: 1px dashed #d9d9d9;
-  border-radius: 8px;
-  overflow: hidden;
-}
-.signature-actions {
-  margin-top: 8px;
-  display: flex;
-  justify-content: flex-end;
-}
+  .signature-title {
+    font-size: 14px;
+    font-weight: 600;
+    color: #333;
+  }
+  .signature-box {
+    width: 100%;
+    height: 180px;
+    background: #fff;
+    border: 1px dashed #d9d9d9;
+    border-radius: 8px;
+    overflow: hidden;
+  }
+  .signature-actions {
+    margin-top: 8px;
+    display: flex;
+    justify-content: flex-end;
+  }
 </style>
\ No newline at end of file

--
Gitblit v1.9.3