From d815fbd281d6bb9c1fff1712614bf9738fd32d73 Mon Sep 17 00:00:00 2001
From: zhouwx <1175765986@qq.com>
Date: Thu, 15 Aug 2024 17:29:12 +0800
Subject: [PATCH] 工作台
---
src/layout/components/Sidebar/menu.js | 34 +++
src/api/hazardousChemicals/count.js | 38 +++
package.json | 3
src/api/hazardousChemicals/warning.js | 8
src/views/hazardousChemicals/overdueWarning/index.vue | 37 +++
src/views/hazardousChemicals/traceableQuery/index.vue | 21 +-
src/views/hazardousChemicals/homePage/index.vue | 428 ++++++++++++++++++++++++++++++++++++++++++
src/router/index.js | 14 +
8 files changed, 560 insertions(+), 23 deletions(-)
diff --git a/package.json b/package.json
index 7c2504d..1d3e356 100644
--- a/package.json
+++ b/package.json
@@ -23,7 +23,7 @@
"@wangeditor/editor-for-vue": "^5.1.12",
"@wangeditor/plugin-upload-attachment": "^1.1.0",
"axios": "0.27.2",
- "echarts": "5.4.0",
+ "echarts": "^5.4.0",
"element-plus": "2.2.27",
"file-saver": "2.0.5",
"fuse.js": "6.6.2",
@@ -43,6 +43,7 @@
"vue-qr": "^4.0.9",
"vue-quill-editor": "^3.0.6",
"vue-router": "4.1.4",
+ "vue3-count-to": "^1.1.2",
"vue3-json-excel": "^1.0.10-alpha",
"wangeditor5-for-vue3": "^0.1.0"
},
diff --git a/src/api/hazardousChemicals/count.js b/src/api/hazardousChemicals/count.js
new file mode 100644
index 0000000..cb84b3d
--- /dev/null
+++ b/src/api/hazardousChemicals/count.js
@@ -0,0 +1,38 @@
+import request from "@/utils/request";
+
+export function getHoData() {
+ return request({
+ url: '/statistic/homeDataStatistic',
+ method: 'get',
+ })
+}
+
+export function getEntryData() {
+ return request({
+ url: '/statistic/entryStatistic',
+ method: 'get',
+ })
+}
+
+export function getUseData() {
+ return request({
+ url: '/statistic/useStatistic',
+ method: 'get',
+ })
+}
+
+export function getMaxUseData() {
+ return request({
+ url: '/statistic/maxUseStatistic',
+ method: 'get',
+ })
+}
+
+
+export function getHazmatUseList(params) {
+ return request({
+ url: '/statistic/hazmatUseStatistic',
+ method: 'get',
+ data: params
+ })
+}
diff --git a/src/api/hazardousChemicals/warning.js b/src/api/hazardousChemicals/warning.js
index e26e81f..c442af6 100644
--- a/src/api/hazardousChemicals/warning.js
+++ b/src/api/hazardousChemicals/warning.js
@@ -14,3 +14,11 @@
method: 'delete'
})
}
+
+export function handleWarning(params) {
+ return request({
+ url: `/warning/markWarning`,
+ method: 'put',
+ data: params
+ })
+}
diff --git a/src/layout/components/Sidebar/menu.js b/src/layout/components/Sidebar/menu.js
index 28af68b..b017f9e 100644
--- a/src/layout/components/Sidebar/menu.js
+++ b/src/layout/components/Sidebar/menu.js
@@ -2,6 +2,19 @@
const menu = {
adminMenu: [
{
+ path: '/homePage',
+ redirect: '/homePage',
+ meta: { title: '首页',icon: 'server'},
+ children: [
+
+ {
+ path: 'homePage',
+ name: 'company',
+ meta: { title: '工作台',icon: 'server'}
+ } ,
+ ]
+ },
+ {
path: '/warehouseManage',
name: 'warehouseManage',
meta: { title: '入库管理',icon: 'form',affix: true }
@@ -35,12 +48,12 @@
{
path: '/basicInfo',
name: 'basicInfo',
- meta: { title: '危化品基础信息',icon: 'server',affix: true }
+ meta: { title: '危化品基础信息',icon: 'monitor',affix: true }
},
{
path: '/finishedBasicInfo',
name: 'finishedBasicInfo',
- meta: { title: '成品基础信息',icon: 'server',affix: true }
+ meta: { title: '成品基础信息',icon: 'monitor',affix: true }
},
{
path: '/systemManage',
@@ -71,6 +84,19 @@
},
],
companyMenu: [
+ {
+ path: '/homePage',
+ redirect: '/homePage',
+ meta: { title: '首页',icon: 'server'},
+ children: [
+
+ {
+ path: 'homePage',
+ name: 'company',
+ meta: { title: '工作台',icon: 'server'}
+ } ,
+ ]
+ },
{
path: '/warehouseManage',
name: 'warehouseManage',
@@ -104,12 +130,12 @@
{
path: '/basicInfo',
name: 'basicInfo',
- meta: { title: '危化品基础信息',icon: 'server',affix: true }
+ meta: { title: '危化品基础信息',icon: 'monitor',affix: true }
},
{
path: '/finishedBasicInfo',
name: 'finishedBasicInfo',
- meta: { title: '成品基础信息',icon: 'server',affix: true }
+ meta: { title: '成品基础信息',icon: 'monitor',affix: true }
},
{
path: '/systemManage',
diff --git a/src/router/index.js b/src/router/index.js
index 00443bb..f215420 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -183,6 +183,20 @@
]
},
{
+ path: '/homePage',
+ component: Layout,
+ redirect: '/homePage',
+ meta: { title: '首页'},
+ children: [
+ {
+ path: 'homePage',
+ component: () => import('@/views/hazardousChemicals/homePage/index.vue'),
+ name: 'homePage',
+ meta: { title: '工作台',icon: 'form'}
+ },
+ ]
+ },
+ {
path: '/systemManage',
component: Layout,
redirect: '/systemManage/warehouse',
diff --git a/src/views/hazardousChemicals/homePage/index.vue b/src/views/hazardousChemicals/homePage/index.vue
new file mode 100644
index 0000000..ea7e813
--- /dev/null
+++ b/src/views/hazardousChemicals/homePage/index.vue
@@ -0,0 +1,428 @@
+<template>
+ <div class="homePage">
+ <el-row :gutter="20" justify="space-between" style="margin-bottom: 15px">
+ <el-col :xl="6" :lg="6" :md="12" :sm="12" :xs="24" v-for="(item,index) in data.cardList" :key="index">
+ <el-card style="margin-bottom: 5px">
+ <div class="cardContent">
+ <img :src='item.imgUrl' :class="index !== 3 ? 'imgW' :'imgT' " />
+ <div class="cardRight">
+ <span style="font-size: 17px">{{item.title}}</span>
+ <countTo
+ style="font-weight: 700;font-size: 22px"
+ :startVal="item.startVal"
+ :endVal="item.endVal"
+ :duration="item.duration"
+ >
+ </countTo>
+ </div>
+ </div>
+ </el-card>
+ </el-col>
+ </el-row>
+ <div>
+ <el-row :gutter="20" justify="space-between" style="margin-bottom: 15px">
+ <el-col :xl="12" :lg="12" :md="24" :sm="24" :xs="24">
+ <el-card style="margin-bottom: 5px">
+ <div :id="pieChart" style="width: 100%;height: 300px"></div>
+ </el-card>
+ </el-col>
+ <el-col :xl="12" :lg="12" :md="24" :sm="24" :xs="24">
+ <el-card class="right">
+ <div :id="barChart" style="width: 100%;height: 300px"></div>
+ </el-card>
+ </el-col>
+ </el-row>
+ </div>
+ <div>
+ <el-row :gutter="20" justify="space-between" style="margin-bottom: 15px">
+ <el-col :xl="24" :lg="24" :md="24" :sm="24" :xs="24">
+ <el-card style="margin-bottom: 5px">
+ <div :id="lineChart" style="width: 100%;height: 300px"></div>
+ </el-card>
+ </el-col>
+ </el-row>
+ </div>
+ <div>
+ <el-row :gutter="20" justify="space-between" style="margin-bottom: 15px">
+ <el-col :xl="12" :lg="12" :md="24" :sm="24" :xs="24">
+ <el-card>
+ <span style="font-size: 18px;font-weight: 600;margin-left: 45%">超期预警</span>
+ <el-table height="320" v-loading="data.wloading" :data="data.warningData" style="margin-top: 15px">
+ <el-table-column label="序号" type="index" align="center" width="80" />
+ <el-table-column label="生成时间" prop="createTime" align="center" />
+ <el-table-column label="领用人" prop="createName" align="center" />
+ <el-table-column label="领用时间" prop="useTime" align="center" />
+ <el-table-column label="最后流转时间" prop="updateTime" align="center" width="180" />
+ <el-table-column label="处理时间" prop="handleTime" align="center" />
+ <el-table-column label="状态" prop="name" align="center" >
+ <template #default="scope">
+ <span>{{scope.row.state === 0 ? '未处理':'已处理'}}</span>
+ </template>
+ </el-table-column>
+ </el-table>
+ <pagination
+ :total="data.wTotal"
+ v-model:page="data.warningQueryParams.pageNum"
+ v-model:limit="data.warningQueryParams.pageSize"
+ @pagination="getWarningData"
+ />
+ </el-card>
+
+ </el-col>
+ <el-col :xl="12" :lg="12" :md="24" :sm="24" :xs="24">
+ <el-card>
+ <span style="font-size: 18px;font-weight: 600;margin-left: 45%">危化品使用</span>
+ <el-table height="320" v-loading="data.hloading" :data="data.hazmatData" style="margin-top: 15px">
+ <el-table-column label="名称" prop="name" align="center" />
+ <el-table-column label="产品编号" prop="hazmatBasic.productSn" align="center" />
+ <el-table-column label="CAS" prop="hazmatBasic.cas" align="center"/>
+ <el-table-column label="试剂类型" prop="hazmatBasic.hazmatType" align="center"/>
+ <el-table-column label="危险性质" prop="hazmatBasic.hazmatCharacter" align="center"/>
+ <el-table-column label="供应商" prop="hazmatBasic.supplier" align="center"/>
+ <el-table-column label="厂家" prop="hazmatBasic.manufacturer" align="center"/>
+ <el-table-column label="规格" prop="hazmatBasic.hazmatCharacter" align="center"/>
+ <el-table-column label="包装" prop="hazmatBasic.metering" align="center">
+ <template #default="scope">
+ <span>{{scope.row.hazmatBasic.metering}}{{scope.row.hazmatBasic.unit}}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="含税售价" prop="hazmatBasic.price" align="center"/>
+ <el-table-column label="每箱数量" prop="hazmatBasic.perBox" align="center"/>
+ <el-table-column label="最小包装类型" prop="minPackage" align="center" width="220">
+ <template #default="scope">
+ <span>{{scope.row.hazmatBasic.minPackage == 0 ? '瓶' :scope.row.hazmatBasic.minPackage == 1?'袋':scope.row.hazmatBasic.minPackage == 2?'桶 ':scope.row.hazmatBasic.minPackage == 3?'盒':scope.row.hazmatBasic.minPackage == 4?'箱':'其他'}}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="安全库存" prop="hazmatBasic.safeNum" align="center"/>
+ <el-table-column label="超期阈值(小时)" prop="hazmatBasic.threshold" align="center" width="220"/>
+ </el-table>
+ <pagination
+ :total="data.hTotal"
+ v-model:page="data.hazmatQueryParams.pageNum"
+ v-model:limit="data.hazmatQueryParams.pageSize"
+ @pagination="getHazmatUseData"
+ />
+ </el-card>
+ </el-col>
+ </el-row>
+ </div>
+ </div>
+</template>
+<script setup>
+import { CountTo } from 'vue3-count-to'
+import img1 from '@/assets/images/file.png'
+import hazmat from '@/assets/logo/hazmat.png'
+import warehouse from '@/assets/logo/warehouse.png'
+import warning from '@/assets/logo/warning1.png'
+import used from '@/assets/logo/used.png'
+import * as echarts from 'echarts';
+import {nextTick, onMounted, onUnmounted, reactive, ref, shallowRef} from "vue";
+import {getFinishBasicList} from "@/api/hazardousChemicals/finishedBasicInfo";
+import {ElMessage} from "element-plus";
+import {getEntryData, getHazmatUseList, getHoData, getMaxUseData, getUseData} from "@/api/hazardousChemicals/count";
+import {getWarning} from "@/api/hazardousChemicals/warning";
+const data = reactive({
+ cardList: [
+ {
+ title: '危化品数量',
+ imgUrl: hazmat,
+ startVal: 0,
+ endVal: null,
+ duration: 1500
+ },
+ {
+ title: '使用量',
+ imgUrl: used,
+ startVal: 0,
+ endVal: null,
+ duration: 1500
+ },
+ {
+ title: '仓库数量',
+ imgUrl: warehouse,
+ startVal: 0,
+ endVal: null,
+ duration: 1500
+ },
+ {
+ title: '预警量',
+ imgUrl: warning,
+ startVal: 0,
+ endVal: null,
+ duration: 1500
+ },
+ ],
+ maxUseList: [],
+ useXData: [],
+ useYData: [],
+ entryXData: [],
+ entryYData: [],
+ warningData: [],
+ warningQueryParams: {
+ pageNum: 1,
+ pageSize: 5
+ },
+ wTotal: 0,
+ wloading: false,
+ hTotal: 0,
+ hloading: false,
+ hazmatQueryParams: {
+ pageNum: 1,
+ pageSize: 10
+ },
+ hazmatData: []
+
+});
+const myChart = shallowRef(null)
+const pieChart = ref("eChartPieN" + Date .now() + Math .random())
+const myBarChart = shallowRef(null)
+const barChart = ref("eChartBarN" + Date .now() + Math .random())
+const myLineChart = shallowRef(null)
+const lineChart = ref("eChartBarN" + Date .now() + Math .random())
+
+onMounted(async () => {
+ await getHomeData()
+ await entryData()
+ await useData()
+ await maxUseData()
+ await getWarningData()
+ await getHazmatUseData()
+});
+const getWarningData = async () => {
+ data.wloading = true
+ const res = await getWarning(data.warningQueryParams)
+ if(res.code == 200){
+ data.warningData =res.data.list
+ data.wTotal = res.data.total
+ }else{
+ ElMessage.warning(res.message)
+ }
+ data.wloading = false
+}
+const getHazmatUseData = async () => {
+ data.hloading = true
+ const res = await getHazmatUseList(data.hazmatQueryParams)
+ if(res.code == 200){
+ data.hazmatData =res.data.list
+ data.hTotal = res.data.total
+ }else{
+ ElMessage.warning(res.message)
+ }
+ data.hloading = false
+}
+const getHomeData = async () => {
+ const res = await getHoData(data.queryParams)
+ if(res.code == 200){
+ data.cardList[0].endVal = res.data.hazmatCount
+ data.cardList[1].endVal = res.data.usedCount
+ data.cardList[2].endVal = res.data.warehouseCount
+ data.cardList[3].endVal = res.data.warningCount
+ }else{
+ ElMessage.warning(res.message)
+ }
+}
+const entryData = async () => {
+ const res = await getEntryData()
+ if(res.code == 200){
+ data.entryXData = res.data.map(item => item.month+'月' + item.day+'日')
+ data.entryYData = res.data.map(item =>item.count)
+ await getLineChart()
+ }else{
+ ElMessage.warning(res.message)
+ }
+}
+const useData = async () => {
+ const res = await getUseData()
+ if(res.code == 200){
+ data.useXData = res.data.map(item => item.day+'日')
+ data.useYData = res.data.map(item =>item.count)
+ await getBarChart()
+ }else{
+ ElMessage.warning(res.message)
+ }
+}
+const maxUseData = async () => {
+ const res = await getMaxUseData()
+ if(res.code == 200){
+ data.maxUseList = res.data.map(item => {
+ return{
+ value: item.count,
+ name: item.name
+ }
+ })
+ await getPieChart()
+ }else{
+ ElMessage.warning(res.message)
+ }
+}
+const getPieChart = () => {
+ if (myChart.value != null && myChart.value != "" && myChart.value != undefined) {
+ myChart.value.dispose();
+ }
+ myChart.value = echarts.init(document.getElementById(pieChart.value));
+ const option = {
+ title: {
+ text: '近一周频繁使用的危化品量',
+ left: 'center'
+ },
+ tooltip: {
+ trigger: 'item'
+ },
+ legend: {
+ orient: 'vertical',
+ left: 'left'
+ },
+ series: [
+ {
+ name: 'Access From',
+ type: 'pie',
+ radius: '50%',
+ data: data.maxUseList,
+ emphasis: {
+ itemStyle: {
+ shadowBlur: 10,
+ shadowOffsetX: 0,
+ shadowColor: 'rgba(0, 0, 0, 0.5)'
+ }
+ }
+ }
+ ]
+ };
+ // 使用刚指定的配置项和数据显示图表。
+ myChart.value.setOption(option,true);
+ //自适应宽度
+ window.addEventListener('resize',function () {
+ myChart.value.resize();
+ })
+}
+
+const getBarChart = () => {
+ if (myBarChart.value != null && myBarChart.value != "" && myBarChart.value != undefined) {
+ myChart.value.dispose();
+ }
+ myBarChart.value = echarts.init(document.getElementById(barChart.value));
+ const option = {
+ title: {
+ text: '近一周使用量',
+ left: 'center'
+ },
+ tooltip: {
+ trigger: 'axis',
+ axisPointer: {
+ type: 'shadow'
+ }
+ },
+ grid: {
+ left: '3%',
+ right: '4%',
+ bottom: '3%',
+ containLabel: true
+ },
+ xAxis: {
+ type: 'category',
+ data: data.useXData,
+ axisTick: {
+ alignWithLabel: true
+ }
+ },
+ yAxis: {
+ type: 'value'
+ },
+ series: [
+ {
+ data: data.useYData,
+ type: 'bar',
+ barWidth: '60%',
+ }
+ ]
+ };
+ // 使用刚指定的配置项和数据显示图表。
+ myBarChart.value.setOption(option,true);
+ //自适应宽度
+ window.addEventListener('resize',function () {
+ myBarChart.value.resize();
+ })
+}
+
+
+const getLineChart = () => {
+ if (myLineChart.value != null && myLineChart.value != "" && myLineChart.value != undefined) {
+ myLineChart.value.dispose();
+ }
+ myLineChart.value = echarts.init(document.getElementById(lineChart.value));
+ const option = {
+ tooltip: {
+ trigger: 'axis'
+ },
+ title: {
+ text: '近30天入库量',
+ left: 'center'
+ },
+ grid: {
+ left: '3%',
+ right: '4%',
+ bottom: '3%',
+ top: '150px',
+ containLabel: true
+ },
+ xAxis: {
+ type: 'category',
+ data: data.entryXData
+ },
+ yAxis: {
+ type: 'value'
+ },
+ series: [
+ {
+ data: data.entryYData,
+ type: 'line',
+ smooth: true
+ }
+ ]
+ };
+ // 使用刚指定的配置项和数据显示图表。
+ myLineChart.value.setOption(option,true);
+ //自适应宽度
+ window.addEventListener('resize',function () {
+ myLineChart.value.resize();
+ })
+}
+
+
+</script>
+<style scoped lang="scss">
+.homePage{
+ padding: 20px;
+ background-color: white;
+ .imgW{
+ width: 50px;
+ height: 50px;
+ }
+ .imgT{
+ width: 70px;
+ height: 70px;
+ }
+ .cardContent{
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ .cardRight{
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ line-height: 35px
+ }
+ }
+
+ .content{
+ display: flex;
+ flex-wrap: wrap;
+ .right{
+ flex: 1;
+ }
+
+ }
+
+}
+
+</style>
diff --git a/src/views/hazardousChemicals/overdueWarning/index.vue b/src/views/hazardousChemicals/overdueWarning/index.vue
index de7dd3e..4b06f26 100644
--- a/src/views/hazardousChemicals/overdueWarning/index.vue
+++ b/src/views/hazardousChemicals/overdueWarning/index.vue
@@ -39,11 +39,11 @@
<!-- 表格数据 -->
<el-table v-loading="loading" :data="dataList" :border="true">
<el-table-column label="序号" type="index" align="center" width="80" />
- <el-table-column label="生成时间" prop="creditCode" align="center" />
- <el-table-column label="领用人" prop="name" align="center" />
- <el-table-column label="领用时间" prop="name" align="center" />
- <el-table-column label="最后流转时间" prop="name" align="center" />
- <el-table-column label="处理时间" prop="name" align="center" />
+ <el-table-column label="生成时间" prop="createTime" align="center" />
+ <el-table-column label="领用人" prop="createName" align="center" />
+ <el-table-column label="领用时间" prop="useTime" align="center" />
+ <el-table-column label="最后流转时间" prop="updateTime" align="center" />
+ <el-table-column label="处理时间" prop="handleTime" align="center" />
<el-table-column label="状态" prop="name" align="center" >
<template #default="scope">
<span>{{scope.row.state === 0 ? '未处理':'已处理'}}</span>
@@ -51,7 +51,7 @@
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="200" >
<template #default="scope">
- <el-button link type="primary" v-if="scope.row.state === 0">标记处理</el-button>
+ <el-button link type="primary" v-if="scope.row.state === 0" @click="markWarn(scope.row)">标记处理</el-button>
<el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
@@ -71,7 +71,7 @@
<script setup>
import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
import {ElMessage, ElMessageBox} from "element-plus";
-import {delWarning, getWarning} from "@/api/hazardousChemicals/warning";
+import {delWarning, getWarning, handleWarning} from "@/api/hazardousChemicals/warning";
const { proxy } = getCurrentInstance();
const loading = ref(false);
const dialogRef = ref();
@@ -140,6 +140,29 @@
}
})
}
+
+const markWarn = (val) => {
+ ElMessageBox.confirm(
+ '确定处理此条标签?',
+ '提示',
+ {
+ confirmButtonText: '确定',
+ cancelButtonText: '取消',
+ type: 'warning',
+ })
+ .then( async() => {
+ const res = await handleWarning(val.id)
+ if(res.code == 200){
+ ElMessage.success('处理成功')
+ await getList()
+ }else{
+ ElMessage.warning(res.message)
+ }
+ })
+}
+
+
+
const toDetail = () => {
data.queryParams.state = 0;
getList()
diff --git a/src/views/hazardousChemicals/traceableQuery/index.vue b/src/views/hazardousChemicals/traceableQuery/index.vue
index c2c67d4..5210f24 100644
--- a/src/views/hazardousChemicals/traceableQuery/index.vue
+++ b/src/views/hazardousChemicals/traceableQuery/index.vue
@@ -16,14 +16,14 @@
</el-form-item>
</el-form>
- <div style="display: flex;justify-content: center">
- <div class="content">
- <flow-deail ref="flowRef" v-if="data.showData"></flow-deail>
- <el-empty description="暂无数据" style="margin-top: 10%" v-else></el-empty>
- </div>
+ <div style="display: flex;justify-content: center;margin-top: 20px">
+ <el-card :style="{ height: '650px' ,overflow: 'auto'}">
+ <div class="content">
+ <flow-deail ref="flowRef" v-if="data.showData"></flow-deail>
+ <el-empty description="暂无数据" style="margin-top: 10%" v-else></el-empty>
+ </div>
+ </el-card>
</div>
-
-
</div>
</div>
@@ -68,11 +68,10 @@
<style scoped lang="scss">
.query{
.content{
- margin-top: 40px;
width: 650px;
- height: 650px;
- border: 1px solid black;
- overflow-y: scroll;
+ //height: 650px;
+ //border: 1px solid #c2bfbf;
+
}
}
</style>
--
Gitblit v1.9.2