| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div> |
| | | <el-dialog v-model="dialogVisible" |
| | | title="æ£éªè¯¦æ
" |
| | | width="1000px" |
| | | @close="closeDialog"> |
| | | <el-card class="detail-card"> |
| | | <template #header> |
| | | <div class="card-header"> |
| | | <span>åºæ¬ä¿¡æ¯</span> |
| | | </div> |
| | | </template> |
| | | <div class="detail-info"> |
| | | <div class="info-row"> |
| | | <div class="info-item"> |
| | | <span class="info-label">æ¥æï¼</span> |
| | | <span class="info-value">{{ dayjs(detailData.createTime) .format('YYYY-MM-DD') }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="info-label">ç产订åå·ï¼</span> |
| | | <span class="info-value">{{ detailData.npsNo }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="info-label">å·¥åºï¼</span> |
| | | <!-- <span class="info-value">{{ detailData.process }}</span> --> |
| | | <el-tag type="primary">{{ detailData.process }}</el-tag> |
| | | </div> |
| | | </div> |
| | | <div class="info-row"> |
| | | <div class="info-item"> |
| | | <span class="info-label">产åç¼ç ï¼</span> |
| | | <span class="info-value">{{ detailData.materialCode }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="info-label">产åç±»åï¼</span> |
| | | <!-- <span class="info-value">{{ detailData.strength }}</span> --> |
| | | <el-tag type="info">{{ detailData.strength }}</el-tag> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="info-label">产ååç§°ï¼</span> |
| | | <span class="info-value">{{ detailData.productName }}</span> |
| | | </div> |
| | | </div> |
| | | <div class="info-row"> |
| | | <div class="info-item"> |
| | | <span class="info-label">è§æ ¼ï¼</span> |
| | | <span class="info-value">{{ detailData.model }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="info-label">çæ¬¡ï¼</span> |
| | | <el-tag :type="detailData.schedule === 'ç½ç' ? 'primary' : 'warning'">{{ detailData.schedule }}</el-tag> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="info-label">å²ä½äººåï¼</span> |
| | | <span class="info-value">{{ detailData.postName }}</span> |
| | | </div> |
| | | </div> |
| | | <div class="info-row"> |
| | | <!-- <div class="info-item"> |
| | | <span class="info-label">æ¥å·¥åå·ï¼</span> |
| | | <span class="info-value">{{ detailData.productionProductRouteItemId }}</span> |
| | | </div> --> |
| | | <div class="info-item"> |
| | | <span class="info-label">äº§åºæ°éï¼</span> |
| | | <span class="info-value"><span style="font-weight: bold;color: #409eff;">{{ detailData.quantity }}</span> æ¹</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="info-label">åæ ¼æ°éï¼</span> |
| | | <span class="info-value"><span style="font-weight: bold;color: #28e431;">{{ detailData.qualifiedQuantity }}</span> æ¹</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="info-label">ä¸åæ ¼æ°éï¼</span> |
| | | <span class="info-value"><span style="font-weight: bold;color: #b43434;">{{ detailData.unqualifiedQuantity }}</span> æ¹</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | | <el-card v-for="group in groupedInspectionData" |
| | | :key="group.sourceSort" |
| | | class="detail-card" |
| | | style="margin-top: 20px;"> |
| | | <template #header> |
| | | <div class="card-header"> |
| | | <span v-if="groupedInspectionData.length > 1">æ£éªææ ç» - {{ group.sourceSort }}</span> |
| | | <span v-else>æ£éªææ </span> |
| | | </div> |
| | | </template> |
| | | <el-table :data="group.items" |
| | | style="width: 100%" |
| | | :row-class-name="rowClassName"> |
| | | <el-table-column prop="paramName" |
| | | label="ææ " /> |
| | | <el-table-column prop="unit" |
| | | label="åä½" |
| | | width="100"> |
| | | <template #default="scope"> |
| | | {{ scope.row.unit || "/" }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="standardText" |
| | | label="æ åå¼" /> |
| | | <el-table-column prop="paramValue" |
| | | label="å®é
å¼" /> |
| | | <el-table-column prop="result" |
| | | label="ç»æ" |
| | | width="100"> |
| | | <template #default="scope"> |
| | | <el-tag :type="scope.row.result === 'åæ ¼' ? 'success' : 'danger'"> |
| | | {{ scope.row.result }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-card> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button @click="closeDialog">å
³é</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, onMounted } from "vue"; |
| | | import { qualityInspectProcessDetails } from "@/api/qualityManagement/rawMaterialInspection.js"; |
| | | import dayjs from "dayjs"; |
| | | |
| | | const emit = defineEmits(["close"]); |
| | | const dialogVisible = ref(false); |
| | | const detailData = ref({}); |
| | | const inspectionData = ref([]); |
| | | const groupedInspectionData = ref([]); |
| | | const loading = ref(false); |
| | | |
| | | const openDialog = row => { |
| | | dialogVisible.value = true; |
| | | detailData.value = { |
| | | ...row, |
| | | createTime: row.createTime |
| | | ? dayjs(row.createTime).format("YYYY-MM-DD HH:mm:ss") |
| | | : "", |
| | | }; |
| | | getInspectionDetails(row.productionProductRouteItemId); |
| | | }; |
| | | |
| | | const getInspectionDetails = id => { |
| | | loading.value = true; |
| | | qualityInspectProcessDetails({ productionProductRouteItemId: id }) |
| | | .then(res => { |
| | | const data = res.data || []; |
| | | // 计ç®ç»æ |
| | | const processedData = data.map(item => { |
| | | let result = "åæ ¼"; |
| | | let standardText = ""; |
| | | if (item.valueMode === 1) { |
| | | // å弿¯è¾ |
| | | if (item.standardValue !== null) { |
| | | standardText = item.standardValue; |
| | | if (item.paramValue !== item.standardValue) { |
| | | result = "ä¸åæ ¼"; |
| | | } |
| | | } else { |
| | | standardText = "-"; |
| | | result = "åæ ¼"; |
| | | } |
| | | } else if (item.valueMode === 2) { |
| | | // åºé´æ¯è¾ |
| | | if (item.minValue !== null || item.maxValue !== null) { |
| | | standardText = |
| | | (item.minValue ? item.minValue : "-â") + |
| | | "~" + |
| | | (item.maxValue ? item.maxValue : "+â"); |
| | | if ( |
| | | item.paramValue < item.minValue || |
| | | item.paramValue > item.maxValue |
| | | ) { |
| | | result = "ä¸åæ ¼"; |
| | | } |
| | | } else { |
| | | standardText = "-"; |
| | | result = "åæ ¼"; |
| | | } |
| | | } |
| | | return { |
| | | ...item, |
| | | standardText, |
| | | result, |
| | | }; |
| | | }); |
| | | |
| | | // æsourceSortåç» |
| | | const grouped = {}; |
| | | processedData.forEach(item => { |
| | | const key = item.sourceSort || "é»è®¤"; |
| | | if (!grouped[key]) { |
| | | grouped[key] = []; |
| | | } |
| | | grouped[key].push(item); |
| | | }); |
| | | |
| | | // 转æ¢ä¸ºæ°ç»æ ¼å¼ |
| | | groupedInspectionData.value = Object.entries(grouped).map( |
| | | ([key, items]) => ({ |
| | | sourceSort: key, |
| | | items, |
| | | }) |
| | | ); |
| | | |
| | | loading.value = false; |
| | | }) |
| | | .catch(err => { |
| | | loading.value = false; |
| | | console.error("è·åæ£éªè¯¦æ
失败:", err); |
| | | }); |
| | | }; |
| | | |
| | | const closeDialog = () => { |
| | | dialogVisible.value = false; |
| | | emit("close"); |
| | | }; |
| | | |
| | | // 为ä¸åæ ¼çè¡æ·»å æ ·å¼ |
| | | const rowClassName = ({ row }) => { |
| | | return row.result == "ä¸åæ ¼" ? "unqualified-row" : ""; |
| | | }; |
| | | |
| | | defineExpose({ |
| | | openDialog, |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .detail-card { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .card-header { |
| | | font-size: 16px; |
| | | font-weight: bold; |
| | | color: #333; |
| | | } |
| | | |
| | | .detail-info { |
| | | padding: 10px 0; |
| | | } |
| | | |
| | | .info-row { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | margin-bottom: 10px; |
| | | } |
| | | |
| | | .info-item { |
| | | width: 33%; |
| | | margin-bottom: 10px; |
| | | } |
| | | |
| | | .info-label { |
| | | display: inline-block; |
| | | width: 100px; |
| | | font-weight: bold; |
| | | color: #666; |
| | | } |
| | | |
| | | .info-value { |
| | | color: #333; |
| | | } |
| | | |
| | | .dialog-footer { |
| | | text-align: center; |
| | | } |
| | | |
| | | :deep(.unqualified-row) { |
| | | background-color: rgba(245, 108, 108, 0.05) !important; |
| | | } |
| | | |
| | | :deep(.unqualified-row .cell) { |
| | | color: #f56c6c !important; |
| | | } |
| | | </style> |