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/meetSummary/approve.vue |  554 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 554 insertions(+), 0 deletions(-)

diff --git a/src/pages/managementMeetings/meetSummary/approve.vue b/src/pages/managementMeetings/meetSummary/approve.vue
new file mode 100644
index 0000000..f2b8193
--- /dev/null
+++ b/src/pages/managementMeetings/meetSummary/approve.vue
@@ -0,0 +1,554 @@
+<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.description }}</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="approval-input">
+      <view class="input-header">
+        <text class="input-title">浼氳绾</text>
+      </view>
+      <view class="input-content">
+        <Editor v-model:modelValue="minutesContent"
+                :height="300" />
+      </view>
+    </view>
+    <!-- 搴曢儴鎿嶄綔鎸夐挳 -->
+    <view v-if="isEdit"
+          class="footer-actions">
+      <u-button class="approve-btn"
+                @click="handleApprove">鎻愪氦</u-button>
+    </view>
+  </view>
+</template>
+<script setup>
+  import { ref, onMounted, nextTick } from "vue";
+  import { onLoad } from "@dcloudio/uni-app";
+  import {
+    saveMeetingMinutes,
+    getMeetingMinutesByMeetingId,
+  } from "@/api/managementMeetings/meetExamine";
+  import { getToken } from "@/utils/auth";
+  import PageHeader from "@/components/PageHeader.vue";
+  import Editor from "@/components/Editor/index.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;
+    }
+    getMeetingMinutes();
+    console.log(approvalData.value, "approvalData.value");
+  });
+  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 minutesContent = ref("");
+  const minutesContentId = ref("");
+  const getMeetingMinutes = () => {
+    getMeetingMinutesByMeetingId(approvalData.value.id)
+      .then(res => {
+        console.log(res.data, "res.data");
+
+        if (res.data) {
+          minutesContent.value = res.data.content;
+          minutesContentId.value = res.data.id;
+        } else {
+          minutesContent.value = `<h2>${approvalData.value.title}浼氳绾</h2>
+                                                                              <p><strong>浼氳鏃堕棿锛�</strong>${
+                                                                                approvalData
+                                                                                  .value
+                                                                                  .meetingTime
+                                                                              }</p>
+                                                                              <p><strong>浼氳鍦扮偣锛�</strong>${
+                                                                                approvalData
+                                                                                  .value
+                                                                                  .location
+                                                                              }</p>
+                                                                              <p><strong>涓绘寔浜猴細</strong>${
+                                                                                approvalData
+                                                                                  .value
+                                                                                  .host
+                                                                              }</p>
+                                                                              <p><strong>鍙備細浜哄憳锛�</strong></p>
+                                                                              <ol>
+                                                                                ${approvalData.value.participants
+                                                                                  .map(
+                                                                                    p =>
+                                                                                      `<li>${p.name}</li>`
+                                                                                  )
+                                                                                  .join(
+                                                                                    ""
+                                                                                  )}
+                                                                              </ol>
+                                                                              <p><strong>浼氳鍐呭锛�</strong></p>
+                                                                              <ol>
+                                                                                <li>璁涓�锛�
+                                                                                  <ul>
+                                                                                    <li>璁ㄨ鍐呭锛�</li>
+                                                                                    <li>鍐宠浜嬮」锛�</li>
+                                                                                  </ul>
+                                                                                </li>
+                                                                                <li>璁浜岋細
+                                                                                  <ul>
+                                                                                    <li>璁ㄨ鍐呭锛�</li>
+                                                                                    <li>鍐宠浜嬮」锛�</li>
+                                                                                  </ul>
+                                                                                </li>
+                                                                              </ol>
+                                                                              <p><strong>澶囨敞锛�</strong></p>`;
+        }
+      })
+      .catch(error => {
+        console.error("鑾峰彇浼氳绾澶辫触:", error);
+        showToast("鑾峰彇浼氳绾澶辫触锛岃閲嶈瘯");
+      });
+  };
+  const submitForm = status => {
+    console.log(minutesContent.value, "瀵屾枃鏈�");
+    if (!minutesContent.value) {
+      ElMessage.warning("璇疯緭鍏ヤ細璁邯瑕佸唴瀹�");
+      return;
+    }
+
+    // 璋冪敤鍚庣
+    saveMeetingMinutes({
+      id: minutesContentId.value,
+      content: minutesContent.value,
+      meetingId: approvalData.value.id,
+      title: approvalData.value.title,
+    })
+      .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 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;
+  }
+  /* 宸ュ叿鏍忔寜閽牱寮� */
+  :deep(.ql-toolbar.ql-snow .ql-button) {
+    height: 28px;
+    width: 28px;
+    padding: 4px;
+  }
+  :deep(.ql-toolbar.ql-snow .ql-picker-label) {
+    height: 28px;
+    padding: 4px 8px;
+  }
+</style>
\ No newline at end of file

--
Gitblit v1.9.3