2022-07-22 15:53:09 +08:00

792 lines
20 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<el-container>
<el-aside width="287px">
<div class="asideHeader">
<h2 class="asideTitle">防疫通行数据对比</h2>
<div class="exportData" @click="exportData">导出所有数据</div>
</div>
<div class="searchBox">
<el-input
placeholder="请输入关键字搜索"
prefix-icon="el-icon-search"
v-model="searchWord"
class="searchInput"
clearable
>
</el-input>
<el-button
class="searchBtn"
type="primary"
size="small"
@click="searchCompany"
>搜索</el-button
>
</div>
<div class="projectList">
<vue-scroll style="height: 100%">
<ul>
<li
class="list-item"
v-for="(item, index) in projectList"
:key="item.enterpriseId"
:class="dataIndex === index ? 'active' : ''"
@click="clickList(index, item)"
>
{{ item.name }}
</li>
</ul>
</vue-scroll>
</div>
</el-aside>
<el-main>
<div class="main-header">
<div class="header-box">
<img src="@/assets/images/laborManage/totalNum.png" alt="" />
<div>
<p>实名人数</p>
<h2>{{ statisticalData.workerNum }}</h2>
</div>
</div>
<div class="header-box">
<img src="@/assets/images/laborManage/greenCode.png" alt="" />
<div>
<p>昌通码绿码人数</p>
<h2>{{ statisticalData.greenCodeNum }}</h2>
</div>
</div>
<div class="header-box">
<img src="@/assets/images/laborManage/abnormalCode.png" alt="" />
<div>
<p>异常码人数</p>
<h2>{{ statisticalData.abnormalNum }}</h2>
</div>
</div>
<div class="header-box">
<img src="@/assets/images/laborManage/inNum.png" alt="" />
<div>
<p>进入人数</p>
<h2>{{ statisticalData.inNum }}</h2>
</div>
</div>
<div class="header-box">
<img src="@/assets/images/laborManage/outNum.png" alt="" />
<div>
<p>外出人数</p>
<h2>{{ statisticalData.outNum }}</h2>
</div>
</div>
</div>
<div class="main-middle">
<div class="abnormalAnalysis" ref="abnormalAnalysis"></div>
<div class="btnBox">
<el-button
size="mini"
:class="selectType === 1 ? 'activeBtn' : ''"
@click="selectDate(1)"
>近7天</el-button
>
<el-button
size="mini"
:class="selectType === 2 ? 'activeBtn' : ''"
@click="selectDate(2)"
>近30天</el-button
>
</div>
</div>
<div class="main-footer">
<div class="contrastAnalysis" ref="contrastAnalysis"></div>
<div class="btnBox">
<el-button
size="mini"
:class="selectType_contrast === 1 ? 'activeBtn' : ''"
@click="selectDate_contrast(1)"
>近7天</el-button
>
<el-button
size="mini"
:class="selectType_contrast === 2 ? 'activeBtn' : ''"
@click="selectDate_contrast(2)"
>近30天</el-button
>
</div>
<el-button
size="mini"
type="primary"
plain
class="exportForm"
@click="exportForm"
>导出表格</el-button
>
<el-dialog
title="请选择下载日期"
:visible.sync="selectTime"
width="30%"
>
<el-form
:model="ruleForm"
:rules="rules"
ref="ruleForm"
label-width="100px"
>
<el-form-item label="选择时间" prop="time">
<el-date-picker
v-model="ruleForm.time"
type="date"
placeholder="选择日期"
value-format="yyyy-MM-dd"
style="width: 80%;"
@change="getTime"
>
</el-date-picker>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="selectTime = false"> </el-button>
<el-button type="primary" @click="submit()"> </el-button>
</span>
</el-dialog>
</div>
</el-main>
</el-container>
</template>
<script>
import echarts from "echarts4";
import {
selectProjectAllEnterpriseList,
getProjectChartData,
getProjectDetailData,
} from "@/assets/js/api/laborPerson.js";
import moment from "moment";
export default {
data() {
return {
rules: {
time: [
{
required: true,
message: "请选择需要打印的日期",
trigger: "change",
},
],
},
ruleForm: {
time: "",
},
queryTime: "", //时间
selectTime: false, // 选择时间的弹窗
moment: moment,
searchWord: "", // 搜索框输入
dataIndex: 0,
projectList: [],
projectSn: "",
userEnterpriseId: "",
enterpriseId: "",
statisticalData: {
workerNum: 0, //实名人数
greenCodeNum: 0, // 绿码人数
abnormalNum: 0, // 异常码人数
inNum: 0, // 进入人数
outNum: 0, // 外出人数
},
selectType: 1,
selectType_contrast: 1,
isContrast: false,
enterpriseName: "",
noData: false,
};
},
created() {
this.projectSn = this.$store.state.projectSn;
this.userEnterpriseId = this.$store.state.userInfo.userEnterpriseId;
// console.log('-----',this.userEnterpriseId)
},
mounted() {
this.getProjectList();
// this.abnormalChart(); // 异常码人数图表分析
// this.contrastChart(); // 对比人数图表分析
},
methods: {
// 初始化数据
initData() {
this.statisticalData = {
workerNum: 0, //实名人数
greenCodeNum: 0, // 绿码人数
abnormalNum: 0, // 异常码人数
inNum: 0, // 进入人数
outNum: 0, // 外出人数
};
},
// 点击企业列表
clickList(index, project) {
this.dataIndex = index;
this.enterpriseId = project.enterpriseId;
this.selectType = 1;
this.selectType_contrast = 1;
this.enterpriseName = project.name;
this.getProjectDetail();
},
// 搜索
searchCompany() {
this.dataIndex = 0;
this.selectType = 1;
this.selectType_contrast = 1;
this.getProjectList();
},
// 异常码人数图表
abnormalChart(xData, notCodeNum, redCodeNum, yellowCodeNum) {
let abnormalAnalysis = echarts.init(this.$refs.abnormalAnalysis);
let option = {
title: {
text: "异常码人数",
left: "1%",
},
legend: {
data: ["无码", "黄码", "红码"],
bottom: "-1%",
},
tooltip: {
trigger: "axis",
},
grid: {
left: "1%",
right: "3%",
bottom: "13%",
containLabel: true,
},
xAxis: [
{
type: "category",
boundaryGap: false,
data: xData,
boundaryGap: 10,
axisTick: {
show: false,
},
axisLine: {
//y轴
show: false,
},
splitLine: {
//网格线
show: false,
},
boundaryGap: true,
axisLabel: {
formatter: function(val) {
let index = val.indexOf("-");
val = val.slice(index + 1);
return val;
},
},
},
],
yAxis: [
{
type: "value",
axisLine: {
//y轴
show: false,
},
axisTick: {
//y轴刻度线
show: false,
},
splitLine: {
//网格线
show: true,
},
},
],
series: [
{
name: "无码",
type: "line",
areaStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: "rgba(43, 219, 157, 0.3)" },
{ offset: 1, color: "rgba(206, 246, 221, 0)" },
]),
},
},
itemStyle: {
normal: {
color: "rgba(43, 219, 157, 1)", //改变折线点的颜色
lineStyle: {
color: "rgba(43, 219, 157, 0.7)", //改变折线颜色
},
},
},
// emphasis: {
// focus: "series",
// },
data: notCodeNum,
},
{
name: "黄码",
type: "line",
areaStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: "rgba(255, 248, 117, 0.7)" },
{ offset: 1, color: "rgba(255, 248, 117, 0)" },
]),
},
},
itemStyle: {
normal: {
color: "rgba(255, 248, 117, 1)", //改变折线点的颜色
lineStyle: {
color: "rgba(255, 248, 117, 0.7)", //改变折线颜色
},
},
},
emphasis: {
focus: "series",
},
data: yellowCodeNum,
},
{
name: "红码",
type: "line",
areaStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: "rgba(252, 173, 147, 0.7)" },
{ offset: 1, color: "rgba(252, 173, 147, 0)" },
]),
},
},
itemStyle: {
normal: {
color: "rgba(252, 173, 147, 1)", //改变折线点的颜色
lineStyle: {
color: "rgba(252, 173, 147, 0.7)", //改变折线颜色
},
},
},
emphasis: {
focus: "series",
},
data: redCodeNum,
},
],
};
abnormalAnalysis.setOption(option);
},
// 通行数据对比图表
contrastChart(xData, greenCodeNum, abnormalNum, inNum, outNum) {
let contrastAnalysis = echarts.init(this.$refs.contrastAnalysis);
let option = {
title: {
text: "通行数据对比",
left: "1%",
},
tooltip: {
trigger: "axis",
backgroundColor: "rgba(255, 255, 255, 1)",
showDelay: 0,
textStyle: {
color: "rgba(51, 51, 51, 1)", //字体颜色
fontSize: 14, //字体大小
lineHeight: 30,
},
padding: 10,
formatter: function(params) {
var tip = "时间:" + params[0].name + "<br/>";
for (var i = 0, l = params.length; i < l; i++) {
tip +=
params[i].marker +
params[i].seriesName +
"" +
params[i].value +
"<br/>";
}
return tip;
},
},
grid: {
top: "15%",
left: "2%",
right: "3%",
bottom: "8%",
containLabel: true,
},
legend: {
data: ["昌通码绿码人数", "异常码人数", "进入人数", "外出人数"],
bottom: "-1%",
},
xAxis: [
{
type: "category",
data: xData,
axisPointer: {
type: "shadow",
},
axisLabel: {
formatter: function(val) {
let index = val.indexOf("-");
val = val.slice(index + 1);
return val;
},
},
splitNumber: 10,
axisLine: {
show: false,
},
axisTick: {
show: false,
},
splitLine: {
show: false,
},
},
],
yAxis: [
{
type: "value",
axisLine: {
show: false,
},
axisTick: {
show: false,
},
splitLine: {
show: true,
},
},
],
series: [
{
name: "昌通码绿码人数",
type: "bar",
barWidth: 30, //柱图宽度
itemStyle: {
normal: {
color: "#6A87FA",
},
},
data: greenCodeNum,
},
{
name: "异常码人数",
type: "bar",
barWidth: 30, //柱图宽度
itemStyle: {
normal: {
color: "#FF7575",
},
},
data: abnormalNum,
},
{
name: "进入人数",
type: "line",
// yAxisIndex: 1,
itemStyle: {
normal: {
color: "rgba(255, 165, 60, 1)", //改变折线点的颜色
lineStyle: {
color: "rgba(255, 165, 60, 1)", //改变折线颜色
},
},
},
data: inNum,
},
{
name: "外出人数",
type: "line",
// yAxisIndex: 1,
itemStyle: {
normal: {
color: "rgba(9, 214, 163, 1)", //改变折线点的颜色
lineStyle: {
color: "rgba(9, 214, 163, 1)", //改变折线颜色
},
},
},
data: outNum,
},
],
};
contrastAnalysis.setOption(option);
},
// 获取企业列表
getProjectList() {
selectProjectAllEnterpriseList({
projectSn: this.projectSn,
enterpriseName: this.searchWord,
userEnterpriseId: this.userEnterpriseId,
}).then((res) => {
if (res.code == 200) {
console.log("企业列表的信息", res);
this.projectList = res.result;
this.enterpriseId = this.projectList[0].enterpriseId;
this.enterpriseName = this.projectList[0].name;
this.getProjectDetail();
}
});
},
// 获取对应企业的详细数据
getProjectDetail(chartType) {
this.initData();
// 统计数据
getProjectDetailData({
projectSn: this.projectSn,
enterpriseId: this.enterpriseId,
}).then((res) => {
console.log(res);
if (res.result) {
console.log('外出的信息有吗',res.result)
this.statisticalData = res.result;
this.statisticalData.abnormalNum =
res.result.notCodeNum +
res.result.redCodeNum +
res.result.yellowCodeNum;
}
});
// 图表数据
getProjectChartData({
projectSn: this.projectSn,
selectType: this.isContrast
? this.selectType_contrast
: this.selectType,
enterpriseId: this.enterpriseId,
}).then((res) => {
let dateArray = [];
let notCodeNum = [];
let redCodeNum = [];
let yellowCodeNum = [];
let greenCodeNum = [];
let abnormalNum = [];
let inNum = [];
let outNum = [];
res.result.forEach((item) => {
dateArray.push(item.queryTime);
notCodeNum.push(item.notCodeNum);
redCodeNum.push(item.redCodeNum);
yellowCodeNum.push(item.yellowCodeNum);
greenCodeNum.push(item.greenCodeNum);
abnormalNum.push(
item.notCodeNum + item.redCodeNum + item.yellowCodeNum
);
inNum.push(item.inNum);
outNum.push(item.outNum);
});
// chartType 1异常人数图表渲染 2通行数据图表渲染 不传时都渲染
if (chartType == 1) {
this.abnormalChart(dateArray, notCodeNum, redCodeNum, yellowCodeNum);
} else if (chartType == 2) {
this.contrastChart(
dateArray,
greenCodeNum,
abnormalNum,
inNum,
outNum
);
} else {
this.abnormalChart(dateArray, notCodeNum, redCodeNum, yellowCodeNum);
this.contrastChart(
dateArray,
greenCodeNum,
abnormalNum,
inNum,
outNum
);
}
});
},
// 异常码切换7天或30天数据
selectDate(type) {
// type 1为7天 2为30天
this.selectType = type;
this.isContrast = false;
this.getProjectDetail(1);
},
// 通行数据对比切换7天或30天数据
selectDate_contrast(type) {
this.selectType_contrast = type;
this.isContrast = true;
this.getProjectDetail(2);
},
// 导出数据
exportData() {
window.location.href =
this.$http.defaults.baseURL +
"xmgl/projectEnterpriseWorkerStatistics/exporExcelProjectEnterpriseWorkerStatistics?projectSn=" +
this.$store.state.projectSn +
"&enterpriseName=" +
this.searchWord +
"&userEnterpriseId=" +
this.userEnterpriseId;
},
exportForm() {
this.selectTime = true;
},
getTime(val) {
console.log("时间", val);
this.queryTime = val;
},
submit() {
this.$refs.ruleForm.validate((valid) => {
if (valid) {
window.location.href =
this.$http.defaults.baseURL +
"xmgl/projectEnterpriseWorkerStatistics/exporExcelDayEnterpriseWorkerStatisticsDetail?projectSn=" +
this.$store.state.projectSn +
"&userEnterpriseId=" +
this.userEnterpriseId +
"&queryTime=" +
this.queryTime +
"&enterpriseId=" +
this.enterpriseId;
}
});
},
},
};
</script>
<style lang="less" scoped>
.el-container {
height: 100%;
}
.el-aside {
background: #fff;
color: #333;
text-align: center;
height: 100%;
overflow: auto;
.exportData {
border: 1px solid #409eff;
border-radius: 4px 4px 4px 4px;
width: 92px;
margin: 0 auto;
font-size: 12px;
color: #409eff;
cursor: pointer;
}
.searchBox {
display: flex;
height: 30px;
margin-top: 25px;
padding: 0;
justify-content: space-around;
/deep/ .el-input {
width: 187px;
}
/deep/ .el-input__inner {
border: 1px solid #dcdfe6;
height: 30px;
border-radius: 50px 50px 50px 50px;
box-sizing: border-box;
}
/deep/ .el-input__prefix,
/deep/ .el-input__icon {
line-height: 30px !important;
}
}
.searchBtn {
background: #409eff;
}
.list-item {
padding: 16px 0;
cursor: pointer;
}
.projectList {
overflow-y: auto;
height: calc(100% - 153px);
}
.el-aside .projectList:hover {
opacity: 1;
transition: opacity 0.34s ease-out;
}
}
.active {
color: #409eff;
}
.el-main {
// background-color: #d3dce6;
padding: 20px 20px 0 20px;
text-align: center;
}
.main-header {
display: flex;
justify-content: space-between;
margin-bottom: 20px;
.header-box {
display: flex;
width: 16%;
background: #fff;
padding: 24px 0 30px 32px;
border-radius: 24px 24px 24px 24px;
align-items: center;
img {
width: 72px;
height: 72px;
border-radius: 10px 10px 10px 10px;
margin-right: 21px;
}
p {
font-size: 18px;
color: #666666;
}
h2 {
font-size: 36px;
text-align: left;
line-height: 50px;
margin: 0;
}
}
}
.main-middle {
position: relative;
.abnormalAnalysis {
padding: 20px;
box-sizing: border-box;
height: 282px;
background: #fff;
border-radius: 24px 24px 24px 24px;
}
}
.btnBox {
position: absolute;
top: 8%;
right: 3%;
.activeBtn {
background: rgba(77, 112, 255, 0.1);
color: rgba(77, 112, 255, 1);
}
.el-button {
border: none;
}
}
.main-footer {
padding: 20px;
box-sizing: border-box;
background: #fff;
border-radius: 24px 24px 24px 24px;
margin-top: 20px;
position: relative;
.contrastAnalysis {
height: 420px;
}
.exportForm {
position: absolute;
bottom: 5%;
right: 3%;
}
}
</style>