Files
klp-oa/klp-ui/src/views/wms/order/dashboard.vue

218 lines
5.7 KiB
Vue
Raw Normal View History

2025-07-22 15:30:55 +08:00
<template>
2025-07-22 16:28:43 +08:00
<div
class="order-analysis-dashboard"
v-loading="loading"
>
<!-- 顶部操作栏刷新和定时刷新设置按钮 -->
<el-row :gutter="20" class="top-row" style="margin-bottom: 0;">
<el-col :span="24" style="display: flex; justify-content: flex-end; align-items: center; margin-bottom: 10px;">
<el-button type="primary" icon="el-icon-refresh" @click="handleRefresh">刷新</el-button>
<el-button icon="el-icon-setting" style="margin-left: 10px;" @click="drawerVisible = true">定时刷新设置</el-button>
</el-col>
</el-row>
2025-07-30 10:54:11 +08:00
<!-- 业绩区 -->
<el-row :gutter="20" class="section-row">
<el-col :span="24">
<div class="section-title">
<h2>业绩区</h2>
<p>产品销售情况销售人员业绩总订单数量</p>
</div>
<PerformanceArea :performance-area="dashboardData.performanceArea" />
</el-col>
</el-row>
<!-- 当前情况区 -->
<el-row :gutter="20" class="section-row">
<el-col :span="24">
<div class="section-title">
<h2>情况区</h2>
<p>订单所需的产品统计根据参数计算的原料需求原料库存和需求情况</p>
2025-07-30 10:54:11 +08:00
</div>
<CurrentSituationArea :current-situation-area="dashboardData.currentSituationArea" />
</el-col>
</el-row>
<!-- 推荐区 -->
<el-row :gutter="20" class="section-row">
<el-col :span="24">
<div class="section-title">
<h2>推荐区</h2>
<p>订单维度推荐原料维度推荐</p>
</div>
<RecommendationArea :recommendation-area="dashboardData.recommendationArea" />
</el-col>
</el-row>
2025-07-22 16:28:43 +08:00
<!-- 定时刷新设置抽屉 -->
<el-drawer
title="定时刷新设置"
:visible.sync="drawerVisible"
direction="rtl"
size="350px"
>
<el-form label-width="100px">
<el-form-item label="启用定时刷新">
<el-switch v-model="autoRefresh" />
</el-form-item>
<el-form-item label="刷新间隔(秒)">
2025-08-25 11:46:03 +08:00
<el-input-number :controls=false controls-position="right" v-model="refreshInterval" :min="5" :max="3600" :step="1" :disabled="!autoRefresh" />
2025-07-22 16:28:43 +08:00
</el-form-item>
<el-form-item>
<el-button type="primary" @click="saveRefreshSetting">保存</el-button>
<el-button @click="drawerVisible = false">取消</el-button>
</el-form-item>
</el-form>
</el-drawer>
2025-07-22 15:30:55 +08:00
</div>
</template>
<script>
2025-07-30 10:54:11 +08:00
import PerformanceArea from './components/PerformanceArea.vue'
import CurrentSituationArea from './components/CurrentSituationArea.vue'
import RecommendationArea from './components/RecommendationArea.vue'
2025-07-22 15:30:55 +08:00
import { getDashboardData } from '@/api/wms/order'
export default {
name: 'OrderAnalysisDashboard',
components: {
2025-07-30 10:54:11 +08:00
PerformanceArea,
CurrentSituationArea,
RecommendationArea,
2025-07-22 15:30:55 +08:00
},
data() {
return {
2025-07-30 10:54:11 +08:00
// 新的数据结构
dashboardData: {
performanceArea: {},
currentSituationArea: {},
recommendationArea: {}
},
2025-07-22 16:28:43 +08:00
// 新增定时刷新相关数据
drawerVisible: false,
autoRefresh: false,
refreshInterval: 30, // 默认30秒
refreshTimer: null,
loading: false
2025-07-22 15:30:55 +08:00
}
},
created() {
this.fetchAllData()
2025-07-22 16:28:43 +08:00
this.loadRefreshSetting()
this.startAutoRefresh()
},
beforeDestroy() {
this.clearAutoRefresh()
2025-07-22 15:30:55 +08:00
},
methods: {
async fetchAllData() {
2025-07-22 16:28:43 +08:00
this.loading = true
try {
const res = await getDashboardData()
const data = res
2025-07-30 10:54:11 +08:00
// 更新新的数据结构
this.dashboardData = {
performanceArea: data.performanceArea || {},
currentSituationArea: data.currentSituationArea || {},
recommendationArea: data.recommendationArea || {}
}
} catch (error) {
console.error('获取数据看板数据失败:', error)
this.$message.error('获取数据失败,请稍后重试')
2025-07-22 16:28:43 +08:00
} finally {
this.loading = false
}
},
handleRefresh() {
this.fetchAllData()
},
// 定时刷新相关
startAutoRefresh() {
this.clearAutoRefresh()
if (this.autoRefresh) {
this.refreshTimer = setInterval(() => {
this.fetchAllData()
}, this.refreshInterval * 1000)
}
},
clearAutoRefresh() {
if (this.refreshTimer) {
clearInterval(this.refreshTimer)
this.refreshTimer = null
}
},
saveRefreshSetting() {
// 可持久化到localStorage
localStorage.setItem('orderDashboardAutoRefresh', JSON.stringify({
autoRefresh: this.autoRefresh,
refreshInterval: this.refreshInterval
}))
this.drawerVisible = false
this.startAutoRefresh()
},
loadRefreshSetting() {
const setting = localStorage.getItem('orderDashboardAutoRefresh')
if (setting) {
const { autoRefresh, refreshInterval } = JSON.parse(setting)
this.autoRefresh = autoRefresh
this.refreshInterval = refreshInterval
}
}
},
watch: {
autoRefresh(val) {
if (!val) {
this.clearAutoRefresh()
}
},
refreshInterval(val) {
if (this.autoRefresh) {
this.startAutoRefresh()
}
2025-07-22 15:30:55 +08:00
}
}
}
</script>
<style scoped>
.order-analysis-dashboard {
padding: 24px;
box-sizing: border-box;
}
2025-07-30 10:54:11 +08:00
.section-row {
margin-bottom: 30px;
}
.section-title {
margin-bottom: 20px;
padding: 0 10px;
}
.section-title h2 {
margin: 0 0 8px 0;
font-size: 20px;
font-weight: 600;
2025-09-02 15:39:51 +08:00
color: #ddd;
2025-07-30 10:54:11 +08:00
}
.section-title p {
margin: 0;
font-size: 14px;
2025-09-02 15:39:51 +08:00
color: #ccc;
2025-07-30 10:54:11 +08:00
}
2025-07-22 15:30:55 +08:00
.top-row,
.chart-row {
margin-bottom: 20px;
}
.chart-row > .el-col {
display: flex;
flex-direction: column;
justify-content: stretch;
}
</style>