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/productionPlan/trackProgress/index.vue |  441 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 441 insertions(+), 0 deletions(-)

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

--
Gitblit v1.9.3