| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-card style="height:82vh;overflow:auto;"> |
| | | <template #header> |
| | | <div class="card-header"> |
| | | <el-form :inline="true" |
| | | :model="searchForm" |
| | | class="search-form"> |
| | | <el-form-item label="ç产订åå·"> |
| | | <el-select v-model="selectedNpsNo" |
| | | filterable |
| | | remote |
| | | reserve-keyword |
| | | placeholder="请è¾å
¥ç产订åå·" |
| | | :loading="npsNoLoading" |
| | | :remote-method="handleNpsNoSearch" |
| | | @change="handleSearch" |
| | | style="width: 400px;"> |
| | | <el-option v-for="option in npsNoOptions" |
| | | :key="option.id" |
| | | :label="option.npsNo + '-' + option.productName + '-' + option.model" |
| | | :value="option.id" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button @click="handleBack">è¿å</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </template> |
| | | <!-- åºç¡ä¿¡æ¯ --> |
| | | <div v-if="rowData.productionOrderDto" |
| | | class="detail-section"> |
| | | <h3 class="section-title">åºç¡ä¿¡æ¯</h3> |
| | | <el-descriptions :column="3" |
| | | border> |
| | | <el-descriptions-item label="ç产订åå·">{{ rowData.productionOrderDto?.npsNo || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="产ååç§°">{{ rowData.productionOrderDto?.productName || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="产åè§æ ¼">{{ rowData.productionOrderDto?.model || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="ç©æç¼ç ">{{ rowData.productionOrderDto?.materialCode || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="è®¡åæ°é">{{ rowData.productionOrderDto?.quantity || 0 }} <span class="unit">{{ rowData.productionOrderDto?.unit || '-' }}</span></el-descriptions-item> |
| | | <el-descriptions-item label="å½åç¶æ"> |
| | | <el-tag :type="getStatusType(rowData.productionOrderDto?.status)"> |
| | | {{ getStatusText(rowData.productionOrderDto?.status) }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="客æ·åç§°">{{ rowData.productionOrderDto?.customerName || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="å¼å§æ¥æ">{{ rowData.productionOrderDto?.startTime || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="宿è¿åº¦"> |
| | | <el-progress :percentage="rowData.productionOrderDto?.completionStatus" |
| | | :color="customColors(rowData.productionOrderDto?.completionStatus)" |
| | | :status="rowData.productionOrderDto?.completionStatus === 100 ? 'success' : ''" |
| | | style="width: 120px;" /> |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | </div> |
| | | <el-empty v-else |
| | | description="请æç´¢ç产订åå·" /> |
| | | <!-- ç产æ¥å·¥è®°å½ --> |
| | | <div v-if="rowData.productionRecords && rowData.productionRecords.length > 0" |
| | | class="progress-container"> |
| | | <div class="progress-section"> |
| | | <h3 class="section-title">å·¥åä¿¡æ¯</h3> |
| | | <div class="order-item"> |
| | | <el-table :data="rowData.productionRecords" |
| | | border |
| | | style="width: 100%"> |
| | | <el-table-column prop="productNo" |
| | | label="å·¥åç¼å·" |
| | | align="center"> |
| | | </el-table-column> |
| | | <el-table-column prop="productName" |
| | | label="产ååç§°" |
| | | align="center" /> |
| | | <el-table-column prop="model" |
| | | label="è§æ ¼" |
| | | align="center" /> |
| | | <el-table-column prop="processName" |
| | | label="å·¥åºåç§°" |
| | | align="center" /> |
| | | <el-table-column prop="requiredQuantity" |
| | | label="éæ±æ°é" |
| | | align="center" /> |
| | | <el-table-column prop="completedQuantity" |
| | | label="宿æ°é" |
| | | align="center" /> |
| | | <el-table-column label="详æ
" |
| | | align="center" |
| | | width="200"> |
| | | <template #default="{ row }"> |
| | | <el-link @click="handleClickStep(row)" |
| | | type="primary">æ¥å·¥è®°å½</el-link> |
| | | <el-link @click="handleClickQuality(row)" |
| | | style="margin-left:20px" |
| | | type="primary">è´¨æ£ä¿¡æ¯</el-link> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <el-empty v-else-if="rowData.productionOrderDto" |
| | | description="ææ æ¥å·¥è®°å½" /> |
| | | </el-card> |
| | | <!-- ç产æ¥å·¥è¯¦æ
å¼¹çª --> |
| | | <el-dialog v-model="detailDialogVisible" |
| | | title="ç产æ¥å·¥è¯¦æ
" |
| | | width="1000px" |
| | | :close-on-click-modal="false" |
| | | custom-class="custom-dialog"> |
| | | <div class="detail-container"> |
| | | <!-- åºç¡ä¿¡æ¯ --> |
| | | <div class="detail-section"> |
| | | <h3 class="section-title">åºç¡ä¿¡æ¯</h3> |
| | | <el-descriptions :column="3" |
| | | border> |
| | | <el-descriptions-item label="ç产工åå·">{{ detailData.npsNo || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="çç»"> |
| | | <el-tag :type="detailData.schedule === 'ç½ç' ? 'primary' : 'warning'">{{ detailData.schedule || '-' }}</el-tag> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="产åç¼ç ">{{ detailData.materialCode || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="产ååç§°">{{ detailData.productName || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="è§æ ¼">{{ detailData.model || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="åæ ¼æ°é"><span class="num2">{{ detailData.qualifiedQuantity || 0 }}</span> <span class="unit">{{ detailData.unit || '-' }}</span></el-descriptions-item> |
| | | <el-descriptions-item label="ä¸åæ ¼æ°é"><span class="num3">{{ detailData.unqualifiedQuantity || 0 }}</span> <span class="unit">{{ detailData.unit || '-' }}</span></el-descriptions-item> |
| | | <el-descriptions-item label="æ»æ°é"><span class="num1">{{ detailData.quantity || 0 }}</span> <span class="unit">{{ detailData.unit || '-' }}</span></el-descriptions-item> |
| | | <el-descriptions-item label="å¼å§æ¶é´">{{ detailData.reportingTime || '-' }}</el-descriptions-item> |
| | | </el-descriptions> |
| | | </div> |
| | | <div class="detail-section"> |
| | | <h3 class="section-title">æ¥å·¥æç»</h3> |
| | | <el-table :data="[detailData]" |
| | | border |
| | | style="width: 100%"> |
| | | <el-table-column label="æ¥å·¥åå·" |
| | | prop="productNo" |
| | | align="center" /> |
| | | <el-table-column label="äº§åºæ°é" |
| | | prop="qualifiedQuantity" |
| | | align="center" /> |
| | | <el-table-column label="æ¥åºæ°é" |
| | | prop="unqualifiedQuantity" |
| | | align="center" /> |
| | | <el-table-column label="å建æ¶é´" |
| | | prop="reportingTime" |
| | | align="center" /> |
| | | <el-table-column label="æä½" |
| | | align="center" |
| | | width="200"> |
| | | <template #default="{ row }"> |
| | | <el-button type="primary" |
| | | link |
| | | @click="showInput(row.id)">æ¥çæå
¥</el-button> |
| | | <el-button type="primary" |
| | | link |
| | | @click="showParamDetail(row.productionOperationParamList)">åæ°è¯¦æ
</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </div> |
| | | </div> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button @click="detailDialogVisible = false">å
³é</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | <!-- æå
¥æ¨¡ææ¡ --> |
| | | <input-modal v-if="isShowInput" |
| | | v-model:visible="isShowInput" |
| | | :production-product-main-id="isShowingId" /> |
| | | <!-- åæ°è¯¦æ
å¼¹çª --> |
| | | <el-dialog v-model="paramDetailVisible" |
| | | title="åæ°è¯¦æ
" |
| | | width="600px"> |
| | | <div v-if="currentParams && currentParams.length > 0" |
| | | class="param-detail-list"> |
| | | <el-descriptions :column="1" |
| | | border> |
| | | <el-descriptions-item v-for="param in currentParams" |
| | | :key="param.id" |
| | | :label="param.paramName"> |
| | | {{ param.inputValue }} |
| | | <span v-if="param.unit && param.unit !== '/'" |
| | | class="unit-text">({{ param.unit }})</span> |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | </div> |
| | | <el-empty v-else |
| | | description="ææ åæ°æ°æ®" /> |
| | | <template #footer> |
| | | <span class="dialog-footer"> |
| | | <el-button @click="paramDetailVisible = false">å
³é</el-button> |
| | | </span> |
| | | </template> |
| | | </el-dialog> |
| | | <!-- è´¨æ£ä¿¡æ¯å¼¹çª --> |
| | | <el-dialog v-model="qualityDialogVisible" |
| | | title="è´¨æ£è¯¦æ
" |
| | | width="1000px" |
| | | :close-on-click-modal="false" |
| | | custom-class="custom-dialog"> |
| | | <div class="detail-container"> |
| | | <div v-for="(record, index) in qualityRecords" |
| | | :key="record.id" |
| | | class="quality-record-block"> |
| | | <div class="detail-section"> |
| | | <h3 class="section-title">æ£æµè®°å½ {{ index + 1 }} - {{ record.checkTime }}</h3> |
| | | <el-descriptions :column="3" |
| | | border> |
| | | <el-descriptions-item label="æ£æµæ¥æ">{{ record.checkTime || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="ç产工åå·">{{ record.workOrderNo || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="å·¥åº">{{ record.process || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ£éªå">{{ record.checkName || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="产ååç§°">{{ record.productName || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="è§æ ¼åå·">{{ record.model || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ°é">{{ record.quantity || 0 }} {{ record.unit || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ£æµåä½">{{ record.checkCompany || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ£æµç»æ"> |
| | | <el-tag :type="record.checkResult === 'åæ ¼' ? 'success' : 'danger'"> |
| | | {{ record.checkResult || '-' }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | <h4 class="sub-section-title">æ£éªææ å表</h4> |
| | | <el-table :data="record.inspectItems" |
| | | border |
| | | style="width: 100%"> |
| | | <el-table-column label="åºå·" |
| | | type="index" |
| | | width="60" |
| | | align="center" /> |
| | | <el-table-column label="ææ " |
| | | prop="itemName" |
| | | align="center" /> |
| | | <el-table-column label="åä½" |
| | | prop="unit" |
| | | align="center" /> |
| | | <el-table-column label="æ åå¼" |
| | | prop="standardValue" |
| | | align="center" /> |
| | | <el-table-column label="å
æ§å¼" |
| | | prop="controlValue" |
| | | align="center" /> |
| | | <el-table-column label="å®é
å¼" |
| | | prop="actualValue" |
| | | align="center" /> |
| | | </el-table> |
| | | </div> |
| | | <!-- <div class="detail-section"> |
| | | |
| | | </div> --> |
| | | <el-divider v-if="index < qualityRecords.length - 1" /> |
| | | </div> |
| | | </div> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button @click="qualityDialogVisible = false">å
³é</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, reactive, onMounted } from "vue"; |
| | | import { useRoute, useRouter } from "vue-router"; |
| | | import { ElMessage } from "element-plus"; |
| | | import InputModal from "@/views/productionManagement/productionReporting/Input.vue"; |
| | | |
| | | const route = useRoute(); |
| | | const router = useRouter(); |
| | | |
| | | // æç´¢ç¸å
³ |
| | | const searchForm = reactive({ |
| | | npsNo: "", |
| | | }); |
| | | const selectedNpsNo = ref(null); |
| | | const npsNoLoading = ref(false); |
| | | const npsNoOptions = ref([ |
| | | { |
| | | id: 1, |
| | | npsNo: "PO20240301001", |
| | | productName: "ç²¾å¯æ¶²å缸", |
| | | model: "HG-100/50-500", |
| | | materialCode: "MAT-2024-001", |
| | | quantity: 500, |
| | | unit: "ä»¶", |
| | | status: 1, |
| | | customerName: "éå·¥æºæ¢°æéå
¬å¸", |
| | | startTime: "2024-03-01", |
| | | completionStatus: 65, |
| | | }, |
| | | { |
| | | id: 2, |
| | | npsNo: "PO20240301002", |
| | | productName: "å·¥ä¸ä¼ºæçµæº", |
| | | model: "SV-400W-3000", |
| | | materialCode: "MAT-2024-002", |
| | | quantity: 200, |
| | | unit: "å°", |
| | | status: 2, |
| | | customerName: "èªå¨å设å¤ç§æå
¬å¸", |
| | | startTime: "2024-03-02", |
| | | completionStatus: 100, |
| | | }, |
| | | { |
| | | id: 3, |
| | | npsNo: "PO20240301003", |
| | | productName: "é«åå¯å°å", |
| | | model: "SR-80-5", |
| | | materialCode: "MAT-2024-003", |
| | | quantity: 5000, |
| | | unit: "个", |
| | | status: 0, |
| | | customerName: "å¯å°ç³»ç»é
ä»¶å", |
| | | startTime: "2024-03-05", |
| | | completionStatus: 0, |
| | | }, |
| | | ]); |
| | | |
| | | // 详æ
æ°æ® |
| | | const rowData = reactive({ |
| | | productionOrderDto: null, |
| | | productionRecords: [], |
| | | }); |
| | | |
| | | // æ¥å·¥è¯¦æ
å¼¹çª |
| | | const detailDialogVisible = ref(false); |
| | | const detailData = ref({}); |
| | | |
| | | // æå
¥æ¨¡ææ¡ |
| | | const isShowInput = ref(false); |
| | | const isShowingId = ref(0); |
| | | const showInput = id => { |
| | | isShowInput.value = true; |
| | | isShowingId.value = id; |
| | | }; |
| | | |
| | | // åæ°è¯¦æ
å¼¹çª |
| | | const paramDetailVisible = ref(false); |
| | | const currentParams = ref([]); |
| | | const showParamDetail = params => { |
| | | currentParams.value = params || []; |
| | | paramDetailVisible.value = true; |
| | | }; |
| | | |
| | | // è´¨æ£ä¿¡æ¯å¼¹çª |
| | | const qualityDialogVisible = ref(false); |
| | | const qualityRecords = ref([]); |
| | | |
| | | // ç¶æå¤ç |
| | | const getStatusType = status => { |
| | | const typeMap = { 0: "info", 1: "primary", 2: "success" }; |
| | | return typeMap[status] || "info"; |
| | | }; |
| | | const getStatusText = status => { |
| | | const statusMap = { 0: "æªå¼å§", 1: "ç产ä¸", 2: "已宿" }; |
| | | return statusMap[status] || "æªç¥"; |
| | | }; |
| | | const customColors = percentage => { |
| | | if (percentage < 30) return "#f56c6c"; |
| | | if (percentage < 70) return "#e6a23c"; |
| | | return "#67c23a"; |
| | | }; |
| | | |
| | | // 模ææç´¢æ¹æ³ |
| | | const handleNpsNoSearch = query => { |
| | | if (query) { |
| | | npsNoLoading.value = true; |
| | | setTimeout(() => { |
| | | npsNoLoading.value = false; |
| | | }, 300); |
| | | } |
| | | }; |
| | | |
| | | const handleSearch = id => { |
| | | const selected = npsNoOptions.value.find(item => item.id === id); |
| | | if (selected) { |
| | | rowData.productionOrderDto = selected; |
| | | rowData.productionRecords = [ |
| | | { |
| | | id: 1001, |
| | | productNo: "MO-2024-001-01", |
| | | productName: selected.productName, |
| | | model: selected.model, |
| | | processName: "æ¯å¯å å·¥", |
| | | requiredQuantity: selected.quantity, |
| | | completedQuantity: Math.floor(selected.quantity * 0.4), |
| | | qualifiedQuantity: Math.floor(selected.quantity * 0.4) - 2, |
| | | unqualifiedQuantity: 2, |
| | | reportingTime: "2024-03-01 10:00:00", |
| | | schedule: "ç½ç", |
| | | postName: "å¼ ä¸", |
| | | unit: selected.unit, |
| | | }, |
| | | { |
| | | id: 1002, |
| | | productNo: "MO-2024-001-02", |
| | | productName: selected.productName, |
| | | model: selected.model, |
| | | processName: "ç²¾å å·¥", |
| | | requiredQuantity: Math.floor(selected.quantity * 0.4), |
| | | completedQuantity: Math.floor(selected.quantity * 0.25), |
| | | qualifiedQuantity: Math.floor(selected.quantity * 0.25), |
| | | unqualifiedQuantity: 0, |
| | | reportingTime: "2024-03-01 16:00:00", |
| | | schedule: "ç½ç", |
| | | postName: "æå", |
| | | unit: selected.unit, |
| | | }, |
| | | ]; |
| | | } |
| | | }; |
| | | |
| | | const handleBack = () => { |
| | | router.back(); |
| | | }; |
| | | |
| | | const handleClickStep = row => { |
| | | detailData.value = { |
| | | id: row.id || Math.floor(Math.random() * 1000), |
| | | productNo: row.productNo, |
| | | npsNo: rowData.productionOrderDto.npsNo, |
| | | schedule: row.schedule, |
| | | postName: row.postName, |
| | | materialCode: rowData.productionOrderDto.materialCode, |
| | | productName: row.productName, |
| | | model: row.model, |
| | | qualifiedQuantity: row.qualifiedQuantity, |
| | | unqualifiedQuantity: row.unqualifiedQuantity || 0, |
| | | quantity: row.completedQuantity, |
| | | unit: row.unit, |
| | | reportingTime: row.reportingTime, |
| | | productionOperationParamList: [ |
| | | { id: 1, paramName: "主轴转é", inputValue: "2400", unit: "rpm" }, |
| | | { id: 2, paramName: "è¿ç»é度", inputValue: "120", unit: "mm/min" }, |
| | | { id: 3, paramName: "ååæ·±åº¦", inputValue: "0.5", unit: "mm" }, |
| | | { id: 4, paramName: "å·å´æ¶²åå", inputValue: "0.6", unit: "Mpa" }, |
| | | ], |
| | | }; |
| | | detailDialogVisible.value = true; |
| | | }; |
| | | |
| | | const handleClickQuality = row => { |
| | | qualityRecords.value = [ |
| | | { |
| | | id: 2001, |
| | | checkTime: "2024-03-01 11:30:00", |
| | | workOrderNo: row.productNo, |
| | | process: row.processName, |
| | | checkName: "è´¨éé¨-ç建å½", |
| | | productName: row.productName, |
| | | model: row.model, |
| | | unit: row.unit, |
| | | quantity: row.completedQuantity, |
| | | checkCompany: "å
é¨å®éªå®¤", |
| | | checkResult: "åæ ¼", |
| | | inspectItems: [ |
| | | { |
| | | id: 1, |
| | | itemName: "å¤å¾å°ºå¯¸", |
| | | unit: "mm", |
| | | standardValue: "100.00±0.05", |
| | | controlValue: "100.00±0.03", |
| | | actualValue: "100.01", |
| | | result: "åæ ¼", |
| | | }, |
| | | { |
| | | id: 2, |
| | | itemName: "å
å¾å°ºå¯¸", |
| | | unit: "mm", |
| | | standardValue: "50.00+0.02/-0", |
| | | controlValue: "50.00+0.01/-0", |
| | | actualValue: "50.01", |
| | | result: "åæ ¼", |
| | | }, |
| | | { |
| | | id: 3, |
| | | itemName: "表é¢ç²ç³åº¦", |
| | | unit: "Ra", |
| | | standardValue: "â¤1.6", |
| | | controlValue: "â¤1.2", |
| | | actualValue: "0.8", |
| | | result: "åæ ¼", |
| | | }, |
| | | ], |
| | | }, |
| | | { |
| | | id: 2001, |
| | | checkTime: "2024-03-01 11:30:00", |
| | | workOrderNo: row.productNo, |
| | | process: row.processName, |
| | | checkName: "è´¨éé¨-ç建å½", |
| | | productName: row.productName, |
| | | model: row.model, |
| | | unit: row.unit, |
| | | quantity: row.completedQuantity, |
| | | checkCompany: "å
é¨å®éªå®¤", |
| | | checkResult: "åæ ¼", |
| | | inspectItems: [ |
| | | { |
| | | id: 1, |
| | | itemName: "å¤å¾å°ºå¯¸", |
| | | unit: "mm", |
| | | standardValue: "100.00±0.05", |
| | | controlValue: "100.00±0.03", |
| | | actualValue: "100.01", |
| | | result: "åæ ¼", |
| | | }, |
| | | { |
| | | id: 2, |
| | | itemName: "å
å¾å°ºå¯¸", |
| | | unit: "mm", |
| | | standardValue: "50.00+0.02/-0", |
| | | controlValue: "50.00+0.01/-0", |
| | | actualValue: "50.01", |
| | | result: "åæ ¼", |
| | | }, |
| | | { |
| | | id: 3, |
| | | itemName: "表é¢ç²ç³åº¦", |
| | | unit: "Ra", |
| | | standardValue: "â¤1.6", |
| | | controlValue: "â¤1.2", |
| | | actualValue: "0.8", |
| | | result: "åæ ¼", |
| | | }, |
| | | ], |
| | | }, |
| | | ]; |
| | | qualityDialogVisible.value = true; |
| | | }; |
| | | |
| | | onMounted(() => { |
| | | if (route.query.npsNo) { |
| | | const npsNo = route.query.npsNo; |
| | | const found = npsNoOptions.value.find(item => item.npsNo === npsNo); |
| | | if (found) { |
| | | selectedNpsNo.value = found.id; |
| | | handleSearch(found.id); |
| | | } else { |
| | | // å¦ææ²¡æ¾å°ï¼å建ä¸ä¸ªä¸´æ¶ç |
| | | const mockItem = { |
| | | id: Date.now(), |
| | | npsNo: npsNo, |
| | | productName: route.query.productName || "ç²¾å¯æ¶²å缸", |
| | | model: route.query.model || "HG-100/50-500", |
| | | materialCode: "MAT-2024-MOCK", |
| | | quantity: 100, |
| | | unit: "ä»¶", |
| | | status: 1, |
| | | customerName: "模æå®¢æ·", |
| | | startTime: "2024-03-01", |
| | | completionStatus: 50, |
| | | }; |
| | | npsNoOptions.value.push(mockItem); |
| | | selectedNpsNo.value = mockItem.id; |
| | | handleSearch(mockItem.id); |
| | | } |
| | | } |
| | | }); |
| | | </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; |
| | | } |
| | | |
| | | .search-form { |
| | | width: 100%; |
| | | } |
| | | |
| | | .search-form .el-form-item { |
| | | margin-right: 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; |
| | | } |
| | | |
| | | .sub-section-title { |
| | | font-size: 14px; |
| | | font-weight: 600; |
| | | margin-bottom: 16px; |
| | | color: #303133; |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .sub-section-title::before { |
| | | content: ""; |
| | | display: inline-block; |
| | | width: 3px; |
| | | height: 12px; |
| | | background-color: #67c23a; |
| | | 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; |
| | | width: 100%; |
| | | } |
| | | |
| | | .progress-section:hover { |
| | | box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.12); |
| | | } |
| | | |
| | | .order-item { |
| | | margin-bottom: 20px; |
| | | border-radius: 8px; |
| | | overflow: hidden; |
| | | box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); |
| | | } |
| | | |
| | | :deep(.el-table) { |
| | | 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-progress-bar__inner) { |
| | | border-radius: 10px; |
| | | } |
| | | |
| | | :deep(.el-tag) { |
| | | border-radius: 12px; |
| | | padding: 2px 10px; |
| | | } |
| | | |
| | | /* å¼¹çªæ ·å¼ */ |
| | | .detail-container { |
| | | max-height: 600px; |
| | | overflow-y: auto; |
| | | padding: 0 16px; |
| | | } |
| | | |
| | | .process-item { |
| | | margin-bottom: 24px; |
| | | padding: 20px; |
| | | background-color: #ffffff; |
| | | border-radius: 8px; |
| | | border: 1px solid #ebeef5; |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); |
| | | } |
| | | |
| | | .process-header { |
| | | margin-bottom: 20px; |
| | | padding-bottom: 12px; |
| | | border-bottom: 1px solid #f0f2f5; |
| | | } |
| | | |
| | | .process-title { |
| | | font-size: 15px; |
| | | font-weight: 600; |
| | | margin-bottom: 12px; |
| | | color: #1a1a1a; |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .process-title::before { |
| | | content: ""; |
| | | display: inline-block; |
| | | width: 4px; |
| | | height: 16px; |
| | | background-color: #409eff; |
| | | margin-right: 8px; |
| | | border-radius: 2px; |
| | | } |
| | | |
| | | .process-info { |
| | | display: flex; |
| | | gap: 20px; |
| | | font-size: 13px; |
| | | color: #606266; |
| | | } |
| | | |
| | | .process-label { |
| | | padding: 4px 12px; |
| | | background-color: #ecf5ff; |
| | | border-radius: 4px; |
| | | color: #409eff; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | .process-details { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .num1 { |
| | | color: #1107cc; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | .num2 { |
| | | color: #0fcf25; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | .num3 { |
| | | color: #d31818; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | .dialog-footer { |
| | | text-align: center; |
| | | padding: 20px; |
| | | border-top: 1px solid #ebeef5; |
| | | } |
| | | |
| | | .dialog-footer .el-button { |
| | | min-width: 100px; |
| | | padding: 8px 20px; |
| | | } |
| | | |
| | | /* èªå®ä¹å¯¹è¯æ¡æ ·å¼ */ |
| | | :deep(.custom-dialog) { |
| | | border-radius: 12px; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | :deep(.custom-dialog .el-dialog__header) { |
| | | background-color: #f5f7fa; |
| | | padding: 20px; |
| | | border-bottom: 1px solid #ebeef5; |
| | | } |
| | | |
| | | :deep(.custom-dialog .el-dialog__title) { |
| | | font-size: 18px; |
| | | font-weight: 600; |
| | | color: #1a1a1a; |
| | | } |
| | | |
| | | :deep(.custom-dialog .el-dialog__body) { |
| | | padding: 20px; |
| | | } |
| | | |
| | | .unit-text { |
| | | margin-left: 5px; |
| | | color: #909399; |
| | | font-size: 12px; |
| | | } |
| | | |
| | | .param-detail-list { |
| | | padding: 10px; |
| | | } |
| | | </style> |