Merge branch 'dev_衡阳_鹏创电子' of http://114.132.189.42:9002/r/product-inventory-management into dev_衡阳_鹏创电子
| | |
| | | }, |
| | | ], |
| | | }, |
| | | |
| | | // ç产订å-ç产详æ
ï¼å·¥åºè¿åº¦ï¼ |
| | | { |
| | | path: "/productionManagement/productionOrder/detail", |
| | | component: Layout, |
| | | hidden: true, |
| | | children: [ |
| | | { |
| | | path: "", |
| | | component: () => import("@/views/productionManagement/productionOrder/Detail/index.vue"), |
| | | name: "ProductionOrderDetail", |
| | | meta: { title: "ç产详æ
", activeMenu: "/productionManagement/productionOrder" }, |
| | | }, |
| | | ], |
| | | }, |
| | | ]; |
| | | |
| | | // å¨æè·¯ç±ï¼åºäºç¨æ·æé卿å»å è½½ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="app-container production-order-detail"> |
| | | <PageHeader content="ç产详æ
"> |
| | | </PageHeader> |
| | | |
| | | <el-card shadow="never" class="mb12"> |
| | | <div class="header"> |
| | | <div class="title">åºç¡ä¿¡æ¯</div> |
| | | <div class="sub"> |
| | | <span class="mr12">ç产订åå·ï¼{{ header.npsNo || "-" }}</span> |
| | | <span class="mr12">ç产æ¹å·ï¼{{ header.lotNo || "-" }}</span> |
| | | <span class="mr12">产ååç§°ï¼{{ header.productCategory || "-" }}</span> |
| | | <span class="mr12">è§æ ¼ï¼{{ header.specificationModel || "-" }}</span> |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | | |
| | | <el-card shadow="never" class="mb12"> |
| | | <div class="steps-head"> |
| | | <div class="steps-title">å·¥åºæ§è¡è¿åº¦</div> |
| | | </div> |
| | | <div class="steps-body"> |
| | | <div class="steps-left"> |
| | | <div class="steps-wrap"> |
| | | <el-steps |
| | | class="process-steps" |
| | | :active="active" |
| | | finish-status="success" |
| | | direction="vertical" |
| | | > |
| | | <el-step |
| | | v-for="(p, idx) in processes" |
| | | :key="p.processCode || idx" |
| | | > |
| | | <template #title> |
| | | <div |
| | | class="step-title" |
| | | :class="{ selected: idx === selectedIndex }" |
| | | @click="selectProcess(idx)" |
| | | > |
| | | {{ `${idx + 1}. ${p.processName || "-"}` }} |
| | | </div> |
| | | </template> |
| | | <template #description> |
| | | <div class="step-panel"> |
| | | <div v-if="idx === active" class="current-progress"> |
| | | <div class="current-progress-head"> |
| | | <span class="current-progress-title">å½åå·¥åºè¿åº¦</span> |
| | | <!-- <span class="current-progress-value">{{ currentProcessPercentage }}%</span> --> |
| | | </div> |
| | | <el-progress |
| | | :percentage="currentProcessPercentage" |
| | | :status="currentProcessPercentage >= 100 ? 'success' : ''" |
| | | :stroke-width="10" |
| | | /> |
| | | </div> |
| | | <div class="step-meta"> |
| | | <span class="meta-item"> |
| | | <span class="meta-label">å·¥åºç¼å·</span> |
| | | <span class="meta-value">{{ p.processCode || "-" }}</span> |
| | | </span> |
| | | <span class="meta-item"> |
| | | <span class="meta-label">ä¸è¯ç</span> |
| | | <span class="meta-value danger">{{ defectRateText(p) }}</span> |
| | | </span> |
| | | </div> |
| | | <div class="step-grid"> |
| | | <div class="grid-item"> |
| | | <div class="grid-label">æå
¥æ°é</div> |
| | | <div class="grid-value">{{ p.inputQty ?? 0 }}</div> |
| | | </div> |
| | | <div class="grid-item"> |
| | | <div class="grid-label">äº§åºæ°é</div> |
| | | <div class="grid-value">{{ p.outputQty ?? 0 }}</div> |
| | | </div> |
| | | <div class="grid-item"> |
| | | <div class="grid-label">åæ ¼æ°é</div> |
| | | <div class="grid-value success">{{ p.qualifiedQty ?? 0 }}</div> |
| | | </div> |
| | | <div class="grid-item"> |
| | | <div class="grid-label">ä¸è¯æ°é</div> |
| | | <div class="grid-value danger">{{ p.badQty ?? 0 }}</div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | </el-step> |
| | | </el-steps> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="steps-right"> |
| | | <div class="right-panel"> |
| | | <div class="right-panel-head"> |
| | | <div class="right-title">æ¥å·¥ä¿¡æ¯</div> |
| | | <div class="right-sub" v-if="selectedProcess"> |
| | | å½åå·¥åºï¼{{ selectedProcess.processName }}ï¼{{ selectedProcess.processCode }}ï¼ |
| | | </div> |
| | | </div> |
| | | |
| | | <div v-if="!selectedProcess" class="right-empty"> |
| | | ç¹å»å·¦ä¾§æä¸ªå·¥åºï¼å³ä¾§å±ç¤ºè¯¥å·¥åºçæ¥å·¥æç»ã |
| | | </div> |
| | | |
| | | <div v-else class="right-content"> |
| | | <el-table :data="mockReports" border height="420"> |
| | | <el-table-column label="åºå·" type="index" width="60" align="center" /> |
| | | <el-table-column label="æ¥å·¥åå·" prop="reportNo" min-width="140" show-overflow-tooltip /> |
| | | <el-table-column label="æ¥å·¥äººå" prop="reportUser" min-width="120" show-overflow-tooltip /> |
| | | <el-table-column label="æ¥å·¥æ¶é´" prop="reportTime" min-width="160" show-overflow-tooltip /> |
| | | <el-table-column label="äº§åºæ°é" prop="outputQty" min-width="110" /> |
| | | <el-table-column label="ä¸è¯æ°é" prop="badQty" min-width="110" /> |
| | | <el-table-column label="夿³¨" prop="remark" min-width="160" show-overflow-tooltip /> |
| | | </el-table> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { computed, ref } from "vue"; |
| | | import { useRoute, useRouter } from "vue-router"; |
| | | |
| | | const route = useRoute(); |
| | | |
| | | const header = computed(() => ({ |
| | | orderId: route.query.orderId, |
| | | npsNo: route.query.npsNo, |
| | | lotNo: route.query.lotNo, |
| | | productCategory: route.query.productCategory, |
| | | specificationModel: route.query.specificationModel, |
| | | })); |
| | | |
| | | // 模æå·¥åºæ°æ®ï¼åç»ç¨æ¥å£æ¿æ¢ï¼ |
| | | const processes = computed(() => [ |
| | | { |
| | | processCode: "GX-001", |
| | | processName: "夿", |
| | | inputQty: 1000, |
| | | outputQty: 980, |
| | | qualifiedQty: 970, |
| | | badQty: 10, |
| | | status: "success", |
| | | }, |
| | | { |
| | | processCode: "GX-002", |
| | | processName: "æå", |
| | | inputQty: 980, |
| | | outputQty: 960, |
| | | qualifiedQty: 948, |
| | | badQty: 12, |
| | | status: "process", |
| | | }, |
| | | { |
| | | processCode: "GX-003", |
| | | processName: "çå¹²", |
| | | inputQty: 960, |
| | | outputQty: 950, |
| | | qualifiedQty: 948, |
| | | badQty: 2, |
| | | status: "wait", |
| | | }, |
| | | { |
| | | processCode: "GX-004", |
| | | processName: "å
è£
å
¥åº", |
| | | inputQty: 950, |
| | | outputQty: 920, |
| | | qualifiedQty: 918, |
| | | badQty: 2, |
| | | status: "wait", |
| | | }, |
| | | ]); |
| | | |
| | | const selectedIndex = ref(null); |
| | | |
| | | const selectProcess = (idx) => { |
| | | selectedIndex.value = idx; |
| | | }; |
| | | |
| | | const selectedProcess = computed(() => { |
| | | if (selectedIndex.value === null || selectedIndex.value === undefined) return null; |
| | | return (processes.value || [])[selectedIndex.value] || null; |
| | | }); |
| | | |
| | | // æ¨¡ææ¥å·¥ä¿¡æ¯ï¼åç»ç¨æ¥å£æ¿æ¢ï¼ |
| | | const mockReports = computed(() => { |
| | | const p = selectedProcess.value; |
| | | if (!p) return []; |
| | | const code = p.processCode || "GX"; |
| | | return [ |
| | | { |
| | | reportNo: `${code}-BG-0001`, |
| | | reportUser: "å¼ ä¸", |
| | | reportTime: "2026-03-14 09:20", |
| | | outputQty: Math.floor((p.outputQty ?? 0) * 0.4), |
| | | badQty: Math.floor((p.badQty ?? 0) * 0.4), |
| | | remark: "æ£å¸¸æ¥å·¥", |
| | | }, |
| | | { |
| | | reportNo: `${code}-BG-0002`, |
| | | reportUser: "æå", |
| | | reportTime: "2026-03-14 13:45", |
| | | outputQty: Math.floor((p.outputQty ?? 0) * 0.35), |
| | | badQty: Math.floor((p.badQty ?? 0) * 0.35), |
| | | remark: "设å¤è°è¯åæ¢å¤", |
| | | }, |
| | | { |
| | | reportNo: `${code}-BG-0003`, |
| | | reportUser: "çäº", |
| | | reportTime: "2026-03-14 17:10", |
| | | outputQty: Math.max(0, (p.outputQty ?? 0) - Math.floor((p.outputQty ?? 0) * 0.75)), |
| | | badQty: Math.max(0, (p.badQty ?? 0) - Math.floor((p.badQty ?? 0) * 0.75)), |
| | | remark: "æ¶å°¾", |
| | | }, |
| | | ]; |
| | | }); |
| | | |
| | | const clampPercentage = (val) => { |
| | | const n = Number(val); |
| | | if (!Number.isFinite(n)) return 0; |
| | | if (n <= 0) return 0; |
| | | if (n >= 100) return 100; |
| | | return Math.round(n); |
| | | }; |
| | | |
| | | // el-steps: active 为å½åè¿è¡ä¸çæ¥éª¤ä¸æ ï¼æ¨¡æï¼ |
| | | const active = computed(() => { |
| | | const list = processes.value || []; |
| | | const idx = list.findIndex((p) => p.status === "process"); |
| | | return idx >= 0 ? idx : 0; |
| | | }); |
| | | |
| | | const currentProcess = computed(() => { |
| | | const list = processes.value || []; |
| | | return list[active.value] || null; |
| | | }); |
| | | |
| | | // å½åå·¥åºè¿åº¦ï¼ç¨äº§åº/æå
¥ä¼°ç®ï¼UI å
è·éï¼åç»æçå®è§åæ¿æ¢ï¼ |
| | | const currentProcessPercentage = computed(() => { |
| | | const p = currentProcess.value; |
| | | if (!p) return 0; |
| | | const input = Number(p.inputQty ?? 0); |
| | | const output = Number(p.outputQty ?? 0); |
| | | if (!Number.isFinite(input) || input <= 0) return 0; |
| | | return clampPercentage((output / input) * 100); |
| | | }); |
| | | |
| | | // ä¸è¯çï¼ä¸è¯æ°é / äº§åºæ°éï¼å
ææ¤å£å¾ï¼åç»å¯¹æ¥æ¥å£å¯è°æ´ï¼ |
| | | const defectRateText = (p) => { |
| | | const bad = Number(p?.badQty ?? 0); |
| | | const output = Number(p?.outputQty ?? 0); |
| | | if (!Number.isFinite(bad) || bad <= 0) return "0%"; |
| | | if (!Number.isFinite(output) || output <= 0) return "0%"; |
| | | const rate = (bad / output) * 100; |
| | | return `${rate.toFixed(2)}%`; |
| | | }; |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | .production-order-detail { |
| | | // 左侧æ¥éª¤åºçå¯è§é«åº¦ï¼éå±å¹é«åº¦èªéåº |
| | | // è¿éåå»é¡µé¢é¡¶é¨ï¼PageHeader + åºç¡ä¿¡æ¯å¡ç + è¾¹è·çï¼ç大è´é«åº¦ |
| | | --steps-left-height: calc(100vh - 320px); |
| | | |
| | | .header { |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 8px; |
| | | .title { |
| | | font-size: 16px; |
| | | font-weight: 600; |
| | | color: #303133; |
| | | } |
| | | .sub { |
| | | color: #606266; |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | row-gap: 6px; |
| | | } |
| | | } |
| | | |
| | | .steps-head { |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 4px; |
| | | margin-bottom: 12px; |
| | | .steps-title { |
| | | font-size: 14px; |
| | | font-weight: 600; |
| | | color: #303133; |
| | | } |
| | | .steps-desc { |
| | | font-size: 12px; |
| | | color: #909399; |
| | | } |
| | | } |
| | | |
| | | .steps-wrap { |
| | | padding: 4px 0 0; |
| | | height: 100%; |
| | | overflow-y: auto; |
| | | } |
| | | |
| | | .steps-body { |
| | | display: flex; |
| | | gap: 16px; |
| | | align-items: flex-start; |
| | | } |
| | | .steps-left { |
| | | flex: 0 0 50%; |
| | | max-width: 50%; |
| | | min-width: 0; |
| | | height: var(--steps-left-height); |
| | | overflow: hidden; |
| | | } |
| | | .steps-right { |
| | | flex: 1; |
| | | min-width: 0; |
| | | } |
| | | |
| | | .step-title { |
| | | cursor: pointer; |
| | | display: inline-flex; |
| | | align-items: center; |
| | | padding: 2px 6px; |
| | | border-radius: 6px; |
| | | transition: background-color 0.15s ease; |
| | | &:hover { |
| | | background: #f5f7fa; |
| | | } |
| | | &.selected { |
| | | background: rgba(64, 158, 255, 0.12); |
| | | color: #409eff; |
| | | } |
| | | } |
| | | |
| | | .process-steps { |
| | | width: 100%; |
| | | :deep(.el-step__title) { |
| | | font-weight: 600; |
| | | } |
| | | :deep(.el-step__description) { |
| | | font-size: 12px; |
| | | color: #606266; |
| | | line-height: 18px; |
| | | margin-top: 8px; |
| | | width: 100%; |
| | | } |
| | | :deep(.el-step__main) { |
| | | padding-bottom: 20px; |
| | | width: 100%; |
| | | } |
| | | :deep(.el-step__icon.is-text) { |
| | | border-color: #dcdfe6; |
| | | } |
| | | :deep(.el-step.is-vertical) { |
| | | align-items: flex-start; |
| | | } |
| | | :deep(.el-step__head) { |
| | | width: 28px; |
| | | flex: 0 0 28px; |
| | | } |
| | | :deep(.el-step__main) { |
| | | flex: 1; |
| | | min-width: 0; |
| | | padding-right: 6px; |
| | | } |
| | | } |
| | | |
| | | .step-panel { |
| | | background: #f6f8fb; |
| | | border: 1px solid #ebeef5; |
| | | border-radius: 10px; |
| | | padding: 12px 12px 10px; |
| | | width: 100%; |
| | | max-width: none; |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | .right-panel { |
| | | border: 1px solid #ebeef5; |
| | | border-radius: 10px; |
| | | background: #ffffff; |
| | | padding: 12px; |
| | | min-height: 520px; |
| | | box-sizing: border-box; |
| | | } |
| | | .right-panel-head { |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 4px; |
| | | margin-bottom: 12px; |
| | | } |
| | | .right-title { |
| | | font-size: 14px; |
| | | font-weight: 700; |
| | | color: #303133; |
| | | } |
| | | .right-sub { |
| | | font-size: 12px; |
| | | color: #909399; |
| | | } |
| | | .right-empty { |
| | | height: 100%; |
| | | min-height: 460px; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | color: #909399; |
| | | background: #fafafa; |
| | | border: 1px dashed #dcdfe6; |
| | | border-radius: 10px; |
| | | } |
| | | |
| | | .current-progress { |
| | | background: #ffffff; |
| | | border: 1px dashed #dcdfe6; |
| | | border-radius: 10px; |
| | | padding: 10px 12px 8px; |
| | | margin-bottom: 10px; |
| | | .current-progress-head { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | margin-bottom: 6px; |
| | | } |
| | | .current-progress-title { |
| | | color: #303133; |
| | | font-weight: 600; |
| | | font-size: 12px; |
| | | } |
| | | .current-progress-value { |
| | | color: #606266; |
| | | font-size: 12px; |
| | | font-weight: 600; |
| | | } |
| | | } |
| | | |
| | | .step-meta { |
| | | display: flex; |
| | | gap: 16px; |
| | | margin-bottom: 10px; |
| | | .meta-item { |
| | | display: inline-flex; |
| | | gap: 8px; |
| | | align-items: center; |
| | | } |
| | | .meta-label { |
| | | color: #909399; |
| | | } |
| | | .meta-value { |
| | | color: #303133; |
| | | font-weight: 600; |
| | | &.danger { |
| | | color: #f56c6c; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .step-grid { |
| | | display: grid; |
| | | grid-template-columns: repeat(4, minmax(0, 1fr)); |
| | | gap: 10px; |
| | | .grid-item { |
| | | background: #ffffff; |
| | | border: 1px solid #ebeef5; |
| | | border-radius: 10px; |
| | | padding: 10px 10px 8px; |
| | | } |
| | | .grid-label { |
| | | font-size: 12px; |
| | | color: #909399; |
| | | margin-bottom: 6px; |
| | | } |
| | | .grid-value { |
| | | font-size: 16px; |
| | | font-weight: 700; |
| | | color: #303133; |
| | | &.success { |
| | | color: #67c23a; |
| | | } |
| | | &.danger { |
| | | color: #f56c6c; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .mb12 { |
| | | margin-bottom: 12px; |
| | | } |
| | | .mr12 { |
| | | margin-right: 12px; |
| | | } |
| | | } |
| | | </style> |
| | | |
| | |
| | | @selection-change="handleSelectionChange" |
| | | @pagination="pagination"> |
| | | <template #completionStatus="{ row }"> |
| | | <el-progress |
| | | :percentage="toProgressPercentage(row?.completionStatus)" |
| | | :color="progressColor(toProgressPercentage(row?.completionStatus))" |
| | | :status="toProgressPercentage(row?.completionStatus) >= 100 ? 'success' : ''" |
| | | /> |
| | | <div class="progress-link" @click="goProductionDetail(row)"> |
| | | <el-progress |
| | | :percentage="toProgressPercentage(row?.completionStatus)" |
| | | :color="progressColor(toProgressPercentage(row?.completionStatus))" |
| | | :status="toProgressPercentage(row?.completionStatus) >= 100 ? 'success' : ''" |
| | | /> |
| | | </div> |
| | | </template> |
| | | </PIMTable> |
| | | </div> |
| | |
| | | { |
| | | name: "å·¥èºè·¯çº¿", |
| | | type: "text", |
| | | showHide: row => row.processRouteCode, |
| | | clickFun: row => { |
| | | showRouteItemModal(row); |
| | | }, |
| | |
| | | }); |
| | | }; |
| | | |
| | | const goProductionDetail = (row) => { |
| | | if (!row) return; |
| | | router.push({ |
| | | path: "/productionManagement/productionOrder/detail", |
| | | query: { |
| | | orderId: row.id, |
| | | npsNo: row.npsNo || "", |
| | | lotNo: row.lotNo || "", |
| | | productCategory: row.productCategory || "", |
| | | specificationModel: row.specificationModel || "", |
| | | }, |
| | | }); |
| | | }; |
| | | |
| | | // è¡¨æ ¼éæ©æ°æ® |
| | | const handleSelectionChange = (selection) => { |
| | | selectedRows.value = selection; |
| | |
| | | ::v-deep .purple{ |
| | | background-color: #F4DEFA; |
| | | } |
| | | .progress-link { |
| | | cursor: pointer; |
| | | } |
| | | |
| | | </style> |
| | |
| | | <el-option label="åæææ£éª" value="0" /> |
| | | <el-option label="è¿ç¨æ£éª" value="1" /> |
| | | <el-option label="åºåæ£éª" value="2" /> |
| | | <el-option label="å·¡æ£" value="3" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="å·¥åº" prop="processId"> |
| | |
| | | const env = loadEnv(mode, process.cwd()); |
| | | const { VITE_APP_ENV } = env; |
| | | const baseUrl = |
| | | env.VITE_APP_ENV === "development" |
| | | ? "http://192.168.1.35:9009" |
| | | : env.VITE_BASE_API; |
| | | env.VITE_APP_ENV === "development" |
| | | ? "http://1.15.17.182:9009" |
| | | : env.VITE_BASE_API; |
| | | const javaUrl = |
| | | env.VITE_APP_ENV === "development" |
| | | ? "http://192.168.1.35:9009" |
| | | : env.VITE_JAVA_API; |
| | | |
| | | env.VITE_APP_ENV === "development" |
| | | ? "http://1.15.17.182:9009" |
| | | : env.VITE_JAVA_API; |
| | | return { |
| | | define: { |
| | | __BASE_API__: JSON.stringify(javaUrl), |
| | | define:{ |
| | | __BASE_API__: JSON.stringify(javaUrl) |
| | | }, |
| | | // é¨ç½²ç产ç¯å¢åå¼åç¯å¢ä¸çURLã |
| | | // é»è®¤æ
åµä¸ï¼vite ä¼åè®¾ä½ çåºç¨æ¯è¢«é¨ç½²å¨ä¸ä¸ªååçæ ¹è·¯å¾ä¸ |
| | | // ä¾å¦ https://www.ruoyi.vip/ã妿åºç¨è¢«é¨ç½²å¨ä¸ä¸ªåè·¯å¾ä¸ï¼ä½ å°±éè¦ç¨è¿ä¸ªé项æå®è¿ä¸ªåè·¯å¾ãä¾å¦ï¼å¦æä½ çåºç¨è¢«é¨ç½²å¨ https://www.ruoyi.vip/admin/ï¼å设置 baseUrl 为 /admin/ã |
| | | base: VITE_APP_ENV === "production" ? "/" : "/", |
| | | plugins: createVitePlugins(env, command === "build"), |
| | | resolve: { |
| | | // https://cn.vitejs.dev/config/#resolve-alias |
| | | alias: { |
| | | // è®¾ç½®è·¯å¾ |
| | | "~": path.resolve(__dirname, "./"), |
| | | // 设置å«å |
| | | "@": path.resolve(__dirname, "./src"), |
| | | }, |
| | | // https://cn.vitejs.dev/config/#resolve-extensions |
| | | extensions: [".mjs", ".js", ".ts", ".jsx", ".tsx", ".json", ".vue"], |
| | | dedupe: ["vue", "axios"], // å»ééå¤ä¾èµ |
| | | }, |
| | | // å
¨å±å¼å¯æå»ºç¼åï¼æ ¸å¿ï¼ |
| | | cacheDir: |
| | | "/var/jenkins_home/workspace/客æ·-é¹åçµåå端/node_modules/.vite", |
| | | // ä¾èµé¢æå»ºä¼å |
| | | optimizeDeps: { |
| | | include: ["vue", "axios", "element-plus", "echarts"], // æ ¹æ®é¡¹ç®ä¾èµè°æ´ |
| | | esbuildOptions: { |
| | | target: "es2020", |
| | | }, |
| | | }, |
| | | // æå
é
ç½®ï¼æ ¸å¿ä¼ååºï¼ |
| | | // æå
é
ç½® |
| | | build: { |
| | | sourcemap: false, // å½»åºå
³éç产ç¯å¢sourcemap |
| | | // https://vite.dev/config/build-options.html |
| | | sourcemap: command === "build" ? false : "inline", |
| | | outDir: "dist", |
| | | assetsDir: "assets", |
| | | chunkSizeWarningLimit: 2000, |
| | | minify: "esbuild", // ä½¿ç¨ esbuild åç¼©ï¼æ éé¢å¤ä¾èµï¼ |
| | | reportCompressedSize: false, // å
³é产ç©ä½ç§¯æ¥åï¼åå°èæ¶ |
| | | commonjsOptions: { |
| | | include: [/node_modules/, /\.commonjs$/], |
| | | }, |
| | | rollupOptions: { |
| | | output: { |
| | | chunkFileNames: "static/js/[name]-[hash].js", |
| | | entryFileNames: "static/js/[name]-[hash].js", |
| | | assetFileNames: "static/[ext]/[name]-[hash].[ext]", |
| | | // åå
çç¥ï¼æå大ä¾èµï¼ |
| | | manualChunks: { |
| | | vendor: ["vue", "vue-router", "pinia", "axios"], |
| | | ui: ["element-plus"], // æ ¹æ®å®é
UIåºè°æ´ |
| | | charts: ["echarts"], // æå¾è¡¨åºåä¿çï¼æ åå é¤ |
| | | }, |
| | | }, |
| | | cache: true, |
| | | }, |
| | | }, |
| | | // vite ç¸å
³é
ç½® |
| | | server: { |
| | | port: 8001, |
| | | port: 80, |
| | | host: true, |
| | | open: true, |
| | | proxy: { |
| | | // https://cn.vitejs.dev/config/#server-proxy |
| | | "/dev-api": { |
| | | target: baseUrl, |
| | | changeOrigin: true, |
| | | rewrite: (p) => p.replace(/^\/dev-api/, ""), |
| | | }, |
| | | // springdoc proxy |
| | | "^/v3/api-docs/(.*)": { |
| | | target: baseUrl, |
| | | changeOrigin: true, |
| | |
| | | }, |
| | | ], |
| | | }, |
| | | // CSS é¢ç¼è¯ç¼å |
| | | preprocessorOptions: { |
| | | scss: { |
| | | cacheDirectory: path.resolve( |
| | | __dirname, |
| | | "./node_modules/.vite/scss-cache" |
| | | ), |
| | | }, |
| | | }, |
| | | }, |
| | | // esbuild å
¨å±é
ç½® |
| | | esbuild: { |
| | | logOverride: { "this-is-undefined-in-esm": "silent" }, |
| | | target: "es2020", |
| | | }, |
| | | }; |
| | | }); |