From 0c357e90050d9d461c6ab0d85e1b9c2bac2f6f55 Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期一, 19 一月 2026 17:50:36 +0800
Subject: [PATCH] Merge branch 'dev_new' of http://114.132.189.42:9002/r/product-inventory-APP-before into dev_new

---
 src/pages/managementMeetings/meetExamine/approve.vue |  470 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 470 insertions(+), 0 deletions(-)

diff --git a/src/pages/managementMeetings/meetExamine/approve.vue b/src/pages/managementMeetings/meetExamine/approve.vue
new file mode 100644
index 0000000..3ef296d
--- /dev/null
+++ b/src/pages/managementMeetings/meetExamine/approve.vue
@@ -0,0 +1,470 @@
+<template>
+  <view class="approve-page">
+    <PageHeader title="瀹℃壒"
+                @back="goBack" />
+    <!-- 鐢宠淇℃伅 -->
+    <view class="application-info">
+      <view class="info-header">
+        <text class="info-title">浼氳淇℃伅</text>
+      </view>
+      <view class="info-content">
+        <view class="info-row">
+          <text class="info-label">浼氳涓婚</text>
+          <text class="info-value">{{ approvalData.title }}</text>
+        </view>
+        <view class="info-row">
+          <text class="info-label">鐢宠浜�</text>
+          <text class="info-value">{{ approvalData.applicant }}</text>
+        </view>
+        <view class="info-row">
+          <text class="info-label">涓荤悊浜�</text>
+          <text class="info-value">{{ approvalData.host }}</text>
+        </view>
+        <view class="info-row">
+          <text class="info-label">浼氳鏃堕棿</text>
+          <text class="info-value">{{ formatDateTime(approvalData.meetingTime) }}</text>
+        </view>
+        <view class="info-row">
+          <text class="info-label">浼氳鍦扮偣</text>
+          <text class="info-value">{{ approvalData.location }}</text>
+        </view>
+        <view class="info-row">
+          <text class="info-label">瀹℃壒鐘舵��</text>
+          <text class="info-value tag"
+                :class="getTagClass(approvalData.approveNodeStatus)">
+            {{ formatReceiptType(approvalData.approveNodeStatus) }}
+          </text>
+        </view>
+        <view class="info-row">
+          <text class="info-label">鍙備細浜烘暟</text>
+          <text class="info-value">{{ approvalData.participants.length }}</text>
+        </view>
+        <view class="info-row">
+          <text class="info-label">鍙備細浜哄憳</text>
+          <text class="info-value">{{ approvalData.participants.map(it => it.name).join("銆�") }}</text>
+        </view>
+      </view>
+    </view>
+    <!-- 搴曢儴鎿嶄綔鎸夐挳 -->
+    <view v-if="isEdit"
+          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 { onLoad } from "@dcloudio/uni-app";
+  import { saveMeetingApplication } from "@/api/managementMeetings/meetExamine";
+  const showToast = message => {
+    uni.showToast({
+      title: message,
+      icon: "none",
+    });
+  };
+  import PageHeader from "@/components/PageHeader.vue";
+
+  const approvalData = ref({});
+  const approvalSteps = ref([]);
+  const isEdit = ref(false);
+
+  onLoad(options => {
+    console.log(options, "options");
+    if (options.item) {
+      approvalData.value = JSON.parse(options.item);
+    }
+    if (options.edit) {
+      isEdit.value = options.edit === "true" ? true : false;
+    }
+  });
+
+  const goBack = () => {
+    uni.removeStorageSync("approveId");
+    uni.navigateBack();
+  };
+  const formatDateTime = dateTime => {
+    if (!dateTime) return "";
+    return dateTime.replace(" ", "\n");
+  };
+
+  // 鏍煎紡鍖栧洖娆炬柟寮�
+  const formatReceiptType = params => {
+    if (params == 0) {
+      return "寰呭鏍�";
+    } else if (params == 1) {
+      return "宸查�氳繃";
+    } else if (params == 2) {
+      return "鏈�氳繃";
+    } else if (params == 3) {
+      return "宸插彇娑�";
+    } else {
+      return "鏈煡";
+    }
+  };
+  // 鑾峰彇鏍囩鏍峰紡绫�
+  const getTagClass = type => {
+    if (type == 0) {
+      return "info";
+    } else if (type == 1) {
+      return "success";
+    } else if (type == 2) {
+      return "warning";
+    } else if (type == 3) {
+      return "danger";
+    } else {
+      return "info";
+    }
+  };
+  const submitForm = status => {
+    // 璋冪敤鍚庣
+    saveMeetingApplication({ id: approvalData.value.id, status: status })
+      .then(res => {
+        if (res.code === 200) {
+          showToast("瀹℃壒鎻愪氦鎴愬姛");
+          // 鎻愮ず鍚庤繑鍥炰笂涓�涓〉闈�
+          setTimeout(() => {
+            goBack(); // 鍐呴儴鏄� uni.navigateBack()
+          }, 800);
+        } else {
+          showToast(res.message || "瀹℃壒鎿嶄綔澶辫触锛岃閲嶈瘯");
+        }
+      })
+      .catch(error => {
+        console.error("瀹℃壒鎿嶄綔澶辫触:", error);
+        showToast("瀹℃壒鎿嶄綔澶辫触锛岃閲嶈瘯");
+      });
+  };
+
+  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;
+    }
+  }
+
+  .info-label {
+    font-size: 14px;
+    color: #666;
+    width: 80px;
+    flex-shrink: 0;
+  }
+
+  .info-value {
+    font-size: 14px;
+    color: #333;
+    flex: 1;
+  }
+
+  .approval-process {
+    background: #fff;
+    margin: 16px;
+    border-radius: 12px;
+    overflow: hidden;
+  }
+
+  .process-header {
+    padding: 16px;
+    border-bottom: 1px solid #f0f0f0;
+    background: #f8f9fa;
+  }
+
+  .process-title {
+    font-size: 16px;
+    font-weight: 600;
+    color: #333;
+  }
+
+  .process-steps {
+    padding: 20px;
+  }
+
+  .process-step {
+    display: flex;
+    position: relative;
+    margin-bottom: 24px;
+
+    &:last-child {
+      margin-bottom: 0;
+
+      .step-line {
+        display: none;
+      }
+    }
+  }
+
+  .step-indicator {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    margin-right: 16px;
+  }
+
+  .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;
+  }
+
+  .process-step.completed .step-dot {
+    background: #52c41a;
+    color: #fff;
+  }
+
+  .process-step.current .step-dot {
+    background: #1890ff;
+    color: #fff;
+    animation: pulse 2s infinite;
+  }
+
+  .process-step.pending .step-dot {
+    background: #d9d9d9;
+    color: #999;
+  }
+
+  .step-line {
+    width: 2px;
+    height: 40px;
+    background: #d9d9d9;
+    margin-top: 8px;
+  }
+
+  .process-step.completed .step-line {
+    background: #52c41a;
+  }
+
+  .process-step.rejected .step-dot {
+    background: #ff4d4f;
+    color: #fff;
+  }
+  .process-step.rejected .step-line {
+    background: #ff4d4f;
+  }
+
+  .step-content {
+    flex: 1;
+    padding-top: 4px;
+  }
+
+  .step-info {
+    margin-bottom: 8px;
+  }
+
+  .step-title {
+    font-size: 16px;
+    font-weight: 600;
+    color: #333;
+    display: block;
+    margin-bottom: 4px;
+  }
+
+  .step-approver {
+    font-size: 14px;
+    color: #666;
+    display: block;
+    margin-bottom: 4px;
+  }
+
+  .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;
+  }
+
+  .approve-btn {
+    width: 120px;
+    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);
+    }
+    70% {
+      box-shadow: 0 0 0 10px rgba(24, 144, 255, 0);
+    }
+    100% {
+      box-shadow: 0 0 0 0 rgba(24, 144, 255, 0);
+    }
+  }
+  .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;
+  }
+</style>
\ No newline at end of file

--
Gitblit v1.9.3