Browse Source

增加双细则考核

SunZehao 3 months ago
parent
commit
f2e546a221

File diff suppressed because it is too large
+ 7 - 0
src/App.vue


+ 11 - 0
src/router/index.js

@@ -117,6 +117,17 @@ const routes = [
                 '../views/powerPrediction/stationPowerContro.vue'
             ),
     },
+    {
+        path: '/powerPrediction/detailedRules',
+        name: 'detailedRules',
+        meta: {
+            title: '双细则考核',
+        },
+        component: () =>
+            import(
+                '../views/powerPrediction/detailedRulesPage.vue'
+            ),
+    },
     //智能报表
     {
         path: "/intelligentReport/gkjlb",

+ 37 - 0
src/views/powerPrediction/component/detailedRules.json

@@ -0,0 +1,37 @@
+{
+    "code": 200,
+    "data": {
+        "stationData1": [
+            { "stationName": "场站A", "code1": 85, "code2": 80},
+            { "stationName": "场站B", "code1": 83, "code2": 79},
+            { "stationName": "场站C", "code1": 88, "code2": 84},
+            { "stationName": "场站D", "code1": 80, "code2": 76},
+            { "stationName": "场站E", "code1": 87, "code2": 83},
+            { "stationName": "场站F", "code1": 84, "code2": 80}
+        ],
+        "stationData2": [
+            { "stationName": "场站A", "code1": 85, "code2": 80, "code3": 85, "code4": 80},
+            { "stationName": "场站B", "code1": 65, "code2": 79, "code3": 76, "code4": 35},
+            { "stationName": "场站C", "code1": 76, "code2": 38, "code3": 45, "code4": 72},
+            { "stationName": "场站D", "code1": 90, "code2": 57, "code3": 54, "code4": 28},
+            { "stationName": "场站E", "code1": 52, "code2": 49, "code3": 68, "code4": 48},
+            { "stationName": "场站F", "code1": 39, "code2": 90, "code3": 33, "code4": 68}
+        ],
+        "stationData3": [
+            { "stationName": "场站A", "code1": 85, "code2": 80},
+            { "stationName": "场站B", "code1": 83, "code2": 79},
+            { "stationName": "场站C", "code1": 88, "code2": 84},
+            { "stationName": "场站D", "code1": 80, "code2": 76},
+            { "stationName": "场站E", "code1": 87, "code2": 83},
+            { "stationName": "场站F", "code1": 84, "code2": 80}
+        ],
+        "stationData": [
+            { "name": "场站A", "shortPeak": 85, "shortNonPeak": 80, "ultraAcc": [82, 78, 75, 70], "available": { "actual": 120, "possible": 123 } },
+            { "name": "场站B", "shortPeak": 83, "shortNonPeak": 79, "ultraAcc": [81, 77, 74, 69], "available": { "actual": 110, "possible": 115 } },
+            { "name": "场站C", "shortPeak": 88, "shortNonPeak": 84, "ultraAcc": [83, 80, 77, 72], "available": { "actual": 125, "possible": 130 } },
+            { "name": "场站D", "shortPeak": 80, "shortNonPeak": 76, "ultraAcc": [78, 75, 70, 65], "available": { "actual": 100, "possible": 105 } },
+            { "name": "场站E", "shortPeak": 87, "shortNonPeak": 83, "ultraAcc": [85, 80, 77, 73], "available": { "actual": 135, "possible": 140 } },
+            { "name": "场站F", "shortPeak": 84, "shortNonPeak": 80, "ultraAcc": [83, 78, 75, 71], "available": { "actual": 118, "possible": 122 } }
+        ]
+    }
+}

+ 389 - 0
src/views/powerPrediction/detailedRulesPage.vue

@@ -0,0 +1,389 @@
+<template>
+    <div class="detailedRules" :class="!theme ? 'themeDark' : ''">
+        <div class="detailedRulesSeach">
+            <div class="seach_top">
+                <div class="exceed">
+                    <span class="exceedName" style="x`">时间:</span>
+                    <el-date-picker v-model="pickerTime" @change="changeTime" format="YYYY-MM-DD" type="date"
+                        placeholder="选择时间" />
+                </div>
+                <el-button type="primary" @click="seachData">计 算</el-button>
+            </div>
+        </div>
+        <el-row class="detailedRulesMain" v-loading="loading">
+            <!-- warn-table -->
+            <el-col :span="it.span" class="detailedRulesitem " v-for="(it, index) in stateData" :key="index">
+                <div class="leftContent">
+                    <span>{{ it.name }}</span>
+                </div>
+                <el-table :data="it.datas" border style="width: 100%" element-loading-background="rgba(0,0,0,.5)"
+                    :header-cell-style="{
+                        padding: '4px',
+                        fontSize: '11px',
+                        fontWeight: bold,
+                        border: '0.5px solid rgba(0,0,0,.5) !important',
+                        }" :cell-style="{
+                        height: '40px',
+                        padding: '3px',
+                        fontSize: '11px',
+                        'border-top': '0px solid rgba(0,0,0,.5)',
+                        'border-bottom': '1px solid rgba(0,0,0,.5)',
+                        'border-right': '1px solid  rgba(0,0,0,.5)',
+                        }">
+                    <el-table-column :prop="item.code" :label="item.name" :width="item.width?item.width:''"
+                        align="center" v-for="(item, index) in it.column" :key="index">
+                    </el-table-column>
+                </el-table>
+                <div :id="it.nameEn" style="width:100%;height:50vh;margin-top:20px"></div>
+            </el-col>
+        </el-row>
+    </div>
+</template>
+
+<script>
+    import {
+        apiGetallStationPower
+    } from "../../api/api";
+
+    import jsonData from "./component/detailedRules.json";
+    import dayjs from "dayjs";
+    export default {
+        data() {
+            return {
+                loading: false,
+                pickerTime: "",
+                titelMonth: "",
+                stateData: [{
+                        name: "短期预测",
+                        nameEn: "shortTerm",
+                        span: 7,
+                        column: [{
+                                name: "场站名称",
+                                code: "stationName"
+                            },
+                            {
+                                name: "重点时段准确率(%)",
+                                code: "code1"
+                            },
+                            {
+                                name: "非重点时段准确率(%)",
+                                code: "code2"
+                            },
+                            {
+                                name: "考核扣分",
+                                code: "code3",
+                                width: 80
+                            }
+                        ],
+                        datas: []
+                    },
+                    {
+                        name: "超短期预测",
+                        nameEn: "ultraShortTerm",
+                        span: 9,
+                        column: [{
+                                name: "场站名称",
+                                code: "stationName"
+                            },
+                            {
+                                name: "1小时准确率(%)",
+                                code: "code1"
+                            },
+                            {
+                                name: "2小时准确率(%)",
+                                code: "code2"
+                            },
+                            {
+                                name: "3小时准确率(%)",
+                                code: "code3"
+                            },
+                            {
+                                name: "4小时准确率(%)",
+                                code: "code4"
+                            },
+                            {
+                                name: "考核扣分",
+                                code: "code5",
+                                width: 80
+                            }
+                        ],
+                        datas: []
+                    },
+                    {
+                        name: "可用电量",
+                        nameEn: "availablePower",
+                        span: 8,
+                        column: [{
+                                name: "场站名称",
+                                code: "stationName"
+                            },
+                            {
+                                name: "实际电量(Mwh)",
+                                code: "code1"
+                            },
+                            {
+                                name: "可用电量(Mwh)",
+                                code: "code2"
+                            },
+                            {
+                                name: "准确率(%)",
+                                code: "code3"
+                            },
+                            {
+                                name: "考核扣分",
+                                code: "code4",
+                                width: 80
+                            }
+                        ],
+                        datas: []
+                    },
+                ],
+                echartsTheme: "",
+                theme: null,
+            };
+        },
+        watch: {
+            "$store.state.theme": {
+                handler: function (newVal, oldVal) {
+                    this.theme = newVal;
+                    this.echartsTheme = !newVal ? "dark" : "";
+                    // this.getStationData();
+                },
+                immediate: true,
+            },
+        },
+        created() {
+            this.pickerTime = dayjs(new Date()).format("YYYY-MM-DD");
+            this.titelMonth =
+                this.pickerTime.split("-")[0] +
+                "年" +
+                this.pickerTime.split("-")[1] +
+                "月" +
+                this.pickerTime.split("-")[2] +
+                "日";
+        },
+        mounted() {
+            this.getStationData();
+        },
+        methods: {
+            getStationData() {
+                let that = this;
+                // that.loading = true;
+                // let params = {
+                //     date: that.pickerTime,
+                // };
+                // apiGetallStationPower(params).then((res) => {
+                //     that.loading = false;
+                // })
+                this.getshortTermdata(jsonData.data.stationData1)
+                this.getultraShortTermdata(jsonData.data.stationData2)
+                this.getavailablePowerdata(jsonData.data.stationData3)
+            },
+            getshortTermdata(datas) {
+                this.stateData[0].datas = datas
+                let xAxis = []
+                let shortPeak = []
+                let shortNonPeak = []
+                datas.forEach(it => {
+                    xAxis.push(it.stationName)
+                    shortPeak.push(it.code1)
+                    shortNonPeak.push(it.code2)
+                });
+                let series = [{
+                        name: "重点时段准确率(%)",
+                        data: shortPeak,
+                        type: 'bar'
+                    },
+                    {
+                        name: "非重点时段准确率(%)",
+                        data: shortNonPeak,
+                        type: 'bar'
+                    }
+                ]
+                this.getPowerLine("shortTerm", xAxis, series, "(%)")
+            },
+            getultraShortTermdata(datas) {
+                this.stateData[1].datas = datas
+                let xAxis = ["1小时", "2小时", "小时", "4小时"]
+                let series = []
+                datas.forEach(it => {
+                    let seriesObj = {
+                        name: it.stationName,
+                        type: "line",
+                        data: [it.code1, it.code2, it.code3, it.code4],
+                        symbol: "none",
+                    };
+                    series.push(seriesObj);
+                });
+                this.getPowerLine("ultraShortTerm", xAxis, series)
+            },
+            getavailablePowerdata(datas) {
+                this.stateData[2].datas = datas
+                let xAxis = []
+                let active = []
+                let available = []
+                datas.forEach(it => {
+                    xAxis.push(it.stationName)
+                    active.push(it.code1)
+                    available.push(it.code2)
+                });
+                let series = [{
+                        name: "实际电量(Mwh)",
+                        data: active,
+                        type: 'bar'
+                    },
+                    {
+                        name: "可用电量(Mwh)",
+                        data: available,
+                        type: 'bar'
+                    }
+                ]
+                this.getPowerLine("availablePower", xAxis, series, "(Mwh)")
+            },
+            getPowerLine(name, xAxis, series, unit) {
+                let option = {
+                    legend: {},
+                    tooltip: {
+                        trigger: 'axis',
+                        axisPointer: {
+                            type: 'shadow'
+                        }
+                    },
+                    xAxis: {
+                        type: "category",
+                        data: xAxis,
+                    },
+                    yAxis: {
+                        type: "value",
+                        name: unit,
+                        splitLine: {
+                            lineStyle: {
+                                color: this.theme ? "#000" : "#ccc",
+                                type: "dashed", // 修改为虚线
+                                opacity: 0.2,
+                            }
+                        }
+                    },
+                    series: series,
+                };
+                if (!this.theme) {
+                    option.backgroundColor = "";
+                }
+                // 基于准备好的dom,初始化echarts实例
+                let dom = document.getElementById(name);
+                dom.removeAttribute("_echarts_instance_") ?
+                    dom.removeAttribute("_echarts_instance_") :
+                    "";
+                let myChart = this.$echarts.init(dom, this.echartsTheme);
+                myChart.setOption(option);
+                window.addEventListener("resize", function () {
+                    myChart.resize();
+                });
+            },
+            seachData() {
+                let str = dayjs(this.pickerTime).format("YYYY-MM");
+                this.titelMonth = str.split("-")[0] + "年" + str.split("-")[1] + "月";
+                this.getStationData();
+            },
+        },
+    };
+</script>
+
+<style lang="less">
+    .detailedRules {
+        padding: 0 20px 0 20px;
+
+        .detailedRulesSeach {
+            margin-top: 20px;
+
+            .seach_top {
+                display: flex;
+
+                .exceed {
+                    .exceedName {
+                        margin-top: 7px;
+                        font-size: 14px;
+                        margin-left: 10px;
+                    }
+
+                    display: flex;
+                    margin-right: 20px;
+
+                    .el-select,
+                    .el-select__wrapper {
+                        height: 32px;
+                    }
+
+                    .el-date-editor {
+                        height: 32px;
+
+                        .el-input__icon,
+                        .el-range-separator {
+                            line-height: 30px;
+                        }
+                    }
+
+                    .select-trigger {
+                        .el-input {
+                            .el-input__wrapper {
+                                height: 30px;
+                            }
+                        }
+
+                        .el-input__suffix {
+                            .el-input__icon {
+                                line-height: 30px;
+                            }
+                        }
+                    }
+                }
+
+                .el-button {
+                    height: 30px;
+                    padding: 0 20px;
+                    line-height: 5px;
+                }
+            }
+        }
+
+        .detailedRulesMain {
+            .detailedRulesitem {
+                padding: 20px 0;
+
+                .leftContent {
+                    width: 242px;
+                    height: 41px;
+                    display: flex;
+                    align-items: center;
+                    background: url("~@/assets/imgs/title_left_bg.png") no-repeat;
+
+                    span {
+                        font-size: 16px;
+                        font-family: Microsoft YaHei;
+                        font-weight: 400;
+                        color: #05bb4c;
+                        margin-left: 25px;
+                    }
+                }
+            }
+        }
+    }
+
+    .themeDark {
+        background-image: none;
+
+        .detailedRulesSeach {
+            .exceedName {
+                color: #fff;
+            }
+        }
+    }
+
+    .themeLight {
+        .detailedRulesSeach {
+            .exceedName {
+                color: #000;
+            }
+        }
+    }
+</style>