From 077ab59c700b85efdd057265bf752ad5942395b2 Mon Sep 17 00:00:00 2001
From: ZN <zhang_12370@163.com>
Date: 星期二, 17 三月 2026 17:36:13 +0800
Subject: [PATCH] feat(quality): 新增质量管理模块的API接口和移动端页面

---
 src/pages/qualityManagement/processInspection/detail.vue |  423 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 423 insertions(+), 0 deletions(-)

diff --git a/src/pages/qualityManagement/processInspection/detail.vue b/src/pages/qualityManagement/processInspection/detail.vue
new file mode 100644
index 0000000..6f1ec64
--- /dev/null
+++ b/src/pages/qualityManagement/processInspection/detail.vue
@@ -0,0 +1,423 @@
+<template>
+  <view class="material-inspection-detail">
+    <!-- 浣跨敤閫氱敤椤甸潰澶撮儴缁勪欢 -->
+    <PageHeader title="杩囩▼妫�楠岃鎯�"
+                @back="goBack" />
+    <!-- 璇︽儏鍐呭 -->
+    <view class="detail-section"
+          v-if="detailData">
+      <view class="detail-card">
+        <view class="card-header">
+          <view class="header-icon">
+            <up-icon name="file-text"
+                     size="20"
+                     color="#ffffff"></up-icon>
+          </view>
+          <text class="header-title">{{ detailData.productName || '-' }}</text>
+          <view class="status-tags">
+            <u-tag :type="getTagType(detailData.checkResult)"
+                   size="small"
+                   class="status-tag">
+              {{ detailData.checkResult || '-' }}
+            </u-tag>
+            <u-tag :type="getStateTagType(detailData.inspectState)"
+                   size="small"
+                   class="status-tag">
+              {{ detailData.inspectState ? '宸叉彁浜�' : '鏈彁浜�' }}
+            </u-tag>
+          </view>
+        </view>
+        <up-divider></up-divider>
+        <view class="detail-content">
+          <view class="detail-row">
+            <text class="detail-label">妫�娴嬫棩鏈�</text>
+            <text class="detail-value">{{ formatDateTime(detailData.checkTime) || '-' }}</text>
+          </view>
+          <view class="detail-row">
+            <text class="detail-label">鐢熶骇宸ュ崟鍙�</text>
+            <text class="detail-value">{{ detailData.workOrderNo || '-' }}</text>
+          </view>
+          <view class="detail-row">
+            <text class="detail-label">宸ュ簭</text>
+            <text class="detail-value">{{ detailData.process || '-' }}</text>
+          </view>
+          <view class="detail-row">
+            <text class="detail-label">妫�楠屽憳</text>
+            <text class="detail-value">{{ detailData.checkName || '-' }}</text>
+          </view>
+          <view class="detail-row">
+            <text class="detail-label">浜у搧鍚嶇О</text>
+            <text class="detail-value">{{ detailData.productName || '-' }}</text>
+          </view>
+          <view class="detail-row">
+            <text class="detail-label">瑙勬牸鍨嬪彿</text>
+            <text class="detail-value">{{ detailData.model || '-' }}</text>
+          </view>
+          <view class="detail-row">
+            <text class="detail-label">鍗曚綅</text>
+            <text class="detail-value">{{ detailData.unit || '-' }}</text>
+          </view>
+          <view class="detail-row">
+            <text class="detail-label">鏁伴噺</text>
+            <text class="detail-value">{{ detailData.quantity || 0 }}</text>
+          </view>
+          <view class="detail-row">
+            <text class="detail-label">妫�娴嬪崟浣�</text>
+            <text class="detail-value">{{ detailData.checkCompany || '-' }}</text>
+          </view>
+          <!-- <view class="detail-row">
+            <text class="detail-label">妫�楠屾爣鍑�</text>
+            <text class="detail-value">{{ detailData.testStandardName || '-' }}</text>
+          </view> -->
+        </view>
+      </view>
+      <!-- 妫�楠岄」鐩� -->
+      <view class="detail-card"
+            v-if="inspectionItems.length > 0">
+        <view class="card-header">
+          <view class="header-icon secondary">
+            <up-icon name="list"
+                     size="20"
+                     color="#ffffff"></up-icon>
+          </view>
+          <text class="header-title">妫�楠岄」鐩�</text>
+        </view>
+        <up-divider></up-divider>
+        <view class="inspection-items">
+          <view v-for="(item, index) in inspectionItems"
+                :key="index"
+                class="inspection-item">
+            <text class="item-name">{{ item.parameterItem || '妫�楠岄」鐩�' }}</text>
+            <view class="item-details">
+              <view class="item-detail-row">
+                <text class="item-detail-label">鍗曚綅:</text>
+                <text class="item-detail-value">{{ item.unit || '-' }}</text>
+              </view>
+              <view class="item-detail-row">
+                <text class="item-detail-label">鏍囧噯鍊�:</text>
+                <text class="item-detail-value">{{ item.standardValue || '-' }}</text>
+              </view>
+              <view class="item-detail-row">
+                <text class="item-detail-label">鍐呮帶鍊�:</text>
+                <text class="item-detail-value">{{ item.controlValue || '-' }}</text>
+              </view>
+              <view class="item-detail-row">
+                <text class="item-detail-label">妫�楠屽��:</text>
+                <text class="item-detail-value result"
+                      :class="getResultClass(item.testValue, item.standardValue)">
+                  {{ item.testValue || '-' }}
+                </text>
+              </view>
+            </view>
+          </view>
+        </view>
+      </view>
+      <!-- 鎿嶄綔鎸夐挳 -->
+      <!-- <view class="action-buttons">
+        <u-button type="primary"
+                  class="action-btn"
+                  @click="downloadReport">
+          涓嬭浇鎶ュ憡
+        </u-button>
+      </view> -->
+    </view>
+    <view v-else
+          class="no-data">
+      <up-empty mode="data"
+                text="鏆傛棤妫�楠岃鎯�"></up-empty>
+    </view>
+  </view>
+</template>
+
+<script setup>
+  import { ref, onMounted } from "vue";
+  import { onShow } from "@dcloudio/uni-app";
+  import PageHeader from "@/components/PageHeader.vue";
+  import dayjs from "dayjs";
+  import { qualityInspectParamInfo } from "@/api/qualityManagement/materialInspection.js";
+
+  // 鏄剧ず鎻愮ず淇℃伅
+  const showToast = message => {
+    uni.showToast({
+      title: message,
+      icon: "none",
+    });
+  };
+
+  // 璇︽儏鏁版嵁
+  const detailData = ref(null);
+  // 妫�楠岄」鐩�
+  const inspectionItems = ref([]);
+
+  // 杩斿洖涓婁竴椤�
+  const goBack = () => {
+    uni.navigateBack();
+  };
+
+  // 鏍煎紡鍖栨棩鏈熸椂闂�
+  const formatDateTime = date => {
+    if (!date) return "";
+    return dayjs(date).format("YYYY-MM-DD");
+  };
+
+  // 鑾峰彇鏍囩绫诲瀷
+  const getTagType = result => {
+    switch (result) {
+      case "鍚堟牸":
+        return "success";
+      case "涓嶅悎鏍�":
+        return "error";
+      default:
+        return "info";
+    }
+  };
+
+  // 鑾峰彇鐘舵�佹爣绛剧被鍨�
+  const getStateTagType = state => {
+    return state ? "success" : "warning";
+  };
+
+  // 鑾峰彇缁撴灉鏍峰紡
+  const getResultClass = (testValue, standardValue) => {
+    // 绠�鍗曠殑缁撴灉鍒ゆ柇閫昏緫锛屽疄闄呴」鐩腑鍙兘闇�瑕佹洿澶嶆潅鐨勫垽鏂�
+    if (testValue === "鍚堟牸") {
+      return "result-passed";
+    } else if (testValue === "涓嶅悎鏍�") {
+      return "result-rejected";
+    }
+    return "";
+  };
+
+  // 涓嬭浇鎶ュ憡
+  const downloadReport = () => {
+    uni.showToast({
+      title: "鎶ュ憡涓嬭浇涓�...",
+      icon: "loading",
+    });
+
+    // 妯℃嫙涓嬭浇
+    setTimeout(() => {
+      uni.showToast({
+        title: "鎶ュ憡涓嬭浇鎴愬姛",
+        icon: "success",
+      });
+    }, 1500);
+  };
+
+  // 鑾峰彇椤甸潰ID
+  const getPageId = () => {
+    const pages = getCurrentPages();
+    const currentPage = pages[pages.length - 1];
+    return currentPage.options.id;
+  };
+
+  // 鑾峰彇璇︽儏鏁版嵁
+  const getDetail = () => {
+    const id = getPageId();
+    if (!id) {
+      showToast("鍙傛暟閿欒");
+      return;
+    }
+
+    // 浠庢湰鍦板瓨鍌ㄨ幏鍙栬鎯呮暟鎹�
+    try {
+      const detailDataFromStorage = uni.getStorageSync(
+        "processInspectionEditData"
+      );
+      if (detailDataFromStorage) {
+        detailData.value = detailDataFromStorage;
+        // 浣跨敤qualityInspectParamInfo鑾峰彇妫�楠岄」鐩�
+        qualityInspectParamInfo(id)
+          .then(res => {
+            if (res.data && res.data.length > 0) {
+              inspectionItems.value = res.data;
+            } else if (
+              detailDataFromStorage.qualityInspectParams &&
+              detailDataFromStorage.qualityInspectParams.length > 0
+            ) {
+              // 濡傛灉鎺ュ彛娌℃湁杩斿洖鏁版嵁锛屼娇鐢ㄦ湰鍦板瓨鍌ㄤ腑鐨勬暟鎹�
+              inspectionItems.value = detailDataFromStorage.qualityInspectParams;
+            }
+          })
+          .catch(error => {
+            console.error("鑾峰彇妫�楠岄」鐩け璐�:", error);
+            // 鎺ュ彛璋冪敤澶辫触鏃讹紝浣跨敤鏈湴瀛樺偍涓殑鏁版嵁鎴栨ā鎷熸暟鎹�
+            if (
+              detailDataFromStorage.qualityInspectParams &&
+              detailDataFromStorage.qualityInspectParams.length > 0
+            ) {
+              inspectionItems.value = detailDataFromStorage.qualityInspectParams;
+            }
+          });
+      }
+    } catch (error) {
+      console.error("鍔犺浇璇︽儏鏁版嵁澶辫触:", error);
+      showToast("鍔犺浇璇︽儏鏁版嵁澶辫触锛岃閲嶈瘯");
+    }
+  };
+
+  onShow(() => {
+    getDetail();
+  });
+
+  onMounted(() => {
+    getDetail();
+  });
+</script>
+
+<style scoped lang="scss">
+  .material-inspection-detail {
+    min-height: 100vh;
+    background: #f5f5f5;
+    padding-bottom: 20px;
+  }
+
+  .detail-section {
+    padding: 15px;
+  }
+
+  .detail-card {
+    background: #fff;
+    border-radius: 12px;
+    padding: 16px;
+    margin-bottom: 12px;
+    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
+  }
+
+  .card-header {
+    display: flex;
+    align-items: center;
+    margin-bottom: 12px;
+  }
+
+  .header-icon {
+    width: 40px;
+    height: 40px;
+    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+    border-radius: 8px;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    margin-right: 12px;
+  }
+
+  .header-icon.secondary {
+    background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
+  }
+
+  .header-icon.tertiary {
+    background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
+  }
+
+  .header-title {
+    flex: 1;
+    font-size: 16px;
+    font-weight: 600;
+    color: #333;
+  }
+
+  .status-tag {
+    margin-left: 20rpx;
+  }
+
+  .detail-content {
+    padding-top: 8px;
+  }
+
+  .detail-row {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    padding: 10px 0;
+    border-bottom: 1px solid #f0f0f0;
+  }
+
+  .detail-row:last-child {
+    border-bottom: none;
+  }
+
+  .detail-label {
+    font-size: 14px;
+    color: #666;
+    min-width: 100px;
+  }
+
+  .detail-value {
+    font-size: 14px;
+    color: #333;
+    text-align: right;
+    flex: 1;
+  }
+
+  // 妫�楠岄」鐩�
+  .inspection-items {
+    padding-top: 8px;
+  }
+
+  .inspection-item {
+    padding: 12px;
+    background: #f8f9fa;
+    border-radius: 8px;
+    margin-bottom: 10px;
+  }
+
+  .inspection-item:last-child {
+    margin-bottom: 0;
+  }
+
+  .item-name {
+    display: block;
+    font-size: 14px;
+    font-weight: 500;
+    color: #333;
+    margin-bottom: 8px;
+    padding-bottom: 8px;
+    border-bottom: 1px solid #f0f0f0;
+  }
+
+  .item-details {
+    padding-top: 8px;
+  }
+
+  .item-detail-row {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 6px;
+  }
+
+  .item-detail-row:last-child {
+    margin-bottom: 0;
+  }
+
+  .item-detail-label {
+    font-size: 12px;
+    color: #666;
+    min-width: 60px;
+  }
+
+  .item-detail-value {
+    font-size: 12px;
+    color: #333;
+    text-align: right;
+    flex: 1;
+  }
+
+  .item-detail-value.result {
+    font-weight: 500;
+  }
+
+  .result-passed {
+    color: #67c23a;
+  }
+
+  .result-rejected {
+    color: #f56c6c;
+  }
+
+  // 绌虹姸鎬�
+  .no-data {
+    padding: 60px 20px;
+    text-align: center;
+  }
+</style>

--
Gitblit v1.9.3