514 lines
16 KiB
Vue
514 lines
16 KiB
Vue
<template>
|
||
<div class="app-container">
|
||
<el-header>
|
||
<div class="left-panel">
|
||
<el-date-picker
|
||
v-model="query.year_s"
|
||
type="year"
|
||
value-format="YYYY"
|
||
format="YYYY"
|
||
placeholder="查询年份"
|
||
class="headerSearch"
|
||
/>
|
||
<el-button
|
||
type="primary"
|
||
icon="el-icon-search"
|
||
@click="handleQuery"
|
||
></el-button>
|
||
<el-button
|
||
type="primary"
|
||
@click="exportExcel()"
|
||
:loading="exportLoading"
|
||
v-auth="'export_excel'"
|
||
>导出xlsx
|
||
</el-button>
|
||
<el-button type="primary" @click="handlePrint">打印 </el-button>
|
||
</div>
|
||
</el-header>
|
||
<el-card style="margin-top: 5px">
|
||
<div class="printWrap">
|
||
<div ref="print" id="myReport" class="printContainer">
|
||
<table
|
||
border="1"
|
||
width="3200"
|
||
cellspacing="0"
|
||
:key="timeStamp"
|
||
id="myTable"
|
||
class="myTable"
|
||
>
|
||
<thead class="myTableHead">
|
||
<tr>
|
||
<th colspan="31">烧成工序班组月度对比分析</th>
|
||
</tr>
|
||
<tr>
|
||
<th rowspan="2">月份</th>
|
||
<th rowspan="2">班组</th>
|
||
<th colspan="2">产量</th>
|
||
<th>运转率</th>
|
||
<th>成本</th>
|
||
<th colspan="4">质量</th>
|
||
<th colspan="7">单位产品标煤耗</th>
|
||
<th colspan="12">产品单位电耗</th>
|
||
<th rowspan="2">得分</th>
|
||
<th rowspan="2">排名</th>
|
||
</tr>
|
||
<tr>
|
||
<th>总产量(t)</th>
|
||
<th>台时产量(t/h)</th>
|
||
<th>运转率(%)</th>
|
||
<th>单位产品成本(元/吨)</th>
|
||
<th>细度(%)</th>
|
||
<th>水分(%)</th>
|
||
<th>立升重(%)</th>
|
||
<th>f-CaO(%)</th>
|
||
|
||
<th>当期值(kgce/t))</th>
|
||
<th>目标值(kgce/t)</th>
|
||
<th>当期与目标差值(kgce/t)</th>
|
||
<th>环期值(kgce/t)</th>
|
||
<th>当期与环期差值(kgce/t)</th>
|
||
<th>环比增长率(%)</th>
|
||
<th>同比增长率(%)</th>
|
||
|
||
<th>高温风机(kW·h/t)</th>
|
||
<th>篦冷机一室风机(kW·h/t)</th>
|
||
<th>篦冷机三室风机(kW·h/t)</th>
|
||
<th>篦冷机二室风机(kW·h/t)</th>
|
||
<th>窑头排风机(kW·h/t)</th>
|
||
<th>当期值(kW·h/t)</th>
|
||
<th>目标值(kW·h/t)</th>
|
||
<th>当期与目标差值(kW·h/t)</th>
|
||
<th>环期值(kW·h/t)</th>
|
||
<th>当期与环期差值(kW·h/t)</th>
|
||
<th>环比增长率(%)</th>
|
||
<th>同比增长率(%)</th>
|
||
</tr>
|
||
</thead>
|
||
<tr v-for="(item, index) in tableDatas" :key="index">
|
||
<td
|
||
v-for="(item0, index0) in item"
|
||
:key="index0"
|
||
class="numCell"
|
||
>
|
||
{{ item0 }}
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</el-card>
|
||
</div>
|
||
</template>
|
||
<script>
|
||
export default {
|
||
data() {
|
||
return {
|
||
timeStamp: 0,
|
||
query: {
|
||
year_s: "",
|
||
page: 0,
|
||
type: "month_st",
|
||
mgroup: "",
|
||
},
|
||
tableDatas: [],
|
||
exportLoading: false,
|
||
tableName:'烧成工序班组月度对比分析',
|
||
};
|
||
},
|
||
mounted() {
|
||
let that = this;
|
||
var myDate = new Date();
|
||
let year = myDate.getFullYear();
|
||
this.timeStamp = myDate.getTime();
|
||
that.query.year_s = year;
|
||
this.$API.mtm.mgroup.list
|
||
.req({ page: 0, search: "回转窑" })
|
||
.then((res) => {
|
||
that.query.mgroup = res[0].id;
|
||
that.getGoalData();
|
||
});
|
||
},
|
||
methods: {
|
||
getGoalData() {
|
||
let that = this;
|
||
let params = {};
|
||
params.page = 0;
|
||
params.year = that.query.year_s;
|
||
params.mgroup = that.query.mgroup;
|
||
this.$API.mtm.goal.list.req(params).then((res) => {
|
||
// let data = [];
|
||
// if (res.length > 0) {
|
||
// this.data = res;
|
||
// }
|
||
that.getData(res);
|
||
});
|
||
},
|
||
getData(goalData) {
|
||
let that = this;
|
||
let query0 = {};
|
||
query0.page = 0;
|
||
query0.type = "month_st";
|
||
query0.year_s = that.query.year_s - 1;
|
||
query0.mgroup = that.query.mgroup;
|
||
let wrapArr = [],
|
||
wrapArr0 = [],
|
||
wrapArrs = [],
|
||
comparEarr = [], //班组对比
|
||
month_obj = {},
|
||
compareArr0 = [];
|
||
this.$API.enm.enstat.req(query0).then((res0) => {
|
||
let data0 = res0;
|
||
if (data0.length > 0) {
|
||
data0.forEach((item0) => {
|
||
//先按月份排序,再按班组排序
|
||
let month = item0.month_s;
|
||
if (!wrapArr0[month]) {
|
||
wrapArr0[month] = [];
|
||
}
|
||
// let arr0 = [];
|
||
// arr0[0] = n0;
|
||
// arr0[1] = team_name0;
|
||
// arr0[2] = item0.total_output_unit;
|
||
// arr0[3] = item0.total_output_unit;
|
||
// arr0[4] = item0.run_rate_unit;
|
||
wrapArr0[month].push(item0);
|
||
});
|
||
} else {}
|
||
}).then(() => {
|
||
this.$API.enm.enstat.req(that.query).then((res) => {
|
||
let data = res;
|
||
if (data.length > 0) {
|
||
data.forEach((item) => {
|
||
//先按月份排序,再按班组排序
|
||
let compareArr = [];
|
||
let elecArr = [];
|
||
compareArr.push(item.month_s);
|
||
elecArr.push(item.month_s);
|
||
compareArr.push(item.team_name);
|
||
elecArr.push(item.team_name);
|
||
compareArr.push(item.coal_consume_unit);
|
||
elecArr.push(item.elec_consume_unit);
|
||
compareArr0.push(compareArr);
|
||
comparEarr.push(elecArr);
|
||
if (!month_obj[item.month_s]) {
|
||
month_obj[item.month_s] = [];
|
||
};
|
||
month_obj[item.month_s].push(
|
||
{
|
||
team:item.team_name,
|
||
production_hour: item.production_hour,
|
||
run_rate:item.run_rate,
|
||
production_cost_unit:item.production_cost_unit,
|
||
CaO:item.出窑熟料_fCaO_rate_pass,
|
||
coal_consume_unit:item.coal_consume_unit,
|
||
lisz:item.出窑熟料_立升重_rate_pass,
|
||
elec:item.elec_consume_unit,
|
||
}
|
||
);
|
||
});
|
||
data.forEach((item) => {
|
||
//先按月份排序,再按班组排序
|
||
let n = item.month_s;
|
||
let ind = 0;
|
||
let arr = [];
|
||
let time = "" + item.year_s + "." + item.month_s;
|
||
arr.push(time);
|
||
arr.push(item.team_name);
|
||
arr.push(item.total_production);
|
||
arr.push(item.production_hour);
|
||
arr.push(item.run_rate);
|
||
arr.push(item.production_cost_unit);
|
||
//质量
|
||
// arr[6] =
|
||
// item.入窑生料_CaO_rate_pass != null
|
||
// ? item.入窑生料_CaO_rate_pass
|
||
// : "/";
|
||
// arr[7] =
|
||
// item.入窑生料_Fe2O3_rate_pass != null
|
||
// ? item.入窑生料_Fe2O3_rate_pass
|
||
// : "/";
|
||
arr[6] =
|
||
item.出磨煤粉_细度_rate_pass != null
|
||
? item.出磨煤粉_细度_rate_pass
|
||
: "/";
|
||
arr[7] =
|
||
item.出磨煤粉_水分_rate_pass != null
|
||
? item.出磨煤粉_水分_rate_pass
|
||
: "/";
|
||
arr[8] =
|
||
item.出窑熟料_立升重_rate_pass != null
|
||
? item.出窑熟料_立升重_rate_pass
|
||
: "/";
|
||
arr[9] =
|
||
item.出窑熟料_fCaO_rate_pass != null
|
||
? item.出窑熟料_fCaO_rate_pass
|
||
: "/";
|
||
|
||
//煤耗
|
||
arr[10] = item.coal_consume_unit; //当期值(kW·h/t)
|
||
let keyValue = "goal_val_" + n;
|
||
if (goalData.length > 0){
|
||
goalData.forEach((item) => {
|
||
if (item.goal_cate_name == "单位产品标煤耗(kgce/t)") {
|
||
arr[11] = item[keyValue]; //目标值(kW·h/t)//需要接口获取
|
||
}else if (item.goal_cate_name == "单位产品分布电耗(kW·h/t)"){
|
||
arr[23] = item[keyValue]; //目标值(kW·h/t)//需要接口获取
|
||
}
|
||
});
|
||
};
|
||
let dq = 0
|
||
if (arr[11] !== null && arr[11] !== undefined){
|
||
dq = (arr[10] - arr[11]).toFixed(2); //当期与目标差值(kW·h/t)
|
||
}else{
|
||
dq == "/"
|
||
};
|
||
arr[12] = dq; //当期与目标差值
|
||
let ind_pre = 0,
|
||
huanbi = 0;
|
||
if (item.month_s == 1) {
|
||
ind_pre = 12;
|
||
if (wrapArr0[ind_pre]) {
|
||
wrapArr0[ind_pre].forEach((item0) => {
|
||
if (item0.team_name == item.team_name) {
|
||
huanbi = item0.coal_consume_unit;
|
||
}
|
||
});
|
||
}
|
||
} else {
|
||
// 如果 wrapArr数组长度大于0,那么循环遍历wrapArr数组,找到与item.month_s相差1的元素 而 item.name相同,并赋值给huanbi
|
||
compareArr0.forEach((item0) => {
|
||
if (item0[0] == item.month_s - 1 && item0[1] == item.team_name) {
|
||
huanbi = item0[2];
|
||
}
|
||
})
|
||
}
|
||
arr[13] = huanbi; //环期值(kW·h/t)上个月的值
|
||
if(huanbi !=="/"){
|
||
arr[14] = (arr[10] - arr[13]).toFixed(2); //当期与环期差值(kW·h/t)
|
||
}else{
|
||
arr[14] = 0
|
||
};
|
||
if (arr[13] !== "/"&& arr[13]!== 0 && arr[14]!=="/") {
|
||
arr[15] = ((arr[14] / arr[13]) * 100).toFixed(2); //环比增长率(%)
|
||
} else{
|
||
arr[15] = "/"
|
||
};
|
||
let sameRate = 0;
|
||
if (
|
||
wrapArr0[ind] &&
|
||
wrapArr0[ind].coal_consume_unit
|
||
) {
|
||
sameRate =
|
||
(( item.coal_consume_unit -
|
||
wrapArr0[ind].coal_consume_unit) /
|
||
wrapArr0[ind].coal_consume_unit) *
|
||
100;
|
||
} else {
|
||
sameRate = "/";
|
||
}
|
||
arr[16] = sameRate; ///同比增长率(%)需要当前值/ 上一年同一个月的值即wrapArr0[ind].elec_consume_unit
|
||
//电耗
|
||
//设备
|
||
arr[17] =
|
||
item.高温风机_consume_unit != null
|
||
? item.高温风机_consume_unit
|
||
: "/";
|
||
arr[18] =
|
||
item.篦冷机一室风机电机_consume_unit != null
|
||
? item.篦冷机一室风机电机_consume_unit
|
||
: "/";
|
||
arr[19] =
|
||
item.篦冷机三室风机电机_consume_unit != null
|
||
? item.篦冷机三室风机电机_consume_unit
|
||
: "/";
|
||
arr[20] =
|
||
item.篦冷机二室风机电机_consume_unit != null
|
||
? item.篦冷机二室风机电机_consume_unit
|
||
: "/";
|
||
arr[21] =
|
||
item.窑头排风机主电机_consume_unit != null
|
||
? item.窑头排风机主电机_consume_unit
|
||
: "/";
|
||
arr[22] = item.elec_consume_unit; //当期值(kW·h/t)
|
||
// arr[25] = item.celec_consume_unit; //目标值(kW·h/t)//需要接口获取
|
||
if (item.elec_consume_unit != null &&item.elec_consume_unit !== "/"){
|
||
arr[24] = (arr[22]-arr[23]).toFixed(2); //当期与目标差值(kW·h/t)
|
||
}
|
||
let huanbiec = 0;
|
||
if (item.month_s == 1) {
|
||
ind_pre = 12;
|
||
if (wrapArr0[ind_pre]) {
|
||
wrapArr0[ind_pre].forEach((item0) => {
|
||
if (item0.team_name == item.team_name) {
|
||
huanbiec = item0.elec_consume_unit;
|
||
}
|
||
});
|
||
}
|
||
} else {
|
||
// 如果 wrapArr数组长度大于0,那么循环遍历wrapArr数组,找到与item.month_s相差1的元素 而 item.name相同,并赋值给huanbi
|
||
comparEarr.forEach((item0) => {
|
||
if (item0[0] == item.month_s - 1 && item0[1] == item.team_name) {
|
||
huanbiec = item0[2];
|
||
}
|
||
})
|
||
}
|
||
arr[25] = huanbiec; //环期值(kW·h/t)上个月的值
|
||
if(arr[25]!=="/" && huanbiec!=="/"){
|
||
arr[26] = (arr[22] - huanbiec).toFixed(2); //当期与环期差值(kW·h/t)
|
||
}else{
|
||
arr[26] = "/"
|
||
}
|
||
if(arr[26]!=="/" && huanbiec!=="/"&&huanbiec!==0){
|
||
arr[27] = ((arr[26] / huanbiec) * 100).toFixed(2); //环比增长率(%)
|
||
}else{
|
||
arr[27] = 0}; //环比增长率(%)
|
||
arr[28] = item.celec_consume_unit; //同比增长率(%)
|
||
arr[29] = 0;
|
||
if (month_obj[n]) {
|
||
const monthData = month_obj[n];
|
||
const itemValue = item.elec_consume_unit; // 单位产品电耗的值
|
||
const sortedData = monthData.sort((a, b) => parseFloat(b.elec) - parseFloat(a.elec));
|
||
const index = sortedData.findIndex(obj => parseFloat(obj.elec) === parseFloat(itemValue));
|
||
let elec_score = 0;
|
||
if (index === 0){
|
||
elec_score= 5;
|
||
} else if (index === 1) {
|
||
elec_score= 8;
|
||
} else if (index === 2) {
|
||
elec_score= 10;
|
||
} else if (index === 3) {
|
||
elec_score= 15;
|
||
}
|
||
arr[29] += elec_score;
|
||
|
||
// const run_rate_itemValue = item.run_rate; // 运转率的值
|
||
// const run_rate_sortedData = monthData.sort((a, b) => parseFloat(b.run_rate) - parseFloat(a.run_rate));
|
||
// const run_rate_index = run_rate_sortedData.findIndex(obj => parseFloat(obj.run_rate) === parseFloat(run_rate_itemValue));
|
||
// let run_rate_score = 0;
|
||
// if (run_rate_index === 0){
|
||
// run_rate_score= 10;
|
||
// } else if (run_rate_index === 1) {
|
||
// run_rate_score= 7;
|
||
// } else if (run_rate_index === 2) {
|
||
// run_rate_score= 3;
|
||
// } else if (run_rate_index === 3) {
|
||
// run_rate_score= 0;
|
||
// }
|
||
// arr[29] += run_rate_score;
|
||
|
||
const production_hour_itemValue = item.production_hour; // 台时产量的值
|
||
const production_hour_sortedData = monthData.sort((a, b) => parseFloat(b.production_hour) - parseFloat(a.production_hour));
|
||
const production_hour_index = production_hour_sortedData.findIndex(obj => parseFloat(obj.production_hour) === parseFloat(production_hour_itemValue));
|
||
let production_hour_score = 0;
|
||
if (production_hour_index === 0){
|
||
production_hour_score= 10;
|
||
} else if (production_hour_index === 1) {
|
||
production_hour_score= 8;
|
||
} else if (production_hour_index === 2) {
|
||
production_hour_score= 6;
|
||
} else if (production_hour_index === 3) {
|
||
production_hour_score= 4;
|
||
}
|
||
arr[29] += production_hour_score;
|
||
|
||
const lisz_itemValue = item.出窑熟料_立升重_rate_pass; // 立升重的值
|
||
const lisz_sortedData = monthData.sort((a, b) => parseFloat(b.lisz) - parseFloat(a.lisz));
|
||
const lisz_index = lisz_sortedData.findIndex(obj => parseFloat(obj.lisz) === parseFloat(lisz_itemValue));
|
||
let production_cost_unit_score = 0;
|
||
if (lisz_index === 0){
|
||
production_cost_unit_score= 7;
|
||
} else if (lisz_index === 1) {
|
||
production_cost_unit_score= 4;
|
||
} else if (lisz_index === 2) {
|
||
production_cost_unit_score= 3;
|
||
} else if (lisz_index === 3) {
|
||
production_cost_unit_score= 2;
|
||
}
|
||
arr[29] += production_cost_unit_score;
|
||
|
||
const CaO_itemValue = item.出窑熟料_fCaO_rate_pass; // CaO的值
|
||
const CaO_sortedData = monthData.sort((a, b) => parseFloat(b.CaO) - parseFloat(a.CaO));
|
||
const CaO_index = CaO_sortedData.findIndex(obj => parseFloat(obj.CaO) === parseFloat(CaO_itemValue));
|
||
let CaO_score = 0;
|
||
if (CaO_index === 0){
|
||
CaO_score= 8;
|
||
} else if (CaO_index === 1) {
|
||
CaO_score= 6;
|
||
} else if (CaO_index === 2) {
|
||
CaO_score= 5;
|
||
} else if (CaO_index === 3) {
|
||
CaO_score= 3;
|
||
}
|
||
arr[29] += CaO_score;
|
||
arr [29] += 60;
|
||
}
|
||
wrapArr.push(arr);
|
||
});
|
||
// 深拷贝数组,防止原始数据被修改
|
||
const sortArr = [...wrapArr];
|
||
// 将数组按每4个元素进行分组
|
||
const groupSize = 4;
|
||
const groupedArr = [];
|
||
for (let i = 0; i < sortArr.length; i += groupSize) {
|
||
groupedArr.push(sortArr.slice(i, i + groupSize));
|
||
}
|
||
groupedArr.forEach(group => {
|
||
group.sort((a, b) => b[b.length - 1] - a[a.length - 1]); // 按最后一项值排序(忽略排名)
|
||
// 为每个分组内的元素计算排名
|
||
let currentRank = 1;
|
||
let previousValue = null;
|
||
group.forEach((item, index) => {
|
||
if (previousValue !== item[item.length - 1]) {
|
||
currentRank = index + 1;
|
||
previousValue = item[item.length - 1]; // 保留上一个排名
|
||
// 当前排名为索引加1
|
||
}
|
||
item.push(`${currentRank}名`);
|
||
});
|
||
});
|
||
// 扁平化分组数组
|
||
const flattenedArr = groupedArr.flat();
|
||
// 将排序并添加排名后的数据赋值给 tableDatas
|
||
that.tableDatas = flattenedArr;
|
||
}
|
||
});
|
||
});
|
||
|
||
},
|
||
handleQuery() {
|
||
this.tableDatas = [];
|
||
this.getGoalData();
|
||
},
|
||
itemClick(type, item) {
|
||
this.type = type;
|
||
this.asynDialog = true;
|
||
},
|
||
itemClick1(type, item) {
|
||
this.chartShow = false;
|
||
this.$API.bi.dataset.exec.req("3322567213885833216").then((res) => {
|
||
this.myOption = JSON.parse(res.echart_options);
|
||
debugger;
|
||
this.chartShow = true;
|
||
});
|
||
},
|
||
handlePrint() {
|
||
this.$PRINT("#myReport");
|
||
},
|
||
exportExcel() {
|
||
this.exportLoading = true;
|
||
this.$XLSX("#myTable", this.tableName);
|
||
this.exportLoading = false;
|
||
},
|
||
},
|
||
};
|
||
</script>
|
||
<style scoped>
|
||
.printWrap {
|
||
width: 100%;
|
||
overflow-x: scroll;
|
||
}
|
||
.numCell {
|
||
width: 100px !important;
|
||
}
|
||
</style>
|