factory_web/src/components/scEnm/lineChartsdialog.vue

579 lines
16 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-dialog
v-model="visible"
:fullscreen="isFullscreen"
v-bind="$attrs"
:show-close="showClose"
>
<template #header>
<slot name="header">
<span class="el-dialog__title">{{ title }}</span>
</slot>
<div class="sc-dialog__headerbtn">
<button
v-if="showFullscreen"
aria-label="fullscreen"
type="button"
@click="setFullscreen"
>
<el-icon v-if="isFullscreen" class="el-dialog__close"
><el-icon-bottom-left
/></el-icon>
<el-icon v-else class="el-dialog__close"
><el-icon-full-screen
/></el-icon>
</button>
<button
v-if="showClose"
aria-label="close"
type="button"
@click="closeDialog"
>
<el-icon class="el-dialog__close"></el-icon>
</button>
</div>
</template>
<div v-loading="loading">
<div class="searchHead" v-if="type == 'hour_s'">
<el-date-picker
v-model="query.start_time"
type="datetime"
placeholder="选择时间"
format="YYYY-MM-DD HH"
value-format="YYYY-MM-DD HH"
:picker-options="pickerOptions"
/>
<span class="middleText">至</span>
<el-date-picker
v-model="query.end_time"
type="datetime"
format="YYYY-MM-DD HH"
value-format="YYYY-MM-DD HH"
start-placeholder="结束日期"
:picker-options="pickerOptions"
/>
<el-button type="primary" class="searchBtnx" @click="dataSearch"
>查询</el-button
>
</div>
<div class="searchHead" v-if="type == 'day_s'">
<el-date-picker
v-model="query.start_time"
type="date"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
start-placeholder="开始日期"
:picker-options="pickerOptions"
/>
<el-date-picker
v-model="query.end_time"
type="date"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
start-placeholder="结束日期"
:picker-options="pickerOptions"
/>
<el-button type="primary" class="searchBtnx" @click="dataSearch"
>查询</el-button
>
</div>
<div class="searchHead" v-if="type == 'month_s'">
<el-date-picker
v-model="query.start_time"
type="month"
format="YYYY-MM"
value-format="YYYY-MM"
start-placeholder="开始月份"
:picker-options="pickerOptions"
/>
<el-date-picker
v-model="query.end_time"
type="month"
format="YYYY-MM"
value-format="YYYY-MM"
start-placeholder="结束月份"
:picker-options="pickerOptions"
/>
<el-button type="primary" class="searchBtnx" @click="dataSearch"
>查询</el-button
>
</div>
<div class="searchHead" v-if="type == 'year_s'">
<el-date-picker
v-model="query.start_time"
type="year"
format="YYYY"
value-format="YYYY"
start-placeholder="开始日期"
:picker-options="pickerOptions"
/>
<el-date-picker
v-model="query.end_time"
type="year"
format="YYYY"
value-format="YYYY"
start-placeholder="结束日期"
:picker-options="pickerOptions"
/>
<el-button type="primary" class="searchBtnx" @click="dataSearch"
>查询</el-button
>
</div>
<div id="myChart" style="width: 100%; height: 400px"></div>
</div>
<template #footer>
<slot name="footer"></slot>
</template>
</el-dialog>
</template>
<script>
import * as echarts from "echarts";
export default {
props: {
cate: { type: String, default: "" },
type: { type: String, default: "hours_s" },
title: { type: String, default: "" },
mgroup: { type: String, default: "" },
mpoint: { type: String, default: "" },
apiObj: { type: Object, default: () => {} },
showClose: { type: Boolean, default: true },
echartType: { type: String, default: "bar" },
modelValue: { type: Boolean, default: false },
showFullscreen: { type: Boolean, default: true },
loading: { type: Boolean, default: false },
},
data() {
return {
visible: false,
isFullscreen: false,
query: {
time: "",
},
code: "",
cateName: "",
myChart: null,
isMpoint:false,
dictData: [],
option: {
title: {
text: "",
x: "center",
},
grid: {
// 图表距离边框的距离可用百分比和数字px配置
top: "20%",
left: "3%",
right: "10%",
bottom: "5%",
containLabel: true,
},
legend: {
// 图例配置选项
orient: "horizontal", //图例布局方式:水平 'horizontal' 、垂直 'vertical'
x: "right", // 横向放置位置,选项:'center'、'left'、'right'、'number'(横向值 px
y: "10", // 纵向放置位置,选项:'top'、'bottom'、'center'、'number'(纵向值 px
data: [],
},
xAxis: {
type: "category",
data: [
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12",
],
name: "时间",
// x轴名称样式
nameTextStyle: {
fontWeight: 600,
fontSize: 14,
},
axisLine: {
lineStyle: {
// X 轴颜色配置
color: "#3366CC",
},
},
axisLabel: {
rotate: 45, // X 轴标签文字旋转角度
interval: 0, //设置 X 轴数据间隔几个显示一个为0表示都显示
},
boundaryGap: false, //数据从 Y 轴起始
},
yAxis: {
type: "value",
// name: '对象值',
// y轴名称样式
nameTextStyle: {
fontWeight: 500,
fontSize: 14,
},
//min:0, // 配置 Y 轴刻度最小值
//max:4000, // 配置 Y 轴刻度最大值
//splitNumber:7, // 配置 Y 轴数值间隔
axisLine: {
lineStyle: {
// Y 轴颜色配置
color: "#3366CC",
},
},
},
tooltip: {
show: true, // 是否显示
trigger: "axis", // axis item none
axisPointer: {
// 坐标轴指示器配置项。
type: "cross", // 'line' 直线指示器 'shadow' 阴影指示器 'none' 无指示器 'cross' 十字准星指示器。
axis: "auto", // 指示器的坐标轴。
snap: true, // 坐标轴指示器是否自动吸附到点上
},
showContent: true,
},
series: [
{
name: "",
data: [4, 1, 9, 2, 11, 3, 5, 7, 8, 10, 6, 12],
type: "line",
// symbolSize: function(value) { // 点的大小跟随数值增加而变大
// return value / 150;
// },
symbolSize: 8, //设置折线上圆点大小
symbol: "circle",
smooth: 0.5, // 设置折线弧度
itemStyle: {
normal: {
label: {
show: true, // 在折线拐点上显示数据
},
lineStyle: {
width: 1, // 设置虚线宽度
type: "dotted", // 虚线'dotted' 实线'solid'
color: "#3366CC", // 折线颜色设置为0即只显示点不显示折线
},
},
},
},
],
},
pickerOptions: {
disabledDate(time) {
return time.getTime() > Date.now();
},
},
};
},
watch: {
modelValue() {
this.visible = this.modelValue;
if (this.visible) {
this.isFullscreen = false;
}
},
},
mounted() {
let that = this;
var myDate = new Date();
let year = (that.year = myDate.getFullYear());
let month = (that.month = myDate.getMonth() + 1);
let day = (that.days = myDate.getDate());
let start_time = "",
end_time = "";
if (this.type == "hour_s") {
start_time = year + "-" + month + "-" + day + " 00";
end_time = year + "-" + month + "-" + day + " 23";
} else if (this.type == "day_s") {
start_time = year + "-" + month + "-01";
end_time = year + "-" + month + "-15";
} else if (this.type == "month_s") {
start_time = year + "-01";
end_time = year + "-12";
} else if (this.type == "year_s") {
start_time = year - 1;
end_time = year;
}
this.query.start_time = start_time;
this.query.end_time = end_time;
this.visible = this.modelValue;
this.option.legend.data.push(that.cate);
this.option.series[0].name = that.cate;
console.log(that.mgroup)
if (that.mgroup) {
if (that.cate == "总产量t" || that.cate == "出厂水泥合计t" || that.cate == "电石渣干粉总产量t") {
that.cateName = "total_production";
} else if (
that.cate == "单位产品分布电耗kW·h/t" ||
that.cate == "生料分布电耗kW·h/t" ||
that.cate == "煤磨分布电耗kW·h/t" ||
that.cate == "电石渣干粉分布电耗kW·h/t"
) {
that.cateName = "elec_consume_unit";
} else if (that.cate == "台时产量t/h") {
that.cateName = "production_hour";
} else if (that.cate == "运转时间h") {
that.cateName = "run_hour";
} else if (that.cate == "运转率(%") {
that.cateName = "run_rate";
} else if (
that.cate == "单位产品成本(元/吨)" ||
that.cate == "电石渣成本(元/吨)" ||
that.cate == "电石渣成本(元/吨)" ||
that.cate == "生料成本(元/吨)"
) {
that.cateName = "production_cost_unit";
} else if (that.cate == "单位产品综合电耗kW·h/t") {
that.cateName = "celec_consume_unit";
} else if (that.cate == "单位产品标煤耗kgce/t") {
that.cateName = "coal_consume_unit";
} else if (that.cate == "单位产品综合能耗kgce/t") {
that.cateName = "cen_consume_unit";
} else if (that.cate == "发电功率kW·h") {
that.cateName = "production_hour";
} else if (that.cate == "吨熟料发电量kW·h/t") {
that.cateName = "production_elec_unit";
} else if (that.cate == "总电耗kW·h"||
that.cate =="总电量kW·h" ||
that.cate == "电石渣工段总电量kW·h"
) {
that.cateName = "elec_consume";
}else if (that.cate == "消耗") {
that.cateName = "amount_consume";
}else if (that.cate == "进厂") {
that.cateName = "amount_consume";
}else if (that.cate == "氨水消耗量(t)") {
that.cateName = "ammonia_consume";
}else if (that.cate == "单位氨水消耗量(kg/t)") {
that.cateName = "ammonia_consume_unit";
}
else if (that.cate == "P.O42.5R 散装t") {
that.cateName = "C90002056";
that.isMpoint = true;
}else if (that.cate == "P.O42.5R 袋装t") {
that.cateName = "C90002055";
that.isMpoint = true;
}else if (that.cate == "P.O42.5 袋装t") {
that.cateName = "x水泥+P.O42.5 袋装";
that.isMpoint = true;
}else if (that.cate == "P.O42.5 散装t") {
that.cateName = "C90001124";
that.isMpoint = true;
}else if (that.cate == "复合硅酸盐水泥;42.5R;袋装水泥(t)") {
that.cateName = "C90001612";
that.isMpoint = true;
}else if (that.cate == "复合硅酸盐水泥;42.5R;散装水泥(t)") {
that.cateName = "C90001609";
that.isMpoint = true;
}else if (that.cate == "普通硅酸盐水泥;52.5;散装水泥(t)") {
that.cateName = "C90001125";
that.isMpoint = true;
}else if (that.cate == "散装水泥(t)") {
that.cateName = "szsn_hj";
that.isMpoint = true;
}else if (that.cate == "袋装水泥(t)") {
that.cateName = "dzsn_hj";
that.isMpoint = true;
}else if (that.cate == "出厂水泥合计t") {
that.cateName = "ccsn_hj";
that.isMpoint = true;
}else if (that.cate == "熟料t") {
that.cateName = "x通用水泥熟料";
that.isMpoint = true;
}
} else {
that.cateName = "elec_consume_unit";
}
this.$nextTick((res) => {
console.log('that.isMpoint',that.isMpoint);
this.getChartsData();
this.getDict();
});
},
methods: {
getDict() {
let that = this;
let params = {};
params.page = 0;
params.type__code = "goal_cate";
this.$API.system.dict.list.req(params).then((res) => {
that.dictData = res;
res.forEach((item) => {
if (item.name == that.cate) {
that.code = item.code;
}
});
});
},
getChartsData() {
let that = this;
let params = {};
params.page = 0;
params.type = this.type;
let start_time = "",
end_time = "",
type = that.type,
unit = "时";
if (this.type == "hour_s") {
type = "hour";
start_time = this.query.start_time + ":00:00";
end_time = this.query.end_time + ":00:00";
} else if (this.type == "day_s") {
unit = "日";
start_time = this.query.start_time + " 00:00:00";
end_time = this.query.end_time + " 00:00:00";
} else if (this.type == "month_s") {
unit = "月";
start_time = this.query.start_time + "-01 00:00:00";
end_time = this.query.end_time + "-01 00:00:00";
} else if (this.type == "year_s") {
unit = "年";
start_time = that.query.start_time + "-01-01 00:00:00";
end_time = that.query.end_time + "-01-01 00:00:00";
}
params.start_time = start_time;
params.end_time = end_time;
if (that.mgroup) {
params.mgroup = that.mgroup;
} else {
params.mpoint = that.mpoint;
}
console.log(params);
console.log(that.cateName);
if(that.isMpoint){
params.mpoint__code = that.cateName;
that.$API.enm.mpointstat.list.req(params).then((res1) => {
let xAxisData = [],
lineData = [];
if(res1.length>0){
res1.reverse();
res1.forEach((item) => {
let ind = 0;
if (type == "hour_s") {
ind = item[type];
xAxisData[ind] = item[type] + unit;
lineData[ind] = item.val;
} else {
lineData.push(item.val);
let xAxis = item[type] + unit;
xAxisData.push(xAxis);
}
})
let chartDom = document.getElementById("myChart");
that.myChart = echarts.init(chartDom);
that.option.xAxis.data = xAxisData;
that.option.series[0].data = lineData;
that.myChart.setOption(that.option);
console.log(that.option);
}
})
}else{
that.apiObj.req(params).then((res) => {
let xAxisData = [],
lineData = [];
res.forEach((item) => {
let ind = 0;
let values = 0;
if(that.cateName === "amount_consume"){
if(that.cate == "消耗"){
values = item.imaterial_data_dict.湿电石渣消耗.amount_consume;
}else{
values = item.imaterial_data_dict.湿电石渣进厂.amount_consume;
}
}else if(that.cateName ==="ammonia_consume_unit"){
values = (item.ammonia_consume*1000/item.total_production).toFixed(2);
}else{
values = Number(item[that.cateName]);
}
if (type == "hour_s") {
ind = item[type];
xAxisData[ind] = item[type] + unit;
lineData[ind] = values;
} else {
lineData.push(values);
let xAxis = item[type] + unit;
xAxisData.push(xAxis);
}
});
let chartDom = document.getElementById("myChart");
that.myChart = echarts.init(chartDom);
that.option.xAxis.data = xAxisData;
that.option.series[0].data = lineData;
that.myChart.setOption(that.option);
});
}
},
getChartsData2(){
},
dataSearch() {
this.getChartsData();
},
//关闭
closeDialog() {
this.visible = false;
},
//最大化
setFullscreen() {
this.isFullscreen = !this.isFullscreen;
},
},
};
</script>
<style scoped>
.searchHead {
display: flex;
}
.middleText {
height: 32px;
line-height: 32px;
margin: 0 5px;
display: inline-block;
}
.searchBtnx {
margin-left: 5px;
}
.sc-dialog__headerbtn {
position: absolute;
top: var(--el-dialog-padding-primary);
right: var(--el-dialog-padding-primary);
}
.sc-dialog__headerbtn button {
padding: 0;
background: transparent;
border: none;
outline: none;
cursor: pointer;
font-size: var(--el-message-close-size, 16px);
margin-left: 15px;
color: var(--el-color-info);
}
.sc-dialog__headerbtn button:hover .el-dialog__close {
color: var(--el-color-primary);
}
.sc-dialog:deep(.el-dialog).is-fullscreen {
display: flex;
flex-direction: column;
top: 0px !important;
left: 0px !important;
}
.sc-dialog:deep(.el-dialog).is-fullscreen .el-dialog__header {
}
.sc-dialog:deep(.el-dialog).is-fullscreen .el-dialog__body {
flex: 1;
overflow: auto;
}
.sc-dialog:deep(.el-dialog).is-fullscreen .el-dialog__footer {
padding-bottom: 10px;
border-top: 1px solid var(--el-border-color-base);
}
</style>