Files
bj_power/bj_power_wms_client/frontend/src/pages/Dashboard.vue
T
SunYF bb22148625 feat: 完成区域管理、装箱功能优化与接口标准化
- 新增区域状态字段与增删改查接口,支持区域启用/停用
- 重构实体字段JSON标签为camelCase格式统一接口规范
- 优化入库、盘点、装箱流程的交互与提示文案
- 新增装箱管理功能,支持合同号关联与装箱编辑
- 调整前端菜单与帮助文档适配业务场景变更
2026-09-01 13:49:44 +08:00

70 lines
2.4 KiB
Vue

<script setup>
import { onMounted, ref } from 'vue'
import { useRouter } from 'vue-router'
import { CircleCheck, Download, List, Monitor, Search, Upload, Box, Tickets, EditPen } from '@element-plus/icons-vue'
import request from '../utils/request'
import { fmtNum } from '../utils/format'
const router = useRouter()
const overview = ref({})
const loaded = ref(false)
async function load() {
overview.value = await request.get('/display/overview')
loaded.value = true
}
onMounted(load)
const cards = [
{ key: 'totalQty', label: '在库总量' },
{ key: 'lockedQty', label: '锁定量' },
{ key: 'snInStock', label: 'SN 在库数' },
{ key: 'semiInStock', label: '半成品在库' },
{ key: 'packageCount', label: '包装箱数' },
{ key: 'batchCount', label: '批次数' },
{ key: 'inToday', label: '今日入库单' },
{ key: 'outToday', label: '今日出库单' }
]
const entries = [
{ path: '/inbound', title: '入库管理', icon: Download },
{ path: '/outbound', title: '备料出库', icon: Upload },
{ path: '/inventory', title: '库存查询', icon: Search },
{ path: '/inspection', title: '质量检验', icon: CircleCheck },
{ path: '/stocktake', title: '库存盘点', icon: List },
{ path: '/semi', title: '半成品/成品', icon: Box },
{ path: '/package', title: '装箱管理', icon: Tickets },
{ path: '/ledger', title: '备料台账', icon: Tickets },
{ path: '/base-data', title: '基础数据', icon: EditPen },
{ path: '/display', title: '免登录大屏', icon: Monitor }
]
</script>
<template>
<div>
<el-row :gutter="12">
<el-col v-for="c in cards" :key="c.key" :xs="12" :sm="8" :md="6" style="margin-bottom:12px">
<el-card shadow="hover">
<div class="kpi-label">{{ c.label }}</div>
<div class="kpi-value">{{ loaded ? fmtNum(overview[c.key]) : '—' }}</div>
</el-card>
</el-col>
</el-row>
<el-card shadow="never" header="快捷入口">
<div class="entries">
<el-button v-for="e in entries" :key="e.path" size="large"
@click="router.push(e.path)">
<el-icon style="margin-right:6px"><component :is="e.icon" /></el-icon>{{ e.title }}
</el-button>
</div>
</el-card>
</div>
</template>
<style scoped>
.kpi-label { color: #909399; font-size: 13px; }
.kpi-value { font-size: 26px; font-weight: 700; margin-top: 4px; color: #303133; }
.entries { display: flex; flex-wrap: wrap; gap: 10px; }
</style>