From 6ed75ba83419405dae93ef9f4c3cfbb79f3af0ac Mon Sep 17 00:00:00 2001 From: sadmin Date: Tue, 13 Jan 2026 13:14:45 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D1=8B=D0=B9=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=B5=D0=BA=D1=82=20"GazTrends"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/GazTrends/BofGazTrend.vue | 612 +++++++++++++++++++++ src/routes.js | 12 + src/store/modules/GazTrends/BofGazTrend.js | 542 ++++++++++++++++++ 3 files changed, 1166 insertions(+) create mode 100644 src/components/GazTrends/BofGazTrend.vue create mode 100644 src/store/modules/GazTrends/BofGazTrend.js diff --git a/src/components/GazTrends/BofGazTrend.vue b/src/components/GazTrends/BofGazTrend.vue new file mode 100644 index 0000000..61f3aac --- /dev/null +++ b/src/components/GazTrends/BofGazTrend.vue @@ -0,0 +1,612 @@ + + + diff --git a/src/routes.js b/src/routes.js index 3466eb9..f599245 100644 --- a/src/routes.js +++ b/src/routes.js @@ -145,11 +145,23 @@ const routes = [ component: () => import("./components/PRB_FileControl.vue"), }, + { + path: "/GazTrends/BofGazTrend", + name: "BofGazTrend", + component: () => import("./components/GazTrends/BofGazTrend.vue"), + beforeEnter(to, from, next) { + axios.defaults.headers.post["project"] = "GazTrends"; + next(); + }, + }, + { path: "/stat", name: "Stat", component: () => import("./components/stat.vue"), }, + + // { // path: "/about", // name: "About", diff --git a/src/store/modules/GazTrends/BofGazTrend.js b/src/store/modules/GazTrends/BofGazTrend.js new file mode 100644 index 0000000..1bc6725 --- /dev/null +++ b/src/store/modules/GazTrends/BofGazTrend.js @@ -0,0 +1,542 @@ +import axios from "axios"; +import * as utils from "../utils.js"; +import ExcelJS from "../../plugins/exceljs/dist/exceljs.js"; +import FileSaver from "../../plugins/file-saver/src/FileSaver.js"; +import { _ } from "vue-underscore"; + + +const initialState = { + data: { + headers: [], + table: [], + prostoiSelected: [], + items: [], + chart: {}, + label: [], + originalDataset: [], + originalDataItems: [], + originalDataTable: [], + minDate: [], + maxDate: [], + }, + loading: false, +}; +const state = JSON.parse(JSON.stringify(initialState)); + +export default { + namespaced: true, + state, + getters: { + data: (state) => { + return state.data; + }, + loading: (state) => { + return state.loading; + }, + }, + mutations: { + getExcel(state, d) { + + var wb = new ExcelJS.Workbook(); + var ws = wb.addWorksheet(`Документ создан\r\n${new Date(Date.now()).print("%d.%m.%Y")}`, { + properties: { + showGridLines: false, + }, + }); + + + /*-----------------TITLE------------------------------*/ + ws.mergeCells("A1", "AA"); + ws.getCell("C1").value = `${"Эксплуатации стальковшей" + + " с " + + d[0] + + " по " + + d[1] + + "\r\n"}`; + + + var imgId = wb.addImage({ + base64: d[2], + extension: "png", + }); + //ws.mergeCells("A2", "D16"); + + + ws.addImage(imgId, { + // tl: { col: 0, row: 20 }, + // br: { col: 20, row: 30 }, + // ext: { width: 1150, height: 1200 }, + + // tl: { col: 0, row: 20 }, + br: { col: 5, row: 60 }, + ext: { width: 150, height: 100 }, + editAs: 'oneCell' + + }); + /*-----------------/TITLE------------------------------*/ + + + wb.xlsx + .writeBuffer() + .then((buffer) => + FileSaver.saveAs( + new Blob([buffer]), + `${new Date(Date.now()).print("%d.%m.%Y")}.xlsx` + ) + ) + .catch((err) => console.log("Error writing excel export", err)) + .finally(() => { }); + }, + changeAggregate(state, aggregate_id) { + this.commit("BOFHeatPhase/buildChartDataset", aggregate_id); + }, + refreshChart(state, payload) { + + let filterData = payload[0]; + + state.data.chart.dataset = state.data.originalDataset; + + let prostoi = []; + + _.pluck(filterData, 'id').forEach((id) => { + prostoi.push(_.where(state.data.table, { id: id })) + }); + + state.data.prostoiSelected = _.compact(_.uniq(_.flatten(prostoi))).map((items) => { + return { + ...items, + heat_number: _.first(_.pluck(_.where(state.data.items, { id: items.id }), 'HEAT_NUMBER')), + phase_duration: _.first(_.pluck(_.where(state.data.items, { id: items.id }), 'PROSTOI_DURATION')), + prostoi_descr:_.first(_.pluck(_.where(_.where(state.data.items, { id: items.id }), { PROSTOI_DESC: 'Простой' }), 'PP_Descr')), + // prostoi_descr:_.uniq(_.pluck(_.where(state.data.prostoiSelected, { id: items.id }), 'DescrPrichin')), + }; + }); + + var arr_temp = []; + filterData.forEach((item) => { + arr_temp.push(_.first(_.filter(state.data.chart.dataset, function (num) { return num.id == item.id }))); + }); + state.data.chart.dataset = _.reject(state.data.chart.dataset, { aggregate: 'prostoy' }) + _.compact(_.uniq(arr_temp)).forEach((item) => { + state.data.chart.dataset.push(item) + }); + + + }, + buildChartDataset(state, aggregate_id) { + + state.data.items = state.data.originalDataItems; + state.data.table = state.data.originalDataTable; + + + switch (aggregate_id) { + case "K1": + state.data.items = _.where(state.data.items, { AGGREGATE_ID: 1 }) + state.data.table = _.where(state.data.table, { Agregat: 'К1' }) + break; + case "K2": + state.data.items = _.where(state.data.items, { AGGREGATE_ID: 2 }) + state.data.table = _.where(state.data.table, { Agregat: 'К2' }) + break; + } + + let prostoiSample = _.reject(_.where(state.data.table, { Descr: 'Простой' }), { DescrPrichin: 'Прочие' }); + state.data.prostoiSelected = _.reject(prostoiSample, { DescrPrichin: null }); + + + state.data.prostoiSelected = state.data.prostoiSelected.map((items) => { + return { + ...items, + heat_number: _.first(_.pluck(_.where(state.data.items, { id: items.id }), 'HEAT_NUMBER')), + phase_duration: _.first(_.pluck(_.where(state.data.items, { id: items.id }), 'PROSTOI_DURATION')), + prostoi_descr:_.first(_.pluck(_.where(_.where(state.data.items, { id: items.id }), { PROSTOI_DESC: 'Простой' }), 'PP_Descr')), + // prostoi_descr:_.uniq(_.pluck(_.where(state.data.prostoiSelected, { id: items.id }), 'DescrPrichin')), + }; + }); + + state.data.chart.label = []; + state.data.chart.dataset = []; + + let BOF1_HEATS = _.uniq(_.pluck(_.where(state.data.items, { AGGREGATE_ID: 1 }), 'HEAT_NUMBER')); + let BOF2_HEATS = _.uniq(_.pluck(_.where(state.data.items, { AGGREGATE_ID: 2 }), 'HEAT_NUMBER')); + if (_.size(BOF1_HEATS) != 0) { + state.data.chart.label.push('K1'); + state.data.chart.label.push(BOF1_HEATS); + } + if (_.size(BOF2_HEATS) != 0) { + state.data.chart.label.push('K2'); + state.data.chart.label.push(BOF2_HEATS); + } + state.data.chart.label = _.flatten(state.data.chart.label); + + + let DiffMin = function (start, end) { + let start_ = new Date(start); + let end_ = new Date(end); + let dif = (end_ - start_); + return Math.round((dif / 1000) / 60) + }; + + // ----------------------------BOF---------------------------------------------------------------------------------------------------------- + state.data.chart.label.forEach((heatNumber,) => { + let start = new Date(_.first(_.pluck(_.where(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), { PHASE_NAME: 'Завалка' }), 'DATE_START'))); + + let end = _.first(_.pluck(_.where(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), { PHASE_NAME: 'Слив шлака' }), 'DATE_END')) === null ? + new Date(_.first(_.pluck(_.where(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), { PHASE_NAME: 'Слив металла' }), 'DATE_END'))) : + new Date(_.first(_.pluck(_.where(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), { PHASE_NAME: 'Слив шлака' }), 'DATE_END'))); + + + // if (_.first(_.pluck(_.where(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), { PHASE_NAME: 'Слив шлака' }), 'DATE_END')) === null) { + // end = new Date(_.first(_.pluck(_.where(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), { PHASE_NAME: 'Азотирование' }), 'DATE_END'))) + // } + // else if (_.first(_.pluck(_.where(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), { PHASE_NAME: 'Азотирование' }), 'DATE_END')) === null) { + // end = new Date(_.first(_.pluck(_.where(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), { PHASE_NAME: 'Слив металла' }), 'DATE_END'))) + // } else { + // end = new Date(_.first(_.pluck(_.where(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), { PHASE_NAME: 'Слив шлака' }), 'DATE_END'))); + // } + + // console.log(end) + + + state.data.chart.dataset.push({ + aggregate: 'bof', + backgroundColor: '#51C27F', + // barPercentage: 0.5, + // categoryPercentage: 0.7, + date_start: _.first(_.pluck(_.where(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), { PHASE_NAME: 'Завалка' }), 'DATE_START')), + date_end: _.first(_.pluck(_.where(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), { PHASE_NAME: 'Слив шлака' }), 'DATE_END')) === null ? + _.first(_.pluck(_.where(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), { PHASE_NAME: 'Слив металла' }), 'DATE_END')) : + _.first(_.pluck(_.where(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), { PHASE_NAME: 'Слив шлака' }), 'DATE_END')), + //borderWidth: 1, + //borderColor:'red', + data: + [{ + x: [ + start, + end + ], + y: heatNumber, + // PHASE_DURATION: DiffMin(start, end) + PHASE_DURATION: end.getTime() >= new Date(state.data.date_start_hidden).getTime() && + (end.getTime() <= new Date(state.data.date_end_hidden).getTime()) ? DiffMin(start, end) : '', + //PHASE_DURATION: (end.getTime() >= new Date(state.data.date_start_hidden).getTime() && end.getTime() <= new Date(state.data.date_end_hidden).getTime()) ? DiffMin(start, end) : '', + }, + ], + }); + }); + // ----------------------------Простой---------------------------------------------------------------------------------------------------------- + // arrLabel = []; + state.data.chart.label.forEach((heatNumber,) => { + let start = _.first(_.pluck(_.where(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), { PROSTOI_DESC: 'Простой' }), 'P_START')); + let end = _.first(_.pluck(_.where(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), { PROSTOI_DESC: 'Простой' }), 'P_END')); + // arrLabel.push(index) + state.data.chart.dataset.push({ + aggregate: 'prostoy', + id: _.first(_.uniq(_.compact(_.pluck(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), 'id')))), + backgroundColor: '#C2CBD1', + //label: index == arrLabel ? ProstoylabelName : '', + // label: index == 0 ? ProstoylabelName : '', + p_start: start, + p_end: end, + //order:1, + //stack: true, + data: + [{ + x: [ + start, + end, + ], y: heatNumber, + PHASE_DURATION: _.first(_.pluck(_.where(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), { PROSTOI_DESC: 'Простой' }), 'PROSTOI_DURATION')), + prostoi_name: _.first(_.pluck(_.where(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), { PROSTOI_DESC: 'Простой' }), 'PP_Descr')), + }, + ] + }); + }); + + /// console.log(state.data.chart.dataset) + // ----------------------------LF---------------------------------------------------------------------------------------------------------- + state.data.chart.label.forEach((heatNumber,) => { + let start = _.first(_.pluck(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), 'LF_START')); + let end = _.first(_.pluck(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), 'LF_END')); + state.data.chart.dataset.push({ + aggregate: 'lf', + backgroundColor: '#FF6F4D', + lf_start: start, + lf_end: end, + //stack: true, + data: + [{ + x: [ + start, + _.isNull(end) ? start : end + ], y: heatNumber, + //PHASE_DURATION: _.first(_.pluck(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), 'LF_DURATION')), + //PHASE_DURATION: new Date(end).getTime() <= new Date(state.data.date_end_hidden).getTime() ? _.first(_.pluck(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), 'LF_DURATION')) : '', + PHASE_DURATION: (new Date(end).getTime() >= new Date(state.data.date_start_hidden).getTime() + && new Date(end).getTime() <= new Date(state.data.date_end_hidden).getTime()) ? + _.first(_.pluck(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), 'LF_DURATION')) : '', + }, + ] + }); + }); + // ----------------------------CCM_STATUS2---------------------------------------------------------------------------------------------------------- + state.data.chart.label.forEach((heatNumber,) => { + let start = new Date(_.first(_.pluck(_.where(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), { CCM_STATUS: 1 }), 'CCM_STATUS_TIME'))); + let end = new Date(_.last(_.pluck(_.where(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), { CCM_STATUS: 2 }), 'CCM_STATUS_TIME'))); + if (end != 'Invalid Date') { + state.data.chart.dataset.push({ + aggregate: 'ccm_status2', + backgroundColor: '#00eeff', + ccm_status2_start: _.first(_.pluck(_.where(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), { CCM_STATUS: 1 }), 'CCM_STATUS_TIME')), + ccm_status2_end: _.last(_.pluck(_.where(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), { CCM_STATUS: 2 }), 'CCM_STATUS_TIME')), + data: + [{ + x: [ + start, + end, + ], y: heatNumber, + PHASE_DURATION: end.getTime() >= new Date(state.data.date_start_hidden).getTime() && + (end.getTime() <= new Date(state.data.date_end_hidden).getTime()) ? DiffMin(start, end) : '', + }, + ] + }); + } + }); + // ----------------------------CCM_STATUS3---------------------------------------------------------------------------------------------------------- + state.data.chart.label.forEach((heatNumber,) => { + let start = new Date(_.last(_.pluck(_.where(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), { CCM_STATUS: 2 }), 'CCM_STATUS_TIME'))); + let end = new Date(_.last(_.pluck(_.where(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), { CCM_STATUS: 3 }), 'CCM_STATUS_TIME'))); + if (end != 'Invalid Date') { + state.data.chart.dataset.push({ + aggregate: 'ccm_status3', + backgroundColor: '#01d5e4', + ccm_status3_start: _.last(_.pluck(_.where(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), { CCM_STATUS: 2 }), 'CCM_STATUS_TIME')), + ccm_status3_end: _.last(_.pluck(_.where(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), { CCM_STATUS: 3 }), 'CCM_STATUS_TIME')), + data: + [{ + x: [ + start, + end, + ], y: heatNumber, + //PHASE_DURATION: DiffMin(start, end) + //PHASE_DURATION: end.getTime() <= new Date(state.data.date_hidden).getTime() ? DiffMin(start, end) : '', + PHASE_DURATION: end.getTime() >= new Date(state.data.date_start_hidden).getTime() && + (end.getTime() <= new Date(state.data.date_end_hidden).getTime()) ? DiffMin(start, end) : '', + }, + ] + }); + } + }); + //----------------------------CCM_STATUS4---------------------------------------------------------------------------------------------------------- + state.data.chart.label.forEach((heatNumber,) => { + let start = new Date(_.last(_.pluck(_.where(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), { CCM_STATUS: 3 }), 'CCM_STATUS_TIME'))); + let end = new Date(_.last(_.pluck(_.where(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), { CCM_STATUS: 7 }), 'CCM_STATUS_TIME'))); + if (end != 'Invalid Date') { + state.data.chart.dataset.push({ + aggregate: 'ccm_status4', + backgroundColor: '#03a2ad', + ccm_status4_start: _.last(_.pluck(_.where(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), { CCM_STATUS: 3 }), 'CCM_STATUS_TIME')), + ccm_status4_end: _.last(_.pluck(_.where(_.where(state.data.items, { HEAT_NUMBER: heatNumber }), { CCM_STATUS: 7 }), 'CCM_STATUS_TIME')), + data: + [{ + x: [ + start, + end, + ], y: heatNumber, + // PHASE_DURATION: DiffMin(start, end) + //PHASE_DURATION: end.getTime() <= new Date(state.data.date_hidden).getTime() ? DiffMin(start, end) : '', + PHASE_DURATION: end.getTime() >= new Date(state.data.date_start_hidden).getTime() && + (end.getTime() <= new Date(state.data.date_end_hidden).getTime()) ? DiffMin(start, end) : '', + }, + ] + }); + } + }); + + state.data.originalDataset = state.data.chart.dataset; + + }, + set_data(state, payload) { + state.data.items = payload[0]; + state.data.originalDataItems = state.data.items; + + state.data.table = payload[1]; + state.data.originalDataTable = state.data.table; + state.data.headers = utils.getHeaders(state.data.table); + + let date = payload[2][2]; + + state.data.date_start_hidden = new Date(new Date(date).getFullYear(), + new Date(date).getMonth(), + new Date(date).getDate()) + .toISOString() + .substr(0, 10) + ' 23:30:00'; + + + state.data.date_end_hidden = new Date(new Date(date).getFullYear(), + new Date(date).getMonth(), + new Date(date).getDate() + 1) + .toISOString() + .substr(0, 10) + ' 23:00:00'; + + state.data.headers.forEach((element) => { + switch (element.text) { + case "Agregat": + element.text = "Агрегат"; + break; + case "Descr": + element.text = "Этапы"; + break; + case "Br": + element.text = "Бригада"; + break; + case "DtB": + element.text = "Начало"; + break; + case "DtE": + element.text = "Конец"; + break; + case "Cikl": + element.text = "Длительность"; + break; + case "RashDtB": + element.text = "Начало"; + break; + case "RashDtE": + element.text = "Конец"; + break; + case "Cikl2": + element.text = "Длительность"; + break; + case "DescrGroup": + element.text = "Группа"; + break; + case "DescrPrichin": + element.text = "Причина"; + break; + case "Prim": + element.text = "Примечание"; + break; + } + }); + + // let prostoiSample = _.reject(_.where(state.data.table, { Descr: 'Простой' }), { DescrPrichin: 'Прочие' }); + // state.data.prostoiSelected = _.reject(prostoiSample, { DescrPrichin: null }); + // state.data.prostoiSelected = state.data.prostoiSelected.map((items) => { + // return { + // ...items, + // heat_number: _.first(_.pluck(_.where(state.data.items, { id: items.id }), 'HEAT_NUMBER')), + // phase_duration: _.first(_.pluck(_.where(state.data.items, { id: items.id }), 'PROSTOI_DURATION')), + // }; + // }); + this.commit("BOFHeatPhase/buildChartDataset"); + + + // this.commit("BOFHeatPhase/buildChartDataset"); + + //...............................................Конвертер по циклам..................// + // let PHASE_NO = [30, 92]; + // let PHASE_NAME = []; + // PHASE_NO.forEach((element) => { + // PHASE_NAME.push(_.pick(_.findWhere(state.data.items, { PHASE_NO: element }), 'PHASE_NAME')) + // }); + // PHASE_NAME = _.pluck(PHASE_NAME, 'PHASE_NAME'); + + // PHASE_NAME.forEach((element) => { + // state.data.chart.dataset.push({ + // label: element, + // backgroundColor: _.first(_.pluck(_.where(barColors, { name: element }), 'color')), + // data: + // [{ + // x: [ + // _.pluck(_.where(state.data.items, { PHASE_NAME: element }), 'DATE_START'), + // _.pluck(_.where(state.data.items, { PHASE_NAME: element }), 'DATE_END') + // ], y: _.pluck(_.where(state.data.items, { PHASE_NAME: element }), 'HEAT_NUMBER') + // }] + + + // // _.pluck(_.where(state.data.items, { PHASE_NAME: element }), 'PHASE_DURATION'), + // // date_start: _.pluck(_.where(state.data.items, { PHASE_NAME: element }), 'DATE_START'), + // // date_end: _.pluck(_.where(state.data.items, { PHASE_NAME: element }), 'DATE_END'), + // }) + // }); + + + // state.data.chart.dataset.push({ + // label: 'Простой', + // backgroundColor: '#C2CBD1', + // data: + // _.pluck(_.where(state.data.items, { PROSTOI_DESC: 'Простой' }), 'PROSTOI_DURATION'), + // prostoi_name: _.pluck(_.where(state.data.items, { PROSTOI_DESC: 'Простой' }), 'PP_Descr') + // }) + + // state.data.chart.dataset.forEach((element) => { + // if (_.isEmpty(_.compact(element.data))) { + // element.label = ''; + // } + // }) + }, + set_loading(state, payload) { + state.loading = payload; + }, + resetState(state) { + Object.assign(state, JSON.parse(JSON.stringify(initialState))); + }, + }, + actions: { + changeAggregate({ commit }, data) { + commit("changeAggregate", data); + }, + refreshChart({ commit }, data) { + commit("refreshChart", data); + }, + getData({ commit }, date) { + commit("set_loading", true); + const dataPhase = axios({ + data: { + params: { + flag: "getData_BOFHeatPhase", + dateStart: date[0], + dateEnd: date[1], + }, + }, + }); + const dataProstoi = axios({ + data: { + params: { + flag: "getData_BOFHeatPhaseProstoi", + dateStart: date[0], + dateEnd: date[1], + }, + }, + }); + return axios + .all([ + dataPhase, + dataProstoi + ]) + .then( + axios.spread((...responses) => { + const dataPhase = responses[0].data; + const dataProstoi = responses[1].data; + if (dataPhase.length) { + commit("set_data", [ + dataPhase, dataProstoi, date + ]); + + } else { + commit("resetState"); + } + }) + ) + .catch((error) => { + commit("set_loading", false); + commit("resetState"); + console.log(error); + }) + .finally(() => { + commit("set_loading", false); + }); + }, + }, +};