鲁洪霞 2024-04-01 17:25:09 +08:00
parent 1306882ed0
commit 456855000a
10 changed files with 779 additions and 138 deletions

View File

@ -0,0 +1,132 @@
<template>
<el-card>
<div class="main">
<div class="title">年度培训情况统计</div>
<div class="num">
培训班级数: <span>8965 </span> 参与培训人员数: <span>8965 </span>
</div>
</div>
<div id="main1" />
</el-card>
</template>
<script setup>
import { onMounted } from "vue";
import * as echarts from "echarts";
let myChart1;
const annualTraining = () => {
myChart1 = echarts.init(document.querySelector("#main1"));
const option = {
title: {
text: "",
textStyle: {
fontSize: "14",
fontWeight: "700",
color: "#fff",
},
},
legend: {
data: ["培训班级数", "参与培训人员数"],
top: "5%",
textStyle: {
color: "#fff",
},
},
grid: {
left: "0%",
right: "8%",
bottom: "0%",
top: "20%",
containLabel: true,
},
tooltip: {
trigger: "axis",
},
xAxis: {
type: "category",
boundaryGap: false,
data: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
axisLabel: {
color: "#fff",
},
axisLine: {
lineStyle: {
color: "#102b60",
},
},
},
yAxis: {
type: "value",
axisLabel: {
color: "#fff",
},
axisLine: {
lineStyle: {
color: "#102b60",
},
},
splitLine: {
lineStyle: {
color: "#102b60",
},
},
},
series: [
{
name: "培训班级数",
type: "line",
data: [100, 560, 324, 21, 244, 566, 234, 456, 345, 55, 133, 122],
itemStyle: {
color: "#3ca272",
lineStyle: {
color: "#3ca272",
},
},
},
{
name: "参与培训人员数",
type: "line",
data: [243, 43, 54, 433, 44, 546, 234, 345, 46, 145, 222, 676],
itemStyle: {
color: "#5470c6",
lineStyle: {
color: "#5470c6",
},
},
},
],
};
myChart1.setOption(option);
};
onMounted(() => {
annualTraining();
});
</script>
<style scoped lang="scss">
.main {
display: flex;
justify-content: space-between;
font-size: 12px;
.title {
font-size: 14px;
font-weight: bold;
}
.num {
color: #ffffff;
span {
color: #087cca;
font-weight: bold;
font-size: 15px;
}
}
}
#main1 {
width: 500px;
height: 350px;
}
</style>

View File

@ -1,140 +1,77 @@
<template>
<el-row :gutter="10">
<el-col :span="9">
<el-card>
<div class="flex">
<div class="img">
<img src="/src/assets/images/index/icon1.png" alt="" />
</div>
<div
@click="
router.push({
path: '/hidden_danger_government/ledger',
query: { STATE: '4' },
})
"
>
<span>已验收</span>
<count-to :end-val="data.hidCount.yys" />
</div>
<div
@click="
router.push({
path: '/hidden_danger_government/ledger',
query: { STATE: '-1' },
})
"
>
<span>已超期</span>
<count-to :end-val="data.hidCount.ycq" />
</div>
<div
@click="
router.push({ path: '/hidden_danger_government/rectification' })
"
>
<span>待整改</span>
<count-to :end-val="data.hidCount.dzg" />
</div>
</div>
</el-card>
</el-col>
<el-col :span="9">
<el-card>
<div class="flex">
<div class="img">
<img src="/src/assets/images/index/icon2.png" alt="" />
</div>
<div @click="router.push({ path: '/risk_control/ledger' })">
<span>存在风险</span>
<count-to :end-val="data.riskCount.cnzfx" />
</div>
<div
@click="router.push({ path: '/risk_control/identifying_parts' })"
>
<span>辨识部位</span>
<count-to :end-val="data.riskCount.idcount" />
</div>
<div @click="router.push({ path: '/risk_control/risk_point' })">
<span>风险点(单元)</span>
<count-to :end-val="data.riskCount.unitcount" />
</div>
</div>
</el-card>
</el-col>
<el-col :span="6">
<el-card>
<div class="flex">
<div class="img">
<img src="/src/assets/images/index/icon3.png" alt="" />
</div>
<div>
<span>已使用存储</span>
<count-to
:end-val="(data.memoryUsage.total_usage / 1000 / 1000).toFixed(2)"
:options="{ suffix: 'MB' }"
/>
</div>
</div>
</el-card>
<el-col v-for="(item, index) in data.countlist" :key="index" :span="4">
<div class="wrap">
<div class="num">{{ item.num }}</div>
<div class="title">{{ item.title }}</div>
</div>
</el-col>
</el-row>
</template>
<script setup>
import { getHiddenCount, getMemoryUsage } from "@/request/index.js";
import { reactive } from "vue";
import CountTo from "vue-countup-v3";
import { useRouter } from "vue-router";
import { getRiskManagement } from "@/request/large_screen_data_display.js";
const router = useRouter();
const data = reactive({
hidCount: {
dzg: 0,
yys: 0,
ycq: 0,
},
riskCount: {
cnzfx: 0,
idcount: 0,
unitcount: 0,
},
memoryUsage: {
total_usage: 0,
},
countlist: [
{
num: 456321,
title: "风险单元",
},
{
num: 456321,
title: "辨识部位",
},
{
num: 456321,
title: "风险因素",
},
{
num: 456321,
title: "排查清单数",
},
{
num: 456321,
title: "自查次数",
},
{
num: 456321,
title: "隐患数",
},
],
});
const fnGetData = async () => {
const { hidCount } = await getHiddenCount();
const { riskCount } = await getRiskManagement();
const { pd: memoryUsage } = await getMemoryUsage();
data.hidCount = hidCount;
data.riskCount = riskCount;
data.memoryUsage = memoryUsage;
};
fnGetData();
</script>
<style scoped lang="scss">
img {
width: 40px;
height: 40px;
}
.el-col-4 {
.wrap {
width: 100%;
padding: 20px;
text-align: center;
border-radius: 8px;
border: 1px solid transparent;
border-image: linear-gradient(to bottom, #214e74, #25417a) 1 stretch;
.flex {
display: flex;
justify-content: space-between;
align-items: center;
text-align: center;
.num {
font-size: 30px;
font-weight: bold;
margin-bottom: 10px;
color: #087cca;
}
div:not(:first-child) {
cursor: pointer;
.title {
color: #ffffff;
}
}
&:nth-child(1) .wrap .num {
color: #087cca;
}
.countup-wrap {
padding-top: 10px;
font-weight: bold;
font-size: 20px;
&:nth-child(3) .wrap .num {
color: #d19312;
}
&:nth-child(6) .wrap .num {
color: #aa0608;
}
}
</style>

View File

@ -0,0 +1,54 @@
<template>
<el-card>
<div class="title">双重预防运行情况统计</div>
<el-table :data="data.tableData" style="width: 100%" size="small">
<el-table-column prop="date" label="序号" />
<el-table-column prop="date" label="清单名称" />
<el-table-column prop="date" label="检查时间" />
<el-table-column prop="date" label="检查人" />
<el-table-column prop="date" label="隐患数" />
></el-table
></el-card
>
</template>
<script setup>
import { reactive } from "vue";
const data = reactive({
tableData: [
{
date: "2016-05-03",
name: "Tom",
},
{
date: "2016-05-03",
name: "Tom",
},
{
date: "2016-05-03",
name: "Tom",
},
{
date: "2016-05-03",
name: "Tom",
},
{
date: "2016-05-03",
name: "Tom",
},
{
date: "2016-05-03",
name: "Tom",
},
],
});
</script>
<style scoped lang="scss">
.title {
font-size: 14px;
font-weight: bold;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,135 @@
<template>
<div class="wrap">
<div class="title">双重预防检查情况统计</div>
<div id="main2"></div>
</div>
</template>
<script setup>
import { onMounted } from "vue";
import * as echarts from "echarts";
let myChart1;
const annualTraining = () => {
myChart1 = echarts.init(document.querySelector("#main2"));
const option = {
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
crossStyle: {
color: "#999",
},
},
},
toolbox: {
feature: {
dataView: { show: false, readOnly: false },
magicType: { show: false, type: ["line", "bar"] },
restore: { show: false },
saveAsImage: { show: false },
},
},
legend: {
data: ["清单检查数", "发现隐患数"],
top: "10%",
left: "center",
textStyle: {
color: "#FFFFFF",
},
},
grid: {
left: "0%",
right: "8%",
bottom: "0%",
top: "30%",
containLabel: true,
},
xAxis: [
{
type: "category",
data: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
axisPointer: {
type: "shadow",
},
axisLabel: {
color: "#fff",
},
axisLine: {
lineStyle: {
color: "#102b60",
},
},
},
],
yAxis: [
{
type: "value",
name: "",
min: 0,
max: 250,
interval: 50,
axisLabel: {
formatter: "{value}",
color: "#fff",
},
axisLine: {
lineStyle: {
color: "#102b60",
},
},
splitLine: {
lineStyle: {
color: "#102b60",
},
},
},
],
series: [
{
name: "清单检查数",
type: "bar",
tooltip: {
valueFormatter: function (value) {
return value;
},
},
data: [
2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3,
],
},
{
name: "发现隐患数",
type: "bar",
tooltip: {
valueFormatter: function (value) {
return value;
},
},
data: [
2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3,
],
},
],
};
myChart1.setOption(option);
};
onMounted(() => {
annualTraining();
});
</script>
<style scoped lang="scss">
.wrap {
width: 50%;
.title {
font-size: 14px;
font-weight: bold;
}
#main2 {
width: 330px;
height: 350px;
}
}
</style>

View File

@ -0,0 +1,94 @@
<template>
<el-card>
<div class="wrap">
<div class="flex top">
<div class="img">
<img src="@/assets/images/public/loginbg.jpg" alt="" />
</div>
<div class="info">
<div>
<span>公司名称</span><br />
秦皇岛卓云科技有限公司
</div>
<div>
<span>组织机构代码证</span>
<br />455555
</div>
</div>
</div>
<div class="flex f14 mt20 number">
<div>驾驶员数:<span>234</span></div>
<div>押运员数:<span>234</span></div>
<div>装卸员数:<span>234</span></div>
</div>
<div class="wrap_text">
<div class="wrap_main">
<div class="flex space-between">
<div>主要负责人: 张三岁</div>
<div>主要负责人电话: 13833550548</div>
</div>
<div class="flex space-between">
<div>法定代表人: 李四折</div>
<div>法人手机号: 13833550547</div>
</div>
<div class="flex space-between">
<div>占地面积: 10000</div>
<div>职工人数: 22</div>
</div>
</div>
</div>
</div>
</el-card>
</template>
<script setup></script>
<style scoped lang="scss">
.wrap {
width: 100%;
font-size: 14px;
.flex {
display: flex;
}
.mt20 {
margin-top: 20px;
}
.top {
.img {
width: 150px;
height: 90px;
img {
width: 100%;
height: 100%;
border: 1px solid #234e6c;
}
}
.info {
font-size: 14px;
margin-left: 10px;
line-height: 1.6;
span {
color: #76afed;
}
}
}
.number {
justify-content: space-between;
span {
font-weight: bold;
}
}
.wrap_text {
margin-top: 20px;
line-height: 2;
.wrap_main {
background: #1b346c;
padding: 10px;
border-radius: 4px;
}
.space-between {
justify-content: space-between;
width: 100%;
}
}
}
</style>

View File

@ -0,0 +1,86 @@
<template>
<div class="wrap">
<div class="title">隐患整改情况统计</div>
<div id="main3"></div>
</div>
</template>
<script setup>
import { onMounted } from "vue";
import * as echarts from "echarts";
let myChart1;
const annualTraining = () => {
myChart1 = echarts.init(document.querySelector("#main3"));
const option = {
tooltip: {
trigger: "item",
},
legend: {
bottom: "0%",
left: "center",
textStyle: {
color: "#FFFFFF",
},
},
grid: {
left: "0%",
right: "8%",
bottom: "0%",
top: "35%",
containLabel: true,
},
series: [
{
name: "Access From",
type: "pie",
radius: ["40%", "70%"],
avoidLabelOverlap: false,
itemStyle: {
borderRadius: 2,
},
label: {
show: false,
position: "center",
textStyle: {
color: "#FFFFFF",
},
},
emphasis: {
label: {
show: false,
fontSize: 16,
},
},
labelLine: {
show: false,
},
data: [
{ value: 1048, name: "未整改" },
{ value: 735, name: "已整改" },
{ value: 484, name: "已验收" },
{ value: 300, name: "已过期" },
],
},
],
};
myChart1.setOption(option);
};
onMounted(() => {
annualTraining();
});
</script>
<style scoped lang="scss">
.wrap {
width: 50%;
.title {
font-size: 14px;
font-weight: bold;
}
#main3 {
width: 330px;
height: 350px;
}
}
</style>

View File

@ -0,0 +1,86 @@
<template>
<div class="wrap">
<el-card>
<div class="title">人员统计</div>
<div id="main4"></div>
</el-card>
</div>
</template>
<script setup>
import { onMounted } from "vue";
import * as echarts from "echarts";
let myChart1;
const annualTraining = () => {
myChart1 = echarts.init(document.querySelector("#main4"));
const option = {
tooltip: {
trigger: "item",
},
legend: {
bottom: "0%",
left: "center",
textStyle: {
color: "#FFFFFF",
},
},
grid: {
left: "0%",
right: "8%",
bottom: "0%",
top: "0%",
containLabel: true,
},
series: [
{
name: "Access From",
type: "pie",
radius: ["40%", "70%"],
avoidLabelOverlap: false,
itemStyle: {
borderRadius: 10,
},
label: {
show: false,
position: "center",
textStyle: {
color: "#FFFFFF",
},
},
emphasis: {
label: {
show: false,
fontSize: 16,
},
},
labelLine: {
show: false,
},
data: [
{ value: 1048, name: "驾驶员" },
{ value: 735, name: "押运员" },
{ value: 484, name: "装卸员" },
],
},
],
};
myChart1.setOption(option);
};
onMounted(() => {
annualTraining();
});
</script>
<style scoped lang="scss">
.wrap {
.title {
font-size: 14px;
font-weight: bold;
}
#main4 {
width: 330px;
height: 165px;
}
}
</style>

View File

@ -0,0 +1,52 @@
<template>
<el-card>
<div class="title">培训情况统计</div>
<el-table :data="data.tableData" style="width: 100%" size="small">
<el-table-column prop="date" label="序号" />
<el-table-column prop="date" label="班级名称" />
<el-table-column prop="date" label="班级状态" />
<el-table-column prop="date" label="涉及工种数" />
<el-table-column prop="date" label="培训人数" />
<el-table-column prop="date" label="培训进度" /> </el-table
></el-card>
</template>
<script setup>
import { reactive } from "vue";
const data = reactive({
tableData: [
{
date: "2016-05-03",
name: "Tom",
},
{
date: "2016-05-03",
name: "Tom",
},
{
date: "2016-05-03",
name: "Tom",
},
{
date: "2016-05-03",
name: "Tom",
},
{
date: "2016-05-03",
name: "Tom",
},
{
date: "2016-05-03",
name: "Tom",
},
],
});
</script>
<style scoped lang="scss">
.title {
font-size: 14px;
font-weight: bold;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,53 @@
<template>
<el-card style="margin-top: 10px">
<div class="title">双重预防运行情况统计</div>
<el-table :data="data.tableData" style="width: 100%" size="small">
<el-table-column prop="date" label="序号" />
<el-table-column prop="date" label="运单编号" />
<el-table-column prop="date" label="运输车辆" />
<el-table-column prop="date" label="三检状态" />
></el-table
></el-card
>
</template>
<script setup>
import { reactive } from "vue";
const data = reactive({
tableData: [
{
date: "34",
name: "Tom",
},
{
date: "34",
name: "Tom",
},
{
date: "34",
name: "Tom",
},
{
date: "34",
name: "Tom",
},
{
date: "34",
name: "Tom",
},
{
date: "34",
name: "Tom",
},
],
});
</script>
<style scoped lang="scss">
.title {
font-size: 14px;
font-weight: bold;
margin-bottom: 10px;
}
</style>

View File

@ -3,25 +3,29 @@
<el-row :gutter="10">
<el-col :span="18">
<count />
<el-row class="mt-10">
<el-col :span="24">
<list-check-type />
</el-col>
</el-row>
<el-row class="mt-10" :gutter="10">
<el-row :gutter="10" class="mt-10">
<el-col :span="10">
<risk-classification />
<annualTraining />
</el-col>
<el-col :span="14">
<checklist-check />
</el-col>
<el-card>
<el-row :gutter="10">
<el-col :span="12"><doublePreventionCheck /> </el-col>
<el-col :span="12">
<rectificationOfHiddenDangers />
</el-col>
</el-row> </el-card
></el-col>
</el-row>
<el-row class="mt-10" :gutter="10">
<el-col :span="12"> <trainingStatistics /> </el-col>
<el-col :span="12"><doublePrevention /></el-col>
</el-row>
</el-col>
<el-col :span="6">
<el-card>
<announcement />
<calendar />
</el-card>
<info />
<statistics class="mt-10" />
<waybill />
</el-col>
</el-row>
</div>
@ -29,11 +33,19 @@
<script setup>
import Count from "./components/count.vue";
import ListCheckType from "./components/list_check_type.vue";
import RiskClassification from "./components/risk_classification.vue";
import ChecklistCheck from "./components/checklist_check.vue";
import Announcement from "./components/announcement.vue";
import Calendar from "./components/calendar.vue";
import annualTraining from "./components/annualTraining.vue";
import doublePreventionCheck from "./components/doublePreventionCheck.vue";
import rectificationOfHiddenDangers from "./components/rectificationOfHiddenDangers.vue";
import trainingStatistics from "./components/trainingStatistics.vue";
import doublePrevention from "./components/doublePrevention.vue";
import info from "./components/info.vue";
import statistics from "./components/statistics.vue";
import waybill from "./components/waybill.vue";
// import RiskClassification from "./components/risk_classification.vue";
// import ChecklistCheck from "./components/checklist_check.vue";
// import Announcement from "./components/announcement.vue";
// import Calendar from "./components/calendar.vue";
</script>
<style lang="scss" scoped>