273 lines
5.7 KiB
Vue
273 lines
5.7 KiB
Vue
<template>
|
|
<Card title="按分包单位分析">
|
|
<div class="rightHeader">
|
|
<div class="day Selected" @click="getNowData(1)" :class="checked == 1 ? 'active' : ''">实时</div>
|
|
<div class="year Selected" @click="getTodayData(2)" :class="checked == 2 ? 'active' : ''">今日</div>
|
|
</div>
|
|
<div id="echartsBottom" style="width: 100%; height: 100%"></div>
|
|
</Card>
|
|
</template>
|
|
|
|
<script lang="ts" setup>
|
|
import { onMounted, ref } from "vue";
|
|
import * as echarts from "echarts";
|
|
import { getComapnyWorkTotalListApi } from "@/api/modules/labor";
|
|
import Card from "@/components/card.vue";
|
|
import { GlobalStore } from "@/stores";
|
|
const store = GlobalStore();
|
|
let checked = ref(1);
|
|
function draw(xData: any, yData: any) {
|
|
let chartDom = document.getElementById("echartsBottom");
|
|
if (chartDom) {
|
|
chartDom.removeAttribute("_echarts_instance_");
|
|
}
|
|
let echartsTest = echarts.init(document.getElementById("echartsBottom"));
|
|
let option = {
|
|
tooltip: {
|
|
trigger: "axis",
|
|
axisPointer: {
|
|
// 坐标轴指示器,坐标轴触发有效
|
|
type: "shadow" // 默认为直线,可选为:'line' | 'shadow'
|
|
},
|
|
borderRadius: 5,
|
|
// borderColor: "#6baab2",
|
|
borderWidth: 5,
|
|
formatter: function (params) {
|
|
// params[0].data.nameCode
|
|
let dot =
|
|
'<span style="display:inline-block;margin-right:5px;border-radius:50%;width:10px;height:10px;background-color:#02C4DD"></span>';
|
|
return params[0].name + "<br>" + params[0].value;
|
|
}
|
|
},
|
|
grid: {
|
|
left: "6%",
|
|
right: "4%",
|
|
bottom: "10%",
|
|
top: "30%",
|
|
containLabel: true
|
|
},
|
|
xAxis: {
|
|
show: false,
|
|
data: xData,
|
|
triggerEvent: true,
|
|
axisTick: {
|
|
show: true,
|
|
lineStyle: {
|
|
color: "red"
|
|
}
|
|
},
|
|
axisLine: {
|
|
show: true,
|
|
lineStyle: {
|
|
color: "#193c81"
|
|
}
|
|
},
|
|
axisLabel: {
|
|
show: true,
|
|
rotate: 0,
|
|
interval: 0,
|
|
textStyle: {
|
|
padding: [0, 0, 0, 0],
|
|
fontSize: 12,
|
|
color: "#193c81"
|
|
}
|
|
}
|
|
},
|
|
yAxis: {
|
|
name: "单位:人",
|
|
triggerEvent: true,
|
|
nameTextStyle: {
|
|
color: "#fff",
|
|
fontSize: 10,
|
|
padding: [0, 0, 10, 0]
|
|
},
|
|
splitLine: {
|
|
show: true,
|
|
lineStyle: {
|
|
color: "#193c81"
|
|
}
|
|
},
|
|
axisTick: {
|
|
show: false
|
|
},
|
|
axisLine: {
|
|
show: true,
|
|
lineStyle: {
|
|
color: "#193c81"
|
|
}
|
|
},
|
|
axisLabel: {
|
|
show: true,
|
|
textStyle: {
|
|
color: "#fff",
|
|
fontSize: 12
|
|
}
|
|
}
|
|
},
|
|
// color: ["#e54035"],
|
|
series: [
|
|
{
|
|
name: "数量",
|
|
barMinHeight: 10,
|
|
type: "pictorialBar",
|
|
barCategoryGap: "5%",
|
|
// symbol: 'path://M0,10 L10,10 L5,0 L0,10 z',
|
|
symbol: "path://M0,10 L10,10 C5.5,10 5.5,5 5,0 C4.5,5 4.5,10 0,10 z",
|
|
itemStyle: {
|
|
normal: {
|
|
//barBorderRadius: 5,
|
|
//渐变色
|
|
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
|
{
|
|
offset: 0,
|
|
color: "#071b34"
|
|
},
|
|
{
|
|
offset: 0.5,
|
|
color: "#7bf0e1"
|
|
},
|
|
{
|
|
offset: 1,
|
|
color: "#3a787f"
|
|
}
|
|
])
|
|
}
|
|
},
|
|
label: {
|
|
normal: {
|
|
show: true,
|
|
position: "top",
|
|
textStyle: {
|
|
color: "#fff",
|
|
fontSize: 12
|
|
}
|
|
}
|
|
},
|
|
data: yData,
|
|
z: 10
|
|
},
|
|
{
|
|
name: "hill",
|
|
type: "bar",
|
|
barWidth: "60%",
|
|
symbol: "path://M0,10 L10,10 C5.5,10 5.5,5 5,0 C4.5,5 4.5,10 0,10 z",
|
|
itemStyle: {
|
|
normal: {
|
|
color: "rgba(11,47,68,.8)"
|
|
}
|
|
},
|
|
// data: 200,
|
|
z: 9
|
|
}
|
|
]
|
|
};
|
|
console.log("按分包单位分析绘图数据", option);
|
|
echartsTest.setOption(option);
|
|
}
|
|
//切换实时
|
|
function getNowData(type: any) {
|
|
checked.value = type;
|
|
yData.value = companyWorkTotalData.value.map((item: any) => item.presencePersonNum);
|
|
xData.value = companyWorkTotalData.value.map((item: any) => item.enterpriseName);
|
|
|
|
draw(xData.value, yData.value);
|
|
}
|
|
//切换今日
|
|
function getTodayData(type: any) {
|
|
checked.value = type;
|
|
yData.value = companyWorkTotalData.value.map((item: any) => item.attendancePersonNum);
|
|
xData.value = companyWorkTotalData.value.map((item: any) => item.enterpriseName);
|
|
|
|
draw(xData.value, yData.value);
|
|
}
|
|
|
|
let companyWorkTotalData = ref([] as any);
|
|
let xData = ref([] as any);
|
|
let yData = ref([] as any);
|
|
async function getProjectWorkerList() {
|
|
let res: any = await getComapnyWorkTotalListApi({
|
|
projectSn: store.sn
|
|
});
|
|
if (res.result.length !== 0) {
|
|
companyWorkTotalData.value = res.result;
|
|
getNowData(1);
|
|
} else {
|
|
companyWorkTotalData.value = [];
|
|
xData.value = [];
|
|
yData.value = [];
|
|
draw(xData.value, yData.value);
|
|
}
|
|
}
|
|
|
|
async function getProjectWorkerList2() {
|
|
let res:any = await getComapnyWorkTotalListApi({
|
|
projectSn: store.sn
|
|
});
|
|
if (res.result.length !== 0) {
|
|
if (res.result) {
|
|
let emptyArr: any = [];
|
|
xData.value = emptyArr;
|
|
yData.value = emptyArr;
|
|
companyWorkTotalData.value = res.result;
|
|
getNowData(1);
|
|
}
|
|
} else {
|
|
companyWorkTotalData.value = [];
|
|
xData.value = [];
|
|
yData.value = [];
|
|
draw(xData.value, yData.value);
|
|
}
|
|
}
|
|
|
|
//将方法暴露给父组件
|
|
defineExpose({
|
|
getProjectWorkerList2
|
|
});
|
|
onMounted(async () => {
|
|
await getProjectWorkerList();
|
|
});
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.rightHeader {
|
|
display: flex;
|
|
position: absolute;
|
|
z-index: 99;
|
|
color: #fff;
|
|
font-size: 10px;
|
|
text-align: center;
|
|
line-height: 20px;
|
|
// width: 20%;
|
|
// left: 80%;
|
|
// top: 79%;
|
|
width: 88%;
|
|
left: 16%;
|
|
top: 5%;
|
|
.Selected {
|
|
height: 5%;
|
|
background: url("@/assets/images/dustNoise/rightImg2.png") no-repeat;
|
|
background-size: 100% 100%;
|
|
cursor: pointer;
|
|
}
|
|
.day {
|
|
width: 15%;
|
|
margin-right: 5%;
|
|
margin-left: 55%;
|
|
}
|
|
.year {
|
|
width: 15%;
|
|
margin-right: 8%;
|
|
}
|
|
.active {
|
|
background: url("@/assets/images/dustNoise/rightImg.png") no-repeat;
|
|
background-size: 100% 100%;
|
|
}
|
|
}
|
|
:deep() {
|
|
.content {
|
|
height: 75%;
|
|
position: relative;
|
|
}
|
|
}
|
|
</style>
|