From 00cb3748cb383c97be847cfe40ac5102684a68c5 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 14 十月 2025 14:11:43 +0800
Subject: [PATCH] 生产管控-智能排产、物料看板页面联调
---
src/views/productionControl/stockMaterialBoard/index.vue | 342 +++++++++++++++++++++++-------------------
src/views/productionControl/intelligentScheduling/index.vue | 32 +--
src/api/productionScheduling/index.js | 51 ++++++
3 files changed, 250 insertions(+), 175 deletions(-)
diff --git a/src/api/productionScheduling/index.js b/src/api/productionScheduling/index.js
index 0bbbb15..8d6a941 100644
--- a/src/api/productionScheduling/index.js
+++ b/src/api/productionScheduling/index.js
@@ -13,7 +13,7 @@
export function getProductionSchedulingInventoryList(query) {
return request({
url: '/productHome/productionSchedulingInventoryList',
- method: 'GET',
+ method: 'get',
params: query
})
}
@@ -22,7 +22,7 @@
export function getProductionSchedulingStatistics(query) {
return request({
url: '/productHome/productionSchedulingStatistics',
- method: 'GET',
+ method: 'get',
params: query
})
}
@@ -31,7 +31,7 @@
export function getProductionSchedulingStatisticsList(query) {
return request({
url: '/productHome/productionSchedulingStatisticsList',
- method: 'GET',
+ method: 'get',
params: query
})
}
@@ -61,4 +61,49 @@
method: 'post',
data: data
})
+}
+
+// 鑾峰彇鐗╂枡鐪嬫澘缁熻鏁版嵁
+export function getMaterialStatistics(query) {
+ return request({
+ url: '/productHome/materialStatistics',
+ method: 'get',
+ params: query
+ })
+}
+
+// 鑾峰彇鐓ょ鍒嗗竷鏁版嵁
+export function getCoalTypeDistribution(query) {
+ return request({
+ url: '/productHome/coalTypeDistribution',
+ method: 'get',
+ params: query
+ })
+}
+
+// 鑾峰彇鐑�煎垎甯冩暟鎹�
+export function getHeatValueDistribution(query) {
+ return request({
+ url: '/productHome/heatValueDistribution',
+ method: 'get',
+ params: query
+ })
+}
+
+// 鑾峰彇杞︽缂栫爜鍒嗗竷鏁版嵁
+export function getCarCodeDistribution(query) {
+ return request({
+ url: '/productHome/carCodeDistribution',
+ method: 'get',
+ params: query
+ })
+}
+
+// 鑾峰彇鏈�杩戜氦鏄撹褰�
+export function getRecentTransaction(query) {
+ return request({
+ url: '/productHome/recentTransaction',
+ method: 'get',
+ params: query
+ })
}
\ No newline at end of file
diff --git a/src/views/productionControl/intelligentScheduling/index.vue b/src/views/productionControl/intelligentScheduling/index.vue
index c21c397..62689c5 100644
--- a/src/views/productionControl/intelligentScheduling/index.vue
+++ b/src/views/productionControl/intelligentScheduling/index.vue
@@ -89,7 +89,7 @@
<span>{{ scope.row.type === 1 ? '鎴愬搧' : scope.row.type === 2 ? '鍘熸枡' : '-' }}</span>
</template>
</el-table-column>
- <el-table-column prop="coalId" label="鐓ょ" />
+ <el-table-column prop="coalName" label="鐓ょ" />
<el-table-column prop="inventoryQuantity" label="褰撳墠搴撳瓨"></el-table-column>
<el-table-column prop="pendingReplenishment" label="寰呰ˉ搴�"></el-table-column>
<el-table-column prop="unit" label="鍗曚綅" />
@@ -287,12 +287,10 @@
// 鏋勫缓璇锋眰鍙傛暟
const params = {
- dto: {
- entryDateStart: searchParams.value.dateRange && searchParams.value.dateRange[0] ?
- searchParams.value.dateRange[0].toISOString().split('T')[0] : '',
- entryDateEnd: searchParams.value.dateRange && searchParams.value.dateRange[1] ?
- searchParams.value.dateRange[1].toISOString().split('T')[0] : ''
- }
+ entryDateStart: searchParams.value.dateRange && searchParams.value.dateRange[0] ?
+ searchParams.value.dateRange[0].toISOString().split('T')[0] : '',
+ entryDateEnd: searchParams.value.dateRange && searchParams.value.dateRange[1] ?
+ searchParams.value.dateRange[1].toISOString().split('T')[0] : ''
}
// 璋冪敤鎺ュ彛鑾峰彇鏁版嵁
@@ -315,12 +313,10 @@
try {
// 鏋勫缓璇锋眰鍙傛暟
const params = {
- dto: {
- entryDateStart: searchParams.value.dateRange && searchParams.value.dateRange[0] ?
- searchParams.value.dateRange[0].toISOString().split('T')[0] : '',
- entryDateEnd: searchParams.value.dateRange && searchParams.value.dateRange[1] ?
- searchParams.value.dateRange[1].toISOString().split('T')[0] : ''
- }
+ entryDateStart: searchParams.value.dateRange && searchParams.value.dateRange[0] ?
+ searchParams.value.dateRange[0].toISOString().split('T')[0] : '',
+ entryDateEnd: searchParams.value.dateRange && searchParams.value.dateRange[1] ?
+ searchParams.value.dateRange[1].toISOString().split('T')[0] : ''
}
// 璋冪敤鎺ュ彛鑾峰彇鏁版嵁
@@ -340,12 +336,10 @@
try {
// 鏋勫缓璇锋眰鍙傛暟
const params = {
- dto: {
- entryDateStart: searchParams.value.dateRange && searchParams.value.dateRange[0] ?
- searchParams.value.dateRange[0].toISOString().split('T')[0] : '',
- entryDateEnd: searchParams.value.dateRange && searchParams.value.dateRange[1] ?
- searchParams.value.dateRange[1].toISOString().split('T')[0] : ''
- }
+ entryDateStart: searchParams.value.dateRange && searchParams.value.dateRange[0] ?
+ searchParams.value.dateRange[0].toISOString().split('T')[0] : '',
+ entryDateEnd: searchParams.value.dateRange && searchParams.value.dateRange[1] ?
+ searchParams.value.dateRange[1].toISOString().split('T')[0] : ''
}
// 璋冪敤鎺ュ彛鑾峰彇鏁版嵁
diff --git a/src/views/productionControl/stockMaterialBoard/index.vue b/src/views/productionControl/stockMaterialBoard/index.vue
index 721ddb5..e43c52c 100644
--- a/src/views/productionControl/stockMaterialBoard/index.vue
+++ b/src/views/productionControl/stockMaterialBoard/index.vue
@@ -15,18 +15,12 @@
start-placeholder="寮�濮嬫棩鏈�"
end-placeholder="缁撴潫鏃ユ湡"
:shortcuts="dateShortcuts"
+ value-format="YYYY-MM-DD"
/>
- </el-form-item>
- <el-form-item label="鐓ょ">
- <el-input v-model="searchParams.coalType" placeholder="璇疯緭鍏ョ叅绉�" clearable />
- </el-form-item>
- <el-form-item label="杞︽缂栫爜">
- <el-input v-model="searchParams.trainCode" placeholder="璇疯緭鍏ヨ溅娆$紪鐮�" clearable />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSearch" :loading="loading">鏌ヨ</el-button>
<el-button @click="handleReset">閲嶇疆</el-button>
- <el-button @click="handleRefresh">鍒锋柊</el-button>
</el-form-item>
</el-form>
</el-card>
@@ -39,12 +33,7 @@
</div>
<div class="card-content">
<div class="card-title">浠婃棩鍏ュ簱鎬婚噺</div>
- <div class="card-value">{{ todayInStock.toFixed(2) }} 鍚�</div>
- <div class="card-percentage" :class="{ positive: todayInStockPercentage > 0, negative: todayInStockPercentage < 0 }">
- <i v-if="todayInStockPercentage > 0" class="el-icon-caret-top" />
- <i v-else-if="todayInStockPercentage < 0" class="el-icon-caret-bottom" />
- {{ Math.abs(todayInStockPercentage).toFixed(1) }}%
- </div>
+ <div class="card-value">{{ todayInboundTotal.toFixed(2) }} 鍚�</div>
</div>
</div>
@@ -54,27 +43,7 @@
</div>
<div class="card-content">
<div class="card-title">浠婃棩鍑哄簱鎬婚噺</div>
- <div class="card-value">{{ todayOutStock.toFixed(2) }} 鍚�</div>
- <div class="card-percentage" :class="{ positive: todayOutStockPercentage > 0, negative: todayOutStockPercentage < 0 }">
- <i v-if="todayOutStockPercentage > 0" class="el-icon-caret-top" />
- <i v-else-if="todayOutStockPercentage < 0" class="el-icon-caret-bottom" />
- {{ Math.abs(todayOutStockPercentage).toFixed(1) }}%
- </div>
- </div>
- </div>
-
- <div class="stat-card">
- <div class="card-icon">
- <i class="el-icon-takeaway-box" />
- </div>
- <div class="card-content">
- <div class="card-title">浠婃棩棰嗘枡鎬婚噺</div>
- <div class="card-value">{{ todayMaterialPick.toFixed(2) }} 鍚�</div>
- <div class="card-percentage" :class="{ positive: todayMaterialPickPercentage > 0, negative: todayMaterialPickPercentage < 0 }">
- <i v-if="todayMaterialPickPercentage > 0" class="el-icon-caret-top" />
- <i v-else-if="todayMaterialPickPercentage < 0" class="el-icon-caret-bottom" />
- {{ Math.abs(todayMaterialPickPercentage).toFixed(1) }}%
- </div>
+ <div class="card-value">{{ todayOutboundTotal.toFixed(2) }} 鍚�</div>
</div>
</div>
@@ -111,20 +80,6 @@
</div>
</div>
- <!-- 浜у湴鍒嗙被 -->
- <div class="category-section">
- <h3 class="category-title"><i class="el-icon-location"></i> 浜у湴鍒嗗竷</h3>
- <div class="category-items">
- <div v-for="item in originData" :key="item.name" class="category-item">
- <span class="item-name">{{ item.name }}</span>
- <div class="item-bar">
- <div class="item-progress" :style="{ width: item.percentage + '%' }"></div>
- </div>
- <span class="item-value">{{ item.value.toFixed(2) }} 鍚� ({{ item.percentage.toFixed(1) }}%)</span>
- </div>
- </div>
- </div>
-
<!-- 鐑�煎垎绫� -->
<div class="category-section">
<h3 class="category-title"><i class="el-icon-fire"></i> 鐑�煎垎甯�</h3>
@@ -142,13 +97,17 @@
<!-- 杞︽缂栫爜鍒嗙被 -->
<div class="category-section">
<h3 class="category-title"><i class="el-icon-train"></i> 杞︽缂栫爜缁熻</h3>
- <el-table :data="trainCodeData" style="width: 100%">
- <el-table-column prop="trainCode" label="杞︽缂栫爜" width="160" />
- <el-table-column prop="count" label="娆℃暟" width="100" align="right" />
- <el-table-column prop="totalQuantity" label="鎬婚噺(鍚�)" width="120" align="right">
- <template #default="scope">{{ scope.row.totalQuantity.toFixed(2) }}</template>
- </el-table-column>
- </el-table>
+ <div class="train-code-list">
+ <div v-for="item in trainCodeData" :key="item.code" class="train-code-item">
+ <div class="train-code-info">
+ <span class="train-code-label">{{ item.code }}</span>
+ <div class="train-code-details">
+ <span class="train-count">娆℃暟: {{ item.count }}</span>
+ <span class="train-total">鎬婚噺: {{ item.total.toFixed(2) }}鍚�</span>
+ </div>
+ </div>
+ </div>
+ </div>
</div>
</el-card>
@@ -160,24 +119,17 @@
</div>
</template>
<el-table v-loading="loading" :data="recentTransactions" style="width: 100%">
- <el-table-column prop="code" label="缂栫爜" width="160" />
- <el-table-column prop="type" label="绫诲瀷" width="80">
- <template #default="scope">
- <span class="type-tag"
- :class="{
- 'type-in': scope.row.type === '鍏ュ簱',
- 'type-out': scope.row.type === '鍑哄簱',
- 'type-pick': scope.row.type === '棰嗘枡'
- }">
- {{ scope.row.type }}
- </span>
- </template>
- </el-table-column>
- <el-table-column prop="coalType" label="鐓ょ" width="100" />
- <el-table-column prop="origin" label="浜у湴" width="100" />
- <el-table-column prop="calorificValue" label="鐑��" width="120" />
- <el-table-column prop="quantity" label="鏁伴噺(鍚�)" width="120" />
- <el-table-column prop="trainCode" label="杞︽缂栫爜" width="120" />
+ <el-table-column prop="id" label="搴忓彿" width="60" type="index" align="center"/>
+ <el-table-column prop="type" label="鐓ゆ枡绫诲瀷" width="100">
+ <template #default="scope">
+ <span>{{ scope.row.type === 1 ? '鎴愬搧' : scope.row.type === 2 ? '鍘熸枡' : '-' }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column prop="supplierName" label="渚涘簲鍟嗗悕绉�" />
+ <el-table-column prop="coalName" label="鐓ょ" />
+ <el-table-column prop="purchaseQuantity" label="閲囪喘鏁伴噺" width="100" />
+ <el-table-column prop="priceIncludingTax" label=" 鍗曚环锛堝惈绋庯級" />
+ <el-table-column prop="totalPriceIncludingTax" label="鎬讳环锛堝惈绋庯級" />
<el-table-column prop="createTime" label="鍒涘缓鏃堕棿" width="180" />
</el-table>
</el-card>
@@ -187,6 +139,7 @@
<script setup>
import { ref, onMounted } from 'vue'
import { ElMessage } from 'element-plus'
+import { getMaterialStatistics, getCoalTypeDistribution, getHeatValueDistribution, getCarCodeDistribution, getRecentTransaction } from '@/api/productionScheduling'
// 鎼滅储鍙傛暟
const searchParams = ref({
@@ -200,56 +153,86 @@
{
text: '浠婂ぉ',
value: () => {
+ const formatDate = (date) => {
+ const year = date.getFullYear()
+ const month = String(date.getMonth() + 1).padStart(2, '0')
+ const day = String(date.getDate()).padStart(2, '0')
+ return `${year}-${month}-${day}`
+ }
const end = new Date()
const start = new Date()
- return [start, end]
+ return [formatDate(start), formatDate(end)]
}
},
{
text: '鏄ㄥぉ',
value: () => {
+ const formatDate = (date) => {
+ const year = date.getFullYear()
+ const month = String(date.getMonth() + 1).padStart(2, '0')
+ const day = String(date.getDate()).padStart(2, '0')
+ return `${year}-${month}-${day}`
+ }
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24)
- return [start, end]
+ return [formatDate(start), formatDate(end)]
}
},
{
text: '杩�7澶�',
value: () => {
+ const formatDate = (date) => {
+ const year = date.getFullYear()
+ const month = String(date.getMonth() + 1).padStart(2, '0')
+ const day = String(date.getDate()).padStart(2, '0')
+ return `${year}-${month}-${day}`
+ }
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
- return [start, end]
+ return [formatDate(start), formatDate(end)]
}
},
{
text: '杩�30澶�',
value: () => {
+ const formatDate = (date) => {
+ const year = date.getFullYear()
+ const month = String(date.getMonth() + 1).padStart(2, '0')
+ const day = String(date.getDate()).padStart(2, '0')
+ return `${year}-${month}-${day}`
+ }
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
- return [start, end]
+ return [formatDate(start), formatDate(end)]
}
},
- {
+ {
text: '鏈湀',
value: () => {
+ const formatDate = (date) => {
+ const year = date.getFullYear()
+ const month = String(date.getMonth() + 1).padStart(2, '0')
+ const day = String(date.getDate()).padStart(2, '0')
+ return `${year}-${month}-${day}`
+ }
const end = new Date()
const start = new Date(end.getFullYear(), end.getMonth(), 1)
- return [start, end]
+ return [formatDate(start), formatDate(end)]
}
}
]
// 缁熻鏁版嵁
-const todayInStock = ref(1250.75)
-const todayInStockPercentage = ref(5.2)
-const todayOutStock = ref(890.30)
-const todayOutStockPercentage = ref(-2.1)
-const todayMaterialPick = ref(320.45)
-const todayMaterialPickPercentage = ref(10.3)
-const currentTotalStock = ref(15680.95)
+const todayInboundTotal = ref(0)
+const todayOutboundTotal = ref(0)
+const currentTotalStock = ref(0)
+
+// 鐧惧垎姣旀暟鎹紙鏍规嵁闇�瑕佷繚鐣欙級
+const todayInStockPercentage = ref(0)
+const todayOutStockPercentage = ref(0)
// 鍒嗙被鏁版嵁 - 鐓ょ鍒嗗竷
const coalTypeData = ref([
@@ -258,15 +241,6 @@
{ name: '瑜愮叅', value: 2800, percentage: 18.7 },
{ name: '璐叅', value: 2500, percentage: 16.7 },
{ name: '鐦︾叅', value: 2680, percentage: 17.9 }
-])
-
-// 鍒嗙被鏁版嵁 - 浜у湴鍒嗗竷
-const originData = ref([
- { name: '灞辫タ', value: 5200, percentage: 33.1 },
- { name: '鍐呰挋鍙�', value: 3800, percentage: 24.2 },
- { name: '闄曡タ', value: 2900, percentage: 18.5 },
- { name: '鏂扮枂', value: 2100, percentage: 13.4 },
- { name: '璐靛窞', value: 1680, percentage: 10.7 }
])
// 鍒嗙被鏁版嵁 - 鐑�煎垎甯�
@@ -279,23 +253,10 @@
])
// 鍒嗙被鏁版嵁 - 杞︽缂栫爜缁熻
-const trainCodeData = ref([
- { trainCode: 'C12345', count: 12, totalQuantity: 4200.5 },
- { trainCode: 'C12346', count: 8, totalQuantity: 2800.2 },
- { trainCode: 'C12347', count: 10, totalQuantity: 3500.0 },
- { trainCode: 'C12348', count: 7, totalQuantity: 2450.8 },
- { trainCode: 'C12349', count: 5, totalQuantity: 1800.3 }
-])
+const trainCodeData = ref([])
-// 妯℃嫙鏁版嵁 - 鏈�杩戜氦鏄撹褰�
-const recentTransactions = ref([
- { code: 'RK20230507001', type: '鍏ュ簱', coalType: '鐑熺叅', origin: '灞辫タ', calorificValue: '5300澶у崱', quantity: 350.5, trainCode: 'C12345', createTime: '2023-05-07 09:30:15' },
- { code: 'CK20230507001', type: '鍑哄簱', coalType: '鏃犵儫鐓�', origin: '鍐呰挋鍙�', calorificValue: '5800澶у崱', quantity: 280.2, trainCode: 'C12346', createTime: '2023-05-07 10:15:30' },
- { code: 'LL20230507001', type: '棰嗘枡', coalType: '瑜愮叅', origin: '鏂扮枂', calorificValue: '4200澶у崱', quantity: 120.8, trainCode: '', createTime: '2023-05-07 11:05:45' },
- { code: 'RK20230507002', type: '鍏ュ簱', coalType: '璐叅', origin: '闄曡タ', calorificValue: '5100澶у崱', quantity: 400.0, trainCode: 'C12347', createTime: '2023-05-07 13:20:00' },
- { code: 'CK20230507002', type: '鍑哄簱', coalType: '鐦︾叅', origin: '璐靛窞', calorificValue: '5400澶у崱', quantity: 310.5, trainCode: 'C12348', createTime: '2023-05-07 14:45:15' },
- { code: 'LL20230507002', type: '棰嗘枡', coalType: '鐑熺叅', origin: '灞辫タ', calorificValue: '5300澶у崱', quantity: 200.0, trainCode: '', createTime: '2023-05-07 15:30:30' }
-])
+// 鏈�杩戜氦鏄撹褰曟暟鎹�
+const recentTransactions = ref([])
// 鍔犺浇鐘舵��
const loading = ref(false)
@@ -306,52 +267,70 @@
loading.value = true
console.log('鎼滅储鍙傛暟:', searchParams.value)
- // 妯℃嫙API璇锋眰寤惰繜
- await new Promise(resolve => setTimeout(resolve, 800))
-
- // 妯℃嫙鏁版嵁鏇存柊
- todayInStock.value = 1000 + Math.random() * 500
- todayInStockPercentage.value = -10 + Math.random() * 20
- todayOutStock.value = 800 + Math.random() * 400
- todayOutStockPercentage.value = -10 + Math.random() * 20
- todayMaterialPick.value = 200 + Math.random() * 200
- todayMaterialPickPercentage.value = -10 + Math.random() * 20
- currentTotalStock.value = 15000 + Math.random() * 3000
-
- // 鏇存柊鍒嗙被鏁版嵁
- coalTypeData.value.forEach(item => {
- item.value = 2000 + Math.random() * 3000
- })
-
- originData.value.forEach(item => {
- item.value = 1500 + Math.random() * 4000
- })
-
- calorificData.value.forEach(item => {
- item.value = 500 + Math.random() * 5000
- })
-
- trainCodeData.value.forEach(item => {
- item.count = 3 + Math.floor(Math.random() * 15)
- item.totalQuantity = 1000 + Math.random() * 4000
- })
-
- // 閲嶆柊璁$畻鐧惧垎姣�
- const calculatePercentages = (data) => {
- const total = data.reduce((sum, item) => sum + item.value, 0)
- data.forEach(item => {
- item.percentage = total > 0 ? (item.value / total) * 100 : 0
- })
+ // 鏋勫缓璇锋眰鍙傛暟
+ const params = {
+ entryDateStart: searchParams.value.dateRange && searchParams.value.dateRange[0] ? searchParams.value.dateRange[0] : '',
+ entryDateEnd: searchParams.value.dateRange && searchParams.value.dateRange[1] ? searchParams.value.dateRange[1] : ''
}
- calculatePercentages(coalTypeData.value)
- calculatePercentages(originData.value)
- calculatePercentages(calorificData.value)
+ // 璋冪敤API鑾峰彇缁熻鏁版嵁
+ const response = await getMaterialStatistics(params)
- ElMessage.success('鏌ヨ鎴愬姛')
+ // 鏍规嵁椤圭洰涓叾浠栧湴鏂圭殑浠g爜椋庢牸锛屾鏌ュ搷搴旀垚鍔熺殑鏉′欢搴旇鏄痗ode === 200
+ if (response.code === 200 && response.data) {
+ // 鏇存柊缁熻鏁版嵁
+ todayInboundTotal.value = response.data.todayInboundTotal || 0
+ todayOutboundTotal.value = response.data.todayOutboundTotal || 0
+ currentTotalStock.value = response.data.currentInventoryTotal || 0
+
+ // 鍙互鍦ㄨ繖閲屾坊鍔犵櫨鍒嗘瘮鐨勮绠楅�昏緫锛屽鏋淎PI杩斿洖浜嗙浉鍏虫暟鎹�
+ // 鏆傛椂淇濈暀鍘熸湁鐨勬ā鎷熺櫨鍒嗘瘮鏁版嵁
+ todayInStockPercentage.value = -10 + Math.random() * 20
+ todayOutStockPercentage.value = -10 + Math.random() * 20
+ }
+
+ // 璋冪敤API鑾峰彇鐓ょ鍒嗗竷鏁版嵁
+ const coalTypeResponse = await getCoalTypeDistribution(params)
+
+ if (coalTypeResponse.code === 200 && coalTypeResponse.data) {
+ // 鏍规嵁鎺ュ彛鍝嶅簲鏇存柊鐓ょ鍒嗗竷鏁版嵁
+ coalTypeData.value = coalTypeResponse.data.map(item => ({
+ name: item.name || '',
+ value: item.value || 0,
+ percentage: item.percent || 0
+ }))
+ }
+
+ // 璋冪敤API鑾峰彇鐑�煎垎甯冩暟鎹�
+ const heatValueResponse = await getHeatValueDistribution(params)
+
+ if (heatValueResponse.code === 200 && heatValueResponse.data) {
+ // 鏍规嵁鎺ュ彛鍝嶅簲鏇存柊鐑�煎垎甯冩暟鎹�
+ calorificData.value = heatValueResponse.data.map(item => ({
+ name: item.name || '',
+ value: item.value || 0,
+ percentage: item.percent || 0
+ }))
+ }
+
+ // 璋冪敤API鑾峰彇杞︽缂栫爜鍒嗗竷鏁版嵁
+ const carCodeResponse = await getCarCodeDistribution(params)
+
+ if (carCodeResponse.code === 200 && carCodeResponse.data) {
+ // 鏍规嵁鎺ュ彛鍝嶅簲鏇存柊杞︽缂栫爜鏁版嵁
+ trainCodeData.value = carCodeResponse.data
+ }
+
+ // 璋冪敤API鑾峰彇鏈�杩戜氦鏄撹褰�
+ const transactionResponse = await getRecentTransaction(params)
+
+ if (transactionResponse.code === 200 && transactionResponse.data) {
+ // 鏍规嵁鎺ュ彛鍝嶅簲鏇存柊鏈�杩戜氦鏄撹褰曟暟鎹�
+ // 鐢变簬鎺ュ彛杩斿洖鐨勬暟鎹粨鏋勪笌琛ㄦ牸鎵�闇�鐨勭粨鏋勪笉瀹屽叏鍖归厤锛岄渶瑕佽繘琛屽瓧娈垫槧灏�
+ recentTransactions.value = transactionResponse.data
+ }
} catch (error) {
console.error('鏌ヨ澶辫触:', error)
- ElMessage.error('鏌ヨ澶辫触锛岃绋嶅悗閲嶈瘯')
} finally {
loading.value = false
}
@@ -383,10 +362,17 @@
// 鍒濆鍖栭〉闈�
onMounted(() => {
// 榛樿鏌ヨ杩�7澶╂暟鎹�
+ const formatDate = (date) => {
+ const year = date.getFullYear()
+ const month = String(date.getMonth() + 1).padStart(2, '0')
+ const day = String(date.getDate()).padStart(2, '0')
+ return `${year}-${month}-${day}`
+ }
+
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
- searchParams.value.dateRange = [start, end]
+ searchParams.value.dateRange = [formatDate(start), formatDate(end)]
// 鍒濆鍔犺浇鏁版嵁
handleSearch()
@@ -530,6 +516,44 @@
gap: 8px;
}
+.train-code-list {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 12px;
+}
+
+.train-code-item {
+ flex: 1;
+ min-width: 200px;
+ padding: 16px;
+ background-color: #f5f7fa;
+ border-radius: 8px;
+}
+
+.train-code-info {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+.train-code-label {
+ font-size: 16px;
+ font-weight: 600;
+ color: #409eff;
+}
+
+.train-code-details {
+ display: flex;
+ justify-content: space-between;
+ font-size: 14px;
+ color: #606266;
+}
+
+.train-count,
+.train-total {
+ display: inline-block;
+}
+
.category-items {
display: flex;
flex-direction: column;
@@ -612,6 +636,18 @@
border: 1px solid #FFCCC7;
}
+/* 淇鏃ユ湡閫夋嫨鍣ㄨ鍔ㄤ簨浠剁洃鍚櫒闂 */
+.el-date-editor {
+ touch-action: none;
+}
+
+/* 绂佺敤鏃ユ湡閫夋嫨鍣ㄧ殑榛樿閫夋嫨鍣ㄦ寚绀哄櫒鐨勮Е鎽镐氦浜� */
+.el-date-picker__editor-wrap .el-input__inner::-webkit-calendar-picker-indicator {
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ user-select: none;
+}
+
/* 鍝嶅簲寮忚璁� */
@media screen and (max-width: 1200px) {
.stats-cards {
--
Gitblit v1.9.3