From 79871604f3c79e0ee7a15d198ef321b42fe65c24 Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期五, 27 三月 2026 17:54:56 +0800
Subject: [PATCH] 追踪进度页面修改

---
 src/views/qualityManagement/rawMaterialInspection/components/formDia.vue |    2 
 src/views/productionPlan/productionPlan/index.vue                        |  173 --------------
 src/views/productionPlan/trackProgress/index.vue                         |  441 ++++++++++++++++++++++++++++++++++++++++
 vite.config.js                                                           |    2 
 4 files changed, 452 insertions(+), 166 deletions(-)

diff --git a/src/views/productionPlan/productionPlan/index.vue b/src/views/productionPlan/productionPlan/index.vue
index ed7011e..a294890 100644
--- a/src/views/productionPlan/productionPlan/index.vue
+++ b/src/views/productionPlan/productionPlan/index.vue
@@ -187,73 +187,6 @@
         </span>
       </template>
     </el-dialog>
-    <!-- 杩借釜杩涘害寮圭獥 -->
-    <el-dialog v-model="showTrackProgressDialog"
-               destroy-on-close
-               :title="`杩借釜杩涘害 - ${trackProgressForm.materialCode || ''}`"
-               width="600px">
-      <el-form :model="trackProgressForm"
-               label-width="120px">
-        <el-form-item label="鐗╂枡缂栫爜">
-          <el-input v-model="trackProgressForm.materialCode"
-                    disabled />
-        </el-form-item>
-        <el-form-item label="褰撳墠鐘舵��">
-          <el-select v-model="trackProgressForm.currentStatus"
-                     placeholder="璇烽�夋嫨鐘舵��">
-            <el-option label="寰呭鐞�"
-                       value="pending" />
-            <el-option label="杩涜涓�"
-                       value="processing" />
-            <el-option label="宸插畬鎴�"
-                       value="completed" />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="瀹屾垚杩涘害">
-          <el-progress :percentage="trackProgressForm.completionRate"
-                       :status="trackProgressForm.completionRate === 100 ? 'success' : ''" />
-        </el-form-item>
-        <el-form-item label="杩涘害璇︽儏">
-          <el-table :data="trackProgressForm.progressDetails"
-                    border
-                    style="width: 100%">
-            <el-table-column prop="step"
-                             label="姝ラ"
-                             align="center"
-                             width="100" />
-            <el-table-column prop="status"
-                             label="鐘舵��"
-                             align="center"
-                             width="100">
-              <template #default="scope">
-                <el-tag :type="scope.row.status === 'completed' ? 'success' : scope.row.status === 'processing' ? 'warning' : 'info'">
-                  {{ scope.row.status === 'completed' ? '宸插畬鎴�' : scope.row.status === 'processing' ? '杩涜涓�' : '寰呭紑濮�' }}
-                </el-tag>
-              </template>
-            </el-table-column>
-            <el-table-column prop="startTime"
-                             label="寮�濮嬫椂闂�"
-                             align="center"
-                             width="180" />
-            <el-table-column prop="endTime"
-                             label="缁撴潫鏃堕棿"
-                             align="center"
-                             width="180" />
-          </el-table>
-        </el-form-item>
-        <el-form-item label="澶囨敞">
-          <el-input v-model="trackProgressForm.remark"
-                    type="textarea" />
-        </el-form-item>
-      </el-form>
-      <template #footer>
-        <span class="dialog-footer">
-          <el-button @click="showTrackProgressDialog = false">鍏抽棴</el-button>
-          <el-button type="primary"
-                     @click="handleUpdateProgress">鏇存柊杩涘害</el-button>
-        </span>
-      </template>
-    </el-dialog>
     <!-- 瀵煎叆寮圭獥 -->
     <ImportDialog ref="importDialogRef"
                   v-model="importDialogVisible"
@@ -394,6 +327,7 @@
   import ImportDialog from "@/components/Dialog/ImportDialog.vue";
   import { getToken } from "@/utils/auth";
   import { useDict } from "@/utils/dict";
+  import { useRouter } from "vue-router";
   import {
     productionPlanListPage,
     loadProdData,
@@ -411,6 +345,7 @@
   } from "@/api/basicData/newProduct.js";
 
   const { proxy } = getCurrentInstance();
+  const router = useRouter();
 
   const tableColumn = ref([
     {
@@ -666,17 +601,6 @@
     strength: "",
   });
 
-  // 杩借釜杩涘害寮圭獥鎺у埗
-  const showTrackProgressDialog = ref(false);
-  // 杩借釜杩涘害琛ㄥ崟鏁版嵁
-  const trackProgressForm = reactive({
-    materialCode: "",
-    currentStatus: "",
-    completionRate: 0,
-    progressDetails: [],
-    remark: "",
-  });
-
   // 瀵煎叆鐩稿叧
   const importDialogRef = ref(null);
   const importDialogVisible = ref(false);
@@ -744,21 +668,13 @@
 
   // 澶勭悊杩借釜杩涘害鎸夐挳鐐瑰嚮
   const handleTrackProgress = row => {
-    // 璁剧疆琛ㄥ崟鏁版嵁
-    trackProgressForm.materialCode = row.materialCode;
-    trackProgressForm.currentStatus = row.status;
-
-    // 鐢熸垚妯℃嫙杩涘害鏁版嵁
-    trackProgressForm.progressDetails = generateProgressDetails(row.status);
-
-    // 璁$畻瀹屾垚鐜�
-    trackProgressForm.completionRate = calculateCompletionRate(
-      trackProgressForm.progressDetails
-    );
-    trackProgressForm.remark = "";
-
-    // 鎵撳紑寮圭獥
-    showTrackProgressDialog.value = true;
+    // 璺宠浆鍒拌拷韪繘搴﹂〉闈�
+    router.push({
+      path: "/productionPlan/trackProgress",
+      query: {
+        row: encodeURIComponent(JSON.stringify(row)),
+      },
+    });
   };
   const onBlur = value => {
     // 闄愬埗鍥涗綅灏忔暟
@@ -842,77 +758,6 @@
         }
       }
     }
-  };
-
-  // 鐢熸垚妯℃嫙杩涘害璇︽儏鏁版嵁
-  const generateProgressDetails = status => {
-    const details = [
-      {
-        step: "璁″垝纭",
-        status: "completed",
-        startTime: "2026-03-01 09:00:00",
-        endTime: "2026-03-01 10:00:00",
-      },
-      {
-        step: "鐗╂枡鍑嗗",
-        status:
-          status === "completed"
-            ? "completed"
-            : status === "processing"
-            ? "completed"
-            : "pending",
-        startTime:
-          status === "completed" || status === "processing"
-            ? "2026-03-01 10:30:00"
-            : "",
-        endTime:
-          status === "completed" || status === "processing"
-            ? "2026-03-02 16:00:00"
-            : "",
-      },
-      {
-        step: "鐢熶骇鍔犲伐",
-        status:
-          status === "completed"
-            ? "completed"
-            : status === "processing"
-            ? "processing"
-            : "pending",
-        startTime:
-          status === "completed" || status === "processing"
-            ? "2026-03-03 08:00:00"
-            : "",
-        endTime: status === "completed" ? "2026-03-08 17:00:00" : "",
-      },
-      {
-        step: "璐ㄩ噺妫�楠�",
-        status: status === "completed" ? "completed" : "pending",
-        startTime: status === "completed" ? "2026-03-09 09:00:00" : "",
-        endTime: status === "completed" ? "2026-03-09 15:00:00" : "",
-      },
-      {
-        step: "鍏ュ簱",
-        status: status === "completed" ? "completed" : "pending",
-        startTime: status === "completed" ? "2026-03-10 10:00:00" : "",
-        endTime: status === "completed" ? "2026-03-10 11:00:00" : "",
-      },
-    ];
-    return details;
-  };
-
-  // 璁$畻瀹屾垚鐜�
-  const calculateCompletionRate = details => {
-    const completedSteps = details.filter(
-      step => step.status === "completed"
-    ).length;
-    return Math.round((completedSteps / details.length) * 100);
-  };
-
-  // 澶勭悊杩涘害鏇存柊
-  const handleUpdateProgress = () => {
-    // 杩欓噷鍙互娣诲姞鏇存柊杩涘害鐨勯�昏緫
-    ElMessage.success("杩涘害鏇存柊鎴愬姛");
-    showTrackProgressDialog.value = false;
   };
 
   const data = reactive({
diff --git a/src/views/productionPlan/trackProgress/index.vue b/src/views/productionPlan/trackProgress/index.vue
new file mode 100644
index 0000000..bd48010
--- /dev/null
+++ b/src/views/productionPlan/trackProgress/index.vue
@@ -0,0 +1,441 @@
+<template>
+  <div class="app-container">
+    <PageHeader content="鐢熶骇璁″垝杩借釜杩涘害">
+    </PageHeader>
+    <el-card style="height:82vh;overflow:auto;">
+      <template #header>
+        <div class="card-header">
+          <span>鐢宠鍗曠紪鍙� - {{ rowData.applyNo || '' }}</span>
+        </div>
+      </template>
+      <!-- 鍩虹淇℃伅 -->
+      <div class="detail-section">
+        <h3 class="section-title">鍩虹淇℃伅</h3>
+        <el-descriptions :column="3"
+                         border>
+          <el-descriptions-item label="鐢宠鍗曠紪鍙�">{{ rowData.applyNo || '-' }}</el-descriptions-item>
+          <el-descriptions-item label="浜у搧鍚嶇О">{{ rowData.productName || '-' }}</el-descriptions-item>
+          <el-descriptions-item label="浜у搧瑙勬牸">{{ rowData.model || '-' }}</el-descriptions-item>
+          <el-descriptions-item label="鐗╂枡缂栫爜">{{ rowData.materialCode || '-' }}</el-descriptions-item>
+          <el-descriptions-item label="涓嬪彂鏁伴噺">{{ rowData.assignedQuantity || 0 }} <span class="unit">鏂�</span></el-descriptions-item>
+          <el-descriptions-item label="褰撳墠鐘舵��">
+            <el-tag :type="getStatusType(rowData.status)">
+              {{ getStatusText(rowData.status) }}
+            </el-tag>
+          </el-descriptions-item>
+        </el-descriptions>
+      </div>
+      <div class="progress-container">
+        <div class="progress-section">
+          <h3 class="section-title">杩涘害淇℃伅</h3>
+          <div class="progress-item">
+            <div class="progress-label">瀹屾垚杩涘害锛�</div>
+            <div class="progress-content">
+              <el-progress :percentage="trackProgressForm.completionRate"
+                           :color="customColors"
+                           :status="trackProgressForm.completionRate === 100 ? 'success' : ''" />
+            </div>
+          </div>
+          <div class="progress-item">
+            <div class="progress-label">杩涘害璇︽儏锛�</div>
+            <div class="progress-content">
+              <el-table :data="trackProgressForm.progressDetails"
+                        border
+                        style="width: auto; height: 300px">
+                <el-table-column prop="step"
+                                 label="姝ラ锛堢偣鍑绘煡鐪嬭鎯咃級"
+                                 align="center">
+                  <template #default="{ row, $index }">
+                    <el-link v-if="$index!=0"
+                             @click="handleClickStep(row)"
+                             type="primary">{{ row.step }}</el-link>
+                    <span v-else
+                          @click="handleClickStep(row)">{{ row.step }}</span>
+                  </template>
+                </el-table-column>
+                <el-table-column prop="status"
+                                 label="鐘舵��"
+                                 align="center">
+                  <template #default="scope">
+                    <el-tag :type="scope.row.status === 'completed' ? 'success' : scope.row.status === 'processing' ? 'warning' : 'info'">
+                      {{ scope.row.status === 'completed' ? '宸插畬鎴�' : scope.row.status === 'processing' ? '杩涜涓�' : '寰呭紑濮�' }}
+                    </el-tag>
+                  </template>
+                </el-table-column>
+                <el-table-column prop="quantity"
+                                 label="鏁伴噺"
+                                 align="center" />
+                <el-table-column prop="startTime"
+                                 label="鏃堕棿"
+                                 align="center" />
+              </el-table>
+            </div>
+          </div>
+        </div>
+        <div class="progress-section">
+          <h3 class="section-title">璁㈠崟淇℃伅</h3>
+          <div v-for="item in rowData.orderList"
+               :key="item.orderNo"
+               class="order-item">
+            <el-descriptions :column="3"
+                             border>
+              <el-descriptions-item label="璁㈠崟缂栧彿">{{ item.orderNo || '-' }}</el-descriptions-item>
+              <el-descriptions-item label="璁㈠崟鐘舵��">
+                <el-tag :type="getStatusType(item.status)">{{ getStatusText(item.status) }}</el-tag>
+              </el-descriptions-item>
+              <el-descriptions-item label="寮�濮嬫棩鏈�">{{ item.startTime || '-' }}</el-descriptions-item>
+              <el-descriptions-item label="闇�姹傛暟閲�">{{ item.quantity || 0 }} <span class="unit">鏂�</span></el-descriptions-item>
+              <el-descriptions-item label="瀹屾垚鏁伴噺">{{ item.completeQuantity || 0 }} <span class="unit">鏂�</span></el-descriptions-item>
+              <el-descriptions-item label="瀹屾垚杩涘害">
+                <el-progress :percentage="item.completionRate"
+                             :color="customColors(item.completionRate)"
+                             :status="item.completionRate === 100 ? 'success' : ''"
+                             style="width: 120px;" />
+              </el-descriptions-item>
+            </el-descriptions>
+          </div>
+        </div>
+      </div>
+    </el-card>
+  </div>
+</template>
+
+<script setup>
+  import { ref, reactive, onMounted } from "vue";
+  import { ElMessage } from "element-plus";
+  import { useRouter, useRoute } from "vue-router";
+
+  const router = useRouter();
+  const route = useRoute();
+
+  // 璺敱鍙傛暟鏁版嵁
+  const rowData = reactive({});
+
+  // 杩借釜杩涘害琛ㄥ崟鏁版嵁
+  const trackProgressForm = reactive({
+    materialCode: "",
+    currentStatus: "",
+    completionRate: 0,
+    progressDetails: [],
+    remark: "",
+  });
+
+  // 鑾峰彇鐘舵�佺被鍨�
+  const getStatusType = status => {
+    const typeMap = {
+      0: "warning",
+      1: "primary",
+      2: "info",
+    };
+    return typeMap[status] || "info";
+  };
+
+  // 鑾峰彇鐘舵�佹枃鏈�
+  const getStatusText = status => {
+    const statusMap = {
+      0: "寰呬笅鍙�",
+      1: "閮ㄥ垎涓嬪彂",
+      2: "宸蹭笅鍙�",
+    };
+    return statusMap[status] || "";
+  };
+  const customColors = percentage => {
+    if (Number(percentage) < 10) {
+      return "#909399";
+    }
+    if (Number(percentage) < 70) {
+      return "#e6a23c";
+    }
+    return "#67c23a";
+  };
+
+  // 鐢熸垚妯℃嫙杩涘害璇︽儏鏁版嵁
+  const generateProgressDetails = status => {
+    const details = [
+      {
+        step: "璁″垝纭",
+        status: "completed",
+        quantity: 233,
+        startTime: "2026-03-01 09:00:00",
+        endTime: "2026-03-01 10:00:00",
+      },
+      {
+        step: "绗竴娆℃姤宸�",
+        status: "completed",
+        quantity: 233,
+        startTime: "2026-03-01 09:00:00",
+        endTime: "2026-03-01 10:00:00",
+      },
+      {
+        step: "绗簩娆℃姤宸�",
+        status: "completed",
+        quantity: 233,
+        startTime: "2026-03-01 09:00:00",
+        endTime: "2026-03-01 10:00:00",
+      },
+      {
+        step: "绗笁娆℃姤宸�",
+        status: "completed",
+        quantity: 233,
+        startTime: "2026-03-01 09:00:00",
+        endTime: "2026-03-01 10:00:00",
+      },
+      {
+        step: "绗洓娆℃姤宸�",
+        status: "completed",
+        quantity: 233,
+        startTime: "2026-03-01 09:00:00",
+        endTime: "2026-03-01 10:00:00",
+      },
+      {
+        step: "绗簲娆℃姤宸�",
+        status: "completed",
+        quantity: 233,
+        startTime: "2026-03-01 09:00:00",
+        endTime: "2026-03-01 10:00:00",
+      },
+      {
+        step: "绗叚娆℃姤宸�",
+        status: "completed",
+        quantity: 233,
+        startTime: "2026-03-01 09:00:00",
+        endTime: "2026-03-01 10:00:00",
+      },
+      {
+        step: "绗竷娆℃姤宸�",
+        status: "completed",
+        quantity: 233,
+        startTime: "2026-03-01 09:00:00",
+        endTime: "2026-03-01 10:00:00",
+      },
+    ];
+    return details;
+  };
+
+  // 璁$畻瀹屾垚鐜�
+  const calculateCompletionRate = details => {
+    const completedSteps = details.filter(
+      step => step.status === "completed"
+    ).length;
+    return Math.round((completedSteps / details.length) * 100);
+  };
+
+  // 澶勭悊杩涘害鏇存柊
+  const handleUpdateProgress = () => {
+    // 杩欓噷鍙互娣诲姞鏇存柊杩涘害鐨勯�昏緫
+    ElMessage.success("杩涘害鏇存柊鎴愬姛");
+  };
+
+  // 澶勭悊杩斿洖
+  const handleBack = () => {
+    router.push("/productionPlan/productionPlan");
+  };
+
+  // 鐢熸垚妯℃嫙璁㈠崟鏁版嵁
+  const generateOrderList = () => {
+    return [
+      {
+        orderNo: "ORD-2026-001",
+        status: 1,
+        quantity: 233.28,
+        completeQuantity: 14,
+        completionRate: 6,
+        startTime: "2026-03-25",
+      },
+      {
+        orderNo: "ORD-2026-002",
+        status: 2,
+        quantity: 150.5,
+        completeQuantity: 100,
+        completionRate: 67,
+        startTime: "2026-03-20",
+      },
+      {
+        orderNo: "ORD-2026-003",
+        status: 0,
+        quantity: 80.0,
+        completeQuantity: 0,
+        completionRate: 0,
+        startTime: "2026-03-30",
+      },
+    ];
+  };
+
+  // 椤甸潰鍔犺浇鏃惰幏鍙栨暟鎹�
+  onMounted(() => {
+    // 浠庤矾鐢卞弬鏁颁腑鑾峰彇鏁版嵁
+    const data = route.query.row
+      ? JSON.parse(decodeURIComponent(route.query.row))
+      : null;
+    if (data) {
+      // 璧嬪�肩粰rowData
+      Object.assign(rowData, data);
+      // 璧嬪�肩粰琛ㄥ崟鏁版嵁
+      trackProgressForm.materialCode = data.materialCode;
+      trackProgressForm.currentStatus = data.status;
+      trackProgressForm.progressDetails = generateProgressDetails(data.status);
+      trackProgressForm.completionRate = calculateCompletionRate(
+        trackProgressForm.progressDetails
+      );
+      trackProgressForm.remark = "";
+    }
+    // 鐢熸垚妯℃嫙璁㈠崟鏁版嵁
+    rowData.orderList = generateOrderList();
+  });
+</script>
+
+<style scoped>
+  .app-container {
+    padding: 20px;
+    background-color: #f5f7fa;
+    min-height: 100vh;
+  }
+
+  .card-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    padding: 0 10px;
+  }
+
+  .action-buttons {
+    display: flex;
+    justify-content: flex-end;
+    margin-top: 20px;
+    gap: 10px;
+  }
+
+  .detail-section {
+    margin-bottom: 24px;
+    background-color: #ffffff;
+    border-radius: 10px;
+    padding: 24px;
+    box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.08);
+    transition: all 0.3s ease;
+  }
+
+  .detail-section:hover {
+    box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.12);
+  }
+
+  .section-title {
+    font-size: 16px;
+    font-weight: 600;
+    margin-bottom: 20px;
+    color: #1a1a1a;
+    border-bottom: 2px solid #409eff;
+    padding-bottom: 10px;
+    display: flex;
+    align-items: center;
+  }
+
+  .section-title::before {
+    content: "";
+    display: inline-block;
+    width: 4px;
+    height: 16px;
+    background-color: #409eff;
+    margin-right: 8px;
+    border-radius: 2px;
+  }
+
+  .unit {
+    font-size: 12px;
+    color: #909399;
+    margin-left: 4px;
+  }
+
+  :deep(.el-descriptions) {
+    border-radius: 8px;
+    overflow: hidden;
+    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
+  }
+
+  :deep(.el-descriptions__row:nth-child(odd)) {
+    background-color: #f9f9f9;
+  }
+
+  :deep(.el-descriptions__label) {
+    font-weight: 500;
+    color: #606266;
+    background-color: #f5f7fa;
+  }
+
+  :deep(.el-descriptions__content) {
+    color: #303133;
+    font-weight: 500;
+  }
+
+  .progress-container {
+    display: flex;
+    gap: 24px;
+  }
+
+  .progress-section {
+    margin-bottom: 24px;
+    background-color: #ffffff;
+    border-radius: 10px;
+    padding: 24px;
+    box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.08);
+    flex: 1;
+    transition: all 0.3s ease;
+  }
+
+  .progress-section:hover {
+    box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.12);
+  }
+
+  .progress-item {
+    margin-bottom: 24px;
+  }
+
+  .progress-label {
+    font-size: 14px;
+    font-weight: 500;
+    color: #606266;
+    margin-bottom: 12px;
+    display: flex;
+    align-items: center;
+  }
+
+  .progress-content {
+    margin-left: 0;
+  }
+
+  .progress-content .el-table {
+    max-height: 400px;
+    overflow-y: auto;
+    border-radius: 8px;
+    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
+  }
+
+  :deep(.el-table th) {
+    background-color: #f5f7fa !important;
+    font-weight: 600;
+    color: #606266;
+  }
+
+  :deep(.el-table tr:hover) {
+    background-color: #f5f7fa !important;
+  }
+
+  .order-item {
+    margin-bottom: 20px;
+    border-radius: 8px;
+    overflow: hidden;
+    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
+  }
+
+  .order-item:last-child {
+    margin-bottom: 0;
+  }
+
+  :deep(.el-progress-bar__inner) {
+    border-radius: 10px;
+  }
+
+  :deep(.el-tag) {
+    border-radius: 12px;
+    padding: 2px 10px;
+  }
+</style>
\ No newline at end of file
diff --git a/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue b/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
index 2928e42..c5296dc 100644
--- a/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
+++ b/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
@@ -347,7 +347,7 @@
     testStandardOptions.value = [];
     tableData.value = [];
     // 鍏堢‘淇濅骇鍝佹爲宸插姞杞斤紝鍚﹀垯缂栬緫鏃朵骇鍝�/瑙勬牸鍨嬪彿鏃犳硶鍙嶆樉
-    await getProductOptions();
+    // await getProductOptions();
     if (operationType.value === "edit") {
       // 鍏堜繚瀛� testStandardId锛岄伩鍏嶈娓呯┖
       const savedTestStandardId = row.testStandardId;
diff --git a/vite.config.js b/vite.config.js
index 3ddb11c..5e91d64 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -8,7 +8,7 @@
   const { VITE_APP_ENV } = env;
   const baseUrl =
       env.VITE_APP_ENV === "development"
-          ? "http://192.168.1.234:9019"
+          ? "http://192.168.1.107:7003"
           : env.VITE_BASE_API;
   const javaUrl =
       env.VITE_APP_ENV === "development"

--
Gitblit v1.9.3