<template>
|
<div class="homePage">
|
<div>
|
<el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
|
<el-form-item label="企业名称:" >
|
<el-select
|
clearable
|
v-model="data.queryParams.companyId"
|
filterable
|
remote
|
reserve-keyword
|
placeholder="请输入企业名称"
|
remote-show-suffix
|
:remote-method="getCompanyList"
|
style="width: 100%"
|
>
|
<el-option
|
v-for="item in data.companyList"
|
:key="item.id"
|
:label="item.name"
|
:value="item.id"
|
/>
|
</el-select>
|
</el-form-item>
|
<el-form-item >
|
<el-button
|
type="primary"
|
@click="getAllList"
|
>查询</el-button>
|
<el-button
|
type="primary"
|
plain
|
@click="reset"
|
>重置</el-button>
|
</el-form-item>
|
</el-form>
|
</div>
|
<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" >
|
<el-col :xl="12" :lg="12" :md="24" :sm="24" :xs="24" style="margin-bottom: 15px">
|
<el-card style="height: 500px;overflow: auto">
|
<span style="font-size: 18px;font-weight: 600;margin-bottom: -5px">危化品动态</span>
|
<el-divider style="margin: 15px 0"></el-divider>
|
<div style="padding: 10px;" v-if="data.hazmatData && data.hazmatData.length >0">
|
<div v-for="(item,index) in data.hazmatData" :key="index" style="display: flex;flex-direction: column">
|
<div style="display: flex">
|
<img :src="avator" style="width: 25px;height: 25px" />
|
<div style="display: flex;flex-direction: column;margin-left: 20px">
|
<span style="font-size: 16px;font-weight: 600">{{item.description}}
|
<span style="color: #03752e;font-weight: 600" v-if="item.num > 0">{{item.stateName}}</span>
|
<span style="color: #f6828e;font-weight: 600" v-else>{{item.stateName}}</span>
|
<span style="color: #03752e" v-if="item.num > 0">{{item.num >0 ? '+' + item.num: item.num}}{{item.unit}}</span>
|
<span style="color: #f6828e" v-else>{{item.num}}{{item.unit}}</span>
|
</span>
|
<span style="font-size: 14px;color: #8a8f97;margin-top: 5px">{{item.updateTime}}</span>
|
</div>
|
</div>
|
<el-divider style="margin: 15px 0" v-if="index != data.hazmatData.length-1"></el-divider>
|
</div>
|
</div>
|
<div v-else>
|
<el-empty description="暂无数据" style="margin-top: 10%"></el-empty>
|
</div>
|
</el-card>
|
</el-col>
|
<el-col :xl="12" :lg="12" :md="24" :sm="24" :xs="24">
|
<el-card style="height: 500px;overflow: auto">
|
<span style="font-size: 18px;font-weight: 600;margin-bottom: -5px">超期预警</span>
|
<el-divider style="margin: 15px 0"></el-divider>
|
<div style="padding: 10px;" v-if="data.warningData && data.warningData.length >0">
|
<div v-for="(item,index) in data.warningData" :key="index" style="display: flex;flex-direction: column">
|
<div style="display: flex">
|
<img :src="avator" style="width: 25px;height: 25px" />
|
<div style="display: flex;flex-direction: column;margin-left: 20px">
|
<span style="font-size: 16px;font-weight: 600">{{item.description}}
|
</span>
|
<span style="font-size: 14px;color: #8a8f97;margin-top: 5px">{{item.createTime}}</span>
|
</div>
|
</div>
|
<el-divider style="margin: 15px 0" v-if="index != data.hazmatData.length-1"></el-divider>
|
</div>
|
</div>
|
<div v-else>
|
<el-empty description="暂无数据" style="margin-top: 10%"></el-empty>
|
</div>
|
</el-card>
|
</el-col>
|
</el-row>
|
</div>
|
</div>
|
</template>
|
<script setup>
|
import { CountTo } from 'vue3-count-to'
|
import avator from '@/assets/images/avator.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";
|
import {getRawFlow} from "@/api/hazardousChemicals/rawRecord";
|
import {getCompany} from "@/api/hazardousChemicals/company";
|
const data = reactive({
|
queryParams: {
|
companyId: null
|
},
|
companyList:[],
|
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: [],
|
maxUseName: [],
|
useXData: [],
|
useYData: [],
|
entryXData: [],
|
entryYData: [],
|
warningData: [],
|
warningQueryParams: {
|
pageNum: 1,
|
pageSize: 10,
|
companyId: null
|
},
|
wTotal: 0,
|
wloading: false,
|
hTotal: 0,
|
hloading: false,
|
hazmatQueryParams: {
|
pageNum: 1,
|
pageSize: 10,
|
companyId: null
|
},
|
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 getCompanyList()
|
await getHazmatFlowData()
|
await getHomeData()
|
await entryData()
|
await useData()
|
await maxUseData()
|
await getWarningData()
|
|
});
|
const getWarningData = async () => {
|
data.wloading = true
|
data.warningQueryParams.companyId = data.queryParams.companyId
|
const res = await getWarning(data.warningQueryParams)
|
if(res.code == 200){
|
data.warningData =res.data.list.map(item => {
|
return {
|
...item,
|
description: `${item.createName} 领用了 ${item.hazmatBasic.name} 状态:${item.state ==0?'未处理':'已处理' }`
|
}
|
})
|
data.warningData = data.warningData.filter(item => item.state === 0)
|
}else{
|
ElMessage.warning(res.message)
|
}
|
data.wloading = false
|
}
|
const getHazmatFlowData = async () => {
|
data.hloading = true
|
data.hazmatQueryParams.companyId = data.queryParams.companyId
|
const res = await getRawFlow(data.hazmatQueryParams)
|
if(res.code == 200){
|
data.hazmatData =res.data.list.map(item => {
|
return {
|
...item,
|
unit:item.hazmatBasic.unit,
|
stateName: item.state ==0 ?'入库': item.state ==1 ? '取用' :item.state ==2 ? '归还': item.state ==3 ? '标签作废' : item.state ==4 ? '用尽登记':item.state ==5 ? '销售' : '',
|
description: `${item.user.departName ? item.user.departName +'部门' : ''} ${item.user.name} 进行了 `
|
}
|
})
|
console.log('data.hazmatData',data.hazmatData)
|
}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(data.queryParams)
|
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 getCompanyList = async (val)=>{
|
if(val){
|
const queryParams = {
|
name: val
|
}
|
const res = await getCompany(queryParams)
|
if (res.code == 200) {
|
data.companyList = res.data.list
|
} else {
|
ElMessage.warning(res.message)
|
}
|
}else {
|
const queryParams = {
|
pageNum: 1,
|
pageSize: 10
|
}
|
const res = await getCompany(queryParams)
|
if (res.code == 200) {
|
data.companyList = res.data.list
|
if(data.queryParams.companyId == null){
|
data.queryParams.companyId = data.companyList[0].id
|
}
|
|
} else {
|
ElMessage.warning(res.message)
|
}
|
}
|
}
|
const useData = async () => {
|
const res = await getUseData(data.queryParams)
|
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(data.queryParams)
|
if(res.code == 200){
|
data.maxUseList = res.data.map(item => {
|
return{
|
value: item.count,
|
name: item.name
|
}
|
})
|
data.maxUseName = res.data.map(item => 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));
|
let option;
|
option = {
|
title: {
|
text: '近一周频繁使用的危化品量',
|
left: 'center'
|
},
|
tooltip: {
|
trigger: 'item'
|
},
|
legend: {
|
orient: 'vertical',
|
left: 'left'
|
},
|
series: [
|
{
|
name: '',
|
type: 'pie',
|
radius: '50%',
|
data: data.maxUseList,
|
emphasis: {
|
itemStyle: {
|
shadowBlur: 10,
|
shadowOffsetX: 0,
|
shadowColor: 'rgba(0, 0, 0, 0.5)'
|
}
|
},
|
// showEmptyCircle: false,
|
}
|
]
|
};
|
|
|
|
// 使用刚指定的配置项和数据显示图表。
|
myChart.value.setOption(option,true);
|
//自适应宽度
|
window.addEventListener('resize',function () {
|
myChart.value.resize();
|
})
|
}
|
|
const getAllList = async () => {
|
await getHazmatFlowData()
|
await getHomeData()
|
await entryData()
|
await useData()
|
await maxUseData()
|
await getWarningData()
|
}
|
const reset = async () => {
|
data.queryParams.companyId = data.companyList[0].id
|
await getAllList()
|
}
|
|
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;
|
}
|
|
}
|
::-webkit-scrollbar {
|
width: 5px;
|
height: 5px;
|
background-color: #ffffff;
|
opacity: 0;
|
}
|
::-webkit-scrollbar-track {
|
border-radius: 10px;
|
background-color: #ffffff;
|
}
|
::-webkit-scrollbar-thumb {
|
border-radius: 10px;
|
/*-webkit-box-shadow: inset 0 0 6px rgba(154,154,154,.3);*/
|
background-color: #ffffff;
|
}
|
}
|
|
</style>
|