whychdw
2021-06-19 c92f5e10ecdd51b4cd35e71c20c51b4a4a267458
提交内容
8个文件已修改
3239 ■■■■ 已修改文件
src/assets/js/config.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/params/BTS/DischargeParams.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/dataTest/history.vue 3076 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/dataTest/movingRingSystem/const/getPowerConfigData.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/dataTest/movingRingSystem/dialog/acConfig.vue 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/dataTest/movingRingSystem/dialog/acDcConfig.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/dataTest/movingRingSystem/dialog/dcConfig.vue 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/dataTest/movingRingSystem/powerBox.vue 84 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/js/config.js
@@ -28,6 +28,6 @@
    dischargeByFace: {
        label: '启动放电添加人脸识别',
        des: '启动充放电测试使用人脸识别',
        value: true,
        value: false,
    },
}
src/components/params/BTS/DischargeParams.vue
@@ -106,7 +106,7 @@
                    </el-form-item>
                </div>
                <div class="table-cell pr16">
                    <el-form-item label="温度上限(℃)">
                    <el-form-item label="设备温度上限(℃)">
                        <el-input v-model="params.MonomerTmp_High"></el-input>
                    </el-form-item>
                </div>
src/pages/dataTest/history.vue
@@ -1,157 +1,166 @@
<template>
  <flex-layout direction="row" class="page-history" :no-bg="true">
    <home-list slot="header" @toggleChange="toggleChange" @leaf-click="leafClick"></home-list>
    <content-box style="margin-left: 4px; margin-right: 4px;" :title="battFullName">
      <div slot="box-tools" class="box-tools">
        <el-tooltip class="item" effect="dark" content="实时数据" placement="bottom">
          <i class="iconfont el-icon-jinru" @click="syncPage"></i>
        </el-tooltip>
      </div>
      <div slot="box-tools" class="box-tools" style="right: 36px;">
        <el-tooltip class="item" effect="dark" content="数据对比" placement="bottom">
          <i class="iconfont el-icon-jiankong" @click="toShowComparison"></i>
        </el-tooltip>
      </div>
      <div slot="box-tools" class="box-tools" style="right: 65px;">
        <el-tooltip class="item" effect="dark" content="数据导出" placement="bottom">
          <i class="iconfont el-icon-daochu" @click="exportExcel" style="font-size: 24px"></i>
        </el-tooltip>
      </div>
      <div slot="box-tools" class="box-tools" style="right: 96px;">
        <el-tooltip class="item" effect="dark" content="标准曲线" placement="bottom">
          <i class="iconfont el-icon-biaozhunquxian" @click="confirmAddStandardLine" style="font-size: 20px"></i>
        </el-tooltip>
      </div>
      <flex-layout :no-bg="true">
        <div class="content-header" slot="header">
          <div class="table-layout">
            <div class="table-row">
              <div class="table-cell text-right w80">电池状态:</div>
              <div class="table-cell">
                <el-input v-model="formateBattState" placeholder="" size="small" :disabled="true"></el-input>
              </div>
              <div class="table-cell text-right w80">端电压:</div>
              <div class="table-cell">
                <el-input v-model="top.group" placeholder="" size="small" :disabled="true"
                          style="min-width:12rem"></el-input>
              </div>
              <div class="table-cell text-right w80">电池电流:</div>
              <div class="table-cell">
                <el-input v-model="top.curr" placeholder="" size="small" :disabled="true"></el-input>
              </div>
              <div class="table-cell text-right w80">测试时长:</div>
              <div class="table-cell">
                <el-input v-model="top.test_long" placeholder="" size="small" :disabled="true"></el-input>
              </div>
            </div>
            <div class="table-row">
              <div class="table-cell text-right w80">测试日期:</div>
              <div class="table-cell">
                <el-cascader v-model="test_record.value" :options="test_record.list" size="small" placeholder="请选择测试日期"
                             style="width: 100%; min-width:16rem"
                             @change="testRecordChange">
                  <template slot-scope="{ node, data }">
                    <span>{{ data.label }}</span>
                    <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
                  </template>
                </el-cascader>
              </div>
              <div class="table-cell text-right w80">测试容量:</div>
              <div class="table-cell">
                <el-input v-model="top.test_cap" placeholder="" size="small" :disabled="true"></el-input>
              </div>
              <div class="table-cell text-right w80">剩余容量:</div>
              <div class="table-cell">
                <el-input v-model="top.re_cap" placeholder="" size="small" :disabled="true"></el-input>
              </div>
              <div class="table-cell text-right w80">续航时长:</div>
              <div class="table-cell">
                <el-tooltip class="item" effect="dark" content="机房停电时电池对实际负载供电时长" placement="top">
                  <el-input v-model="top.xuhang" placeholder="" size="small" :disabled="true"></el-input>
    <flex-layout direction="row" class="page-history" :no-bg="true">
        <home-list slot="header" @toggleChange="toggleChange" @leaf-click="leafClick"></home-list>
        <content-box style="margin-left: 4px; margin-right: 4px;" :title="battFullName">
            <div slot="box-tools" class="box-tools">
                <el-tooltip class="item" effect="dark" content="实时数据" placement="bottom">
                    <i class="iconfont el-icon-jinru" @click="syncPage"></i>
                </el-tooltip>
              </div>
            </div>
          </div>
        </div>
        <div class="page-content">
          <div class="flex-box-list">
            <div class="flex-box" style="margin-bottom: 8px;">
              <chart-wrapper title="端电压折线图(V)">
                <line-chart ref="groupVol" id="groupVol" unit="V"></line-chart>
              </chart-wrapper>
            <div slot="box-tools" class="box-tools" style="right: 36px;">
                <el-tooltip class="item" effect="dark" content="数据对比" placement="bottom">
                    <i class="iconfont el-icon-jiankong" @click="toShowComparison"></i>
                </el-tooltip>
            </div>
            <div class="flex-box" style="margin-bottom: 8px;">
              <chart-wrapper :title="monBarTitle">
                <div class="chart-tools-wrapper">
                  <el-select v-model="chartType" size="mini" @change="changeChartType">
                    <el-option
                        v-for="item in chartTypes" :key="item.value"
                        :label="item.label"
                        :value="item.value"></el-option>
                  </el-select>
                </div>
                <bar-chart ref="monBar" id="monBar" :show-label="false"></bar-chart>
              </chart-wrapper>
            <div slot="box-tools" class="box-tools" style="right: 65px;">
                <el-tooltip class="item" effect="dark" content="数据导出" placement="bottom">
                    <i class="iconfont el-icon-daochu" @click="exportExcel" style="font-size: 24px"></i>
                </el-tooltip>
            </div>
          </div>
          <div class="flex-box-list">
            <div class="flex-box" style="margin-top: 8px;">
              <chart-wrapper title="电池电流折线图(A)">
                <line-chart ref="groupCurr" id="groupCurr" unit="A" start-zero></line-chart>
              </chart-wrapper>
            <div slot="box-tools" class="box-tools" style="right: 96px;">
                <el-tooltip class="item" effect="dark" content="标准曲线" placement="bottom">
                    <i class="iconfont el-icon-biaozhunquxian" @click="confirmAddStandardLine"
                       style="font-size: 20px"></i>
                </el-tooltip>
            </div>
            <div class="flex-box" style="margin-top: 8px;">
              <chart-wrapper :title="monInfo.title">
                <line-chart ref="monInfo" id="monInfo" :unit="monInfo.unit"></line-chart>
              </chart-wrapper>
            <flex-layout :no-bg="true">
                <div class="content-header" slot="header">
                    <div class="table-layout">
                        <div class="table-row">
                            <div class="table-cell text-right w80">电池状态:</div>
                            <div class="table-cell">
                                <el-input v-model="formateBattState" placeholder="" size="small"
                                          :disabled="true"></el-input>
                            </div>
                            <div class="table-cell text-right w80">端电压:</div>
                            <div class="table-cell">
                                <el-input v-model="top.group" placeholder="" size="small" :disabled="true"
                                          style="min-width:12rem"></el-input>
                            </div>
                            <div class="table-cell text-right w80">电池电流:</div>
                            <div class="table-cell">
                                <el-input v-model="top.curr" placeholder="" size="small" :disabled="true"></el-input>
                            </div>
                            <div class="table-cell text-right w80">测试时长:</div>
                            <div class="table-cell">
                                <el-input v-model="top.test_long" placeholder="" size="small"
                                          :disabled="true"></el-input>
                            </div>
                        </div>
                        <div class="table-row">
                            <div class="table-cell text-right w80">测试日期:</div>
                            <div class="table-cell">
                                <el-cascader v-model="test_record.value" :options="test_record.list" size="small"
                                             placeholder="请选择测试日期"
                                             style="width: 100%; min-width:16rem"
                                             @change="testRecordChange">
                                    <template slot-scope="{ node, data }">
                                        <span>{{ data.label }}</span>
                                        <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
                                    </template>
                                </el-cascader>
                            </div>
                            <div class="table-cell text-right w80">测试容量:</div>
                            <div class="table-cell">
                                <el-input v-model="top.test_cap" placeholder="" size="small"
                                          :disabled="true"></el-input>
                            </div>
                            <div class="table-cell text-right w80">剩余容量:</div>
                            <div class="table-cell">
                                <el-input v-model="top.re_cap" placeholder="" size="small" :disabled="true"></el-input>
                            </div>
                            <div class="table-cell text-right w80">续航时长:</div>
                            <div class="table-cell">
                                <el-tooltip class="item" effect="dark" content="机房停电时电池对实际负载供电时长" placement="top">
                                    <el-input v-model="top.xuhang" placeholder="" size="small"
                                              :disabled="true"></el-input>
                                </el-tooltip>
                            </div>
                        </div>
                    </div>
                </div>
                <div class="page-content">
                    <div class="flex-box-list">
                        <div class="flex-box" style="margin-bottom: 8px;">
                            <chart-wrapper title="端电压折线图(V)">
                                <line-chart ref="groupVol" id="groupVol" unit="V"></line-chart>
                            </chart-wrapper>
                        </div>
                        <div class="flex-box" style="margin-bottom: 8px;">
                            <chart-wrapper :title="monBarTitle">
                                <div class="chart-tools-wrapper">
                                    <el-select v-model="chartType" size="mini" @change="changeChartType">
                                        <el-option
                                            v-for="item in chartTypes" :key="item.value"
                                            :label="item.label"
                                            :value="item.value"></el-option>
                                    </el-select>
                                </div>
                                <bar-chart ref="monBar" id="monBar" :show-label="false"></bar-chart>
                            </chart-wrapper>
                        </div>
                    </div>
                    <div class="flex-box-list">
                        <div class="flex-box" style="margin-top: 8px;">
                            <chart-wrapper title="电池电流折线图(A)">
                                <line-chart ref="groupCurr" id="groupCurr" unit="A" start-zero></line-chart>
                            </chart-wrapper>
                        </div>
                        <div class="flex-box" style="margin-top: 8px;">
                            <chart-wrapper :title="monInfo.title">
                                <line-chart ref="monInfo" id="monInfo" :unit="monInfo.unit"></line-chart>
                            </chart-wrapper>
                        </div>
                    </div>
                </div>
                <div class="content-footer" slot="footer">
                    <div class="slider-container">
                        <el-slider v-model="slider" size="small" :format-tooltip="formatTooltip"
                                   @input="sliderInput"></el-slider>
                    </div>
                </div>
            </flex-layout>
        </content-box>
        <el-dialog title="历史数据对比" width="1200px" :visible.sync="showComparison" v-if="showComparison"
                   :close-on-click-modal="false" top="0" class="dialog-center"
                   :modal-append-to-body="false">
            <comparison :test_record="test_record"></comparison>
        </el-dialog>
        <div id="allGraph">
            <div class="chart-contain">
                <div class="chart" ref="allGraph"></div>
            </div>
          </div>
        </div>
        <div class="content-footer" slot="footer">
          <div class="slider-container">
            <el-slider v-model="slider" size="small" :format-tooltip="formatTooltip" @input="sliderInput"></el-slider>
          </div>
        </div>
      </flex-layout>
    </content-box>
    <el-dialog title="历史数据对比" width="1200px" :visible.sync="showComparison" v-if="showComparison"
               :close-on-click-modal="false" top="0" class="dialog-center"
               :modal-append-to-body="false">
      <comparison :test_record="test_record"></comparison>
    </el-dialog>
    <div id="allGraph">
      <div class="chart-contain">
        <div class="chart" ref="allGraph"></div>
      </div>
    </div>
    <form
        :action="exportInfo.action"
        method="post"
        ref="all_picture"
        enctype="multipart/form-data">
      <input type="hidden" id="exPageName" name="pageName" value="exportTbal"/>
      <input type="hidden" name="ltop_echart" ref="ltop_echart" value=""/>
      <input type="hidden" name="rtop_echart" ref="rtop_echart" value=""/>
      <input type="hidden" name="lbottom_echart" ref="lbottom_echart" value=""/>
      <input type="hidden" name="rbottom_echart" ref="rbottom_echart" value=""/>
      <input type="hidden" name="actucap_echart" ref="actucap_echart" value=""/>
      <input type="hidden" name="restcap_echart" ref="restcap_echart" value=""/>
      <input type="hidden" name="capperc_echart" ref="capperc_echart" value=""/>
      <input type="hidden" name="tmp_echart" ref="tmp_echart" value=""> <!-- 单体温度折线图 -->
      <input type="hidden" name="mon_res" ref="mon_res" value="">  <!-- 单体内阻 -->
      <input type="hidden" name="JH_curr" ref="JH_curr" value="">  <!-- 单体均衡电流 -->
      <input type="hidden" name="last_vol" ref="last_vol" value=""> <!-- 终止电压柱状图 -->
      <input type="hidden" name="last_tmp" ref="last_tmp" value=""> <!-- 终止温度柱状图 -->
      <input type="hidden" name="obj-bmd" ref="obj_bmd" value=""/>
      <input type="hidden" name="obj-title" ref="obj_title" value=""/>      <!-- 落后单体阀值信息 -->
      <input type="hidden" name="arr-data" ref="arr_data" value=""/>      <!--存放单体的起始信息二维数组-->
      <input type="hidden" name="mon-vol-list" ref="mon_vol_list" value=""/>  <!-- 所有单体电压测试信息 -->
      <input type="hidden" name="mon-tmp-list" ref="mon_tmp_list" value=""/>  <!-- 所有单体温度测试信息 -->
      <input type="hidden" name="mon-group-list" ref="mon_group_list" value=""/>  <!-- 在线电压 -->
    </form>
  </flex-layout>
        <form
            :action="exportInfo.action"
            method="post"
            ref="all_picture"
            enctype="multipart/form-data">
            <input type="hidden" id="exPageName" name="pageName" value="exportTbal"/>
            <input type="hidden" name="ltop_echart" ref="ltop_echart" value=""/>
            <input type="hidden" name="rtop_echart" ref="rtop_echart" value=""/>
            <input type="hidden" name="lbottom_echart" ref="lbottom_echart" value=""/>
            <input type="hidden" name="rbottom_echart" ref="rbottom_echart" value=""/>
            <input type="hidden" name="actucap_echart" ref="actucap_echart" value=""/>
            <input type="hidden" name="restcap_echart" ref="restcap_echart" value=""/>
            <input type="hidden" name="capperc_echart" ref="capperc_echart" value=""/>
            <input type="hidden" name="tmp_echart" ref="tmp_echart" value=""> <!-- 单体温度折线图 -->
            <input type="hidden" name="mon_res" ref="mon_res" value="">  <!-- 单体内阻 -->
            <input type="hidden" name="JH_curr" ref="JH_curr" value="">  <!-- 单体均衡电流 -->
            <input type="hidden" name="last_vol" ref="last_vol" value=""> <!-- 终止电压柱状图 -->
            <input type="hidden" name="last_tmp" ref="last_tmp" value=""> <!-- 终止温度柱状图 -->
            <input type="hidden" name="restcap_line_echart" ref="restcap_line_echart" value=""> <!-- 剩余容量 -->
            <input type="hidden" name="obj-bmd" ref="obj_bmd" value=""/>
            <input type="hidden" name="obj-title" ref="obj_title" value=""/>      <!-- 落后单体阀值信息 -->
            <input type="hidden" name="arr-data" ref="arr_data" value=""/>      <!--存放单体的起始信息二维数组-->
            <input type="hidden" name="mon-vol-list" ref="mon_vol_list" value=""/>  <!-- 所有单体电压测试信息 -->
            <input type="hidden" name="mon-tmp-list" ref="mon_tmp_list" value=""/>  <!-- 所有单体温度测试信息 -->
            <input type="hidden" name="mon-group-list" ref="mon_group_list" value=""/>  <!-- 在线电压 -->
        </form>
    </flex-layout>
</template>
<script>
@@ -164,20 +173,20 @@
import chartImage from '@/assets/images/eleOn.gif'
import comparison from '../../components/comparisonData/comparison.vue'
import {
  searchAll_lowAction,
  searchBattresdata,
  searchBattTestData,
  searchBattTestDataStop,
  searchHistory
    searchAll_lowAction,
    searchBattresdata,
    searchBattTestData,
    searchBattTestDataStop,
    searchHistory
} from "../../assets/js/history";
import {
  formatSeconds,
  GetMonomerCap,
  GetHourRate,
  getBarNum,
  Title,
  getLow, sethoubeiTime,
    formatSeconds,
    GetMonomerCap,
    GetHourRate,
    getBarNum,
    Title,
    getLow, sethoubeiTime,
} from "../../assets/js/tools";
let Titleobj = new Title();
@@ -201,1455 +210,1496 @@
import "@/components/chart/theme/transparent"
// 端信息
let allData = {
  groupVol: [],
  onlineVol: [],
  testCurr: [],
  testTimeLong: [],
  monNumList: [],
  recordTime: [],
  testCap: [],
  dataList: [],
  endData: {}
    groupVol: [],
    onlineVol: [],
    testCurr: [],
    testTimeLong: [],
    monNumList: [],
    recordTime: [],
    testCap: [],
    dataList: [],
    endData: {}
};
// 单体折线信息
let monLineData = {
  vol: [],        // 单体电压
  temp: [],       // 单体温度
  realCap: [],    // 单体实际容量
  resCap: [],     // 单体剩余容量
  preCap: []      // 单体容量百分比
    vol: [],        // 单体电压
    temp: [],       // 单体温度
    realCap: [],    // 单体实际容量
    resCap: [],     // 单体剩余容量
    preCap: []      // 单体容量百分比
};
// 单体柱状信息
let monBarData = {
  vol: [],        // 单体电压
  temp: [],       // 单体温度
  realCap: [],    // 单体实际容量
  resCap: [],     // 单体剩余容量
  preCap: [],     // 单体容量百分比
  jh_curr: [],    // 单体均衡电流
  res: [],        // 单体内阻
    vol: [],        // 单体电压
    temp: [],       // 单体温度
    realCap: [],    // 单体实际容量
    resCap: [],     // 单体剩余容量
    preCap: [],     // 单体容量百分比
    jh_curr: [],    // 单体均衡电流
    res: [],        // 单体内阻
};
// 4个图表
let groupVolLineChart, currLineChart, monLineChart, monBarChart;
let allGraph;
export default {
  components: {
    ContentBox,
    HomeList,
    BarChart,
    LineChart,
    ChartWrapper,
    comparison
  },
  data() {
    let baseURL = this.$axios.defaults.baseURL;
    baseURL = baseURL ? baseURL : "";
    return {
      showComparison: false,
      data: [],
      batt: {},
      top: {
        state: "", // 电池状态
        group: "", // 端电压
        curr: "", // 电池电流
        test_long: "", // 测试时长
        test_cap: "", // 测试容量
        re_cap: "", // 剩余容量
        xuhang: "" // 续航时长
      },
      test_record: {
        value: [],
        list: [{
          value: "herongDischarge",
          label: "核容放电",
          children: []
        },
          {
            value: "jianceDischarge",
            label: "监测放电",
            children: []
          },
          {
            value: "herongCharge",
            label: "核容充电",
            children: []
          },
          {
            value: "jianceCharge",
            label: "监测充电",
            children: []
          }
        ]
      },
      slider: 100,
      testTimeLong: [],
      battState: {
        test_type: -100,
        stop_reason: ''
      },
      monBarTitle: "最大值=0V;最小值=0V;平均值=0V",
      chartType: 'vol',
      chartTypes: [
        {
          label: '单体电压',
          value: 'vol',
          unit: 'V',
          fixed: 3,
        },
        {
          label: '单体温度',
          value: 'temp',
          unit: '℃',
          fixed: 1,
        },
        {
          label: '单体实际容量',
          value: 'realCap',
          unit: 'AH',
          fixed: 0,
        },
        {
          label: '单体剩余容量',
          value: 'resCap',
          unit: 'AH',
          fixed: 0,
        },
        {
          label: '单体容量百分比',
          value: 'preCap',
          unit: '%',
          fixed: 0
        }
      ],
      exportInfo: {
        action: baseURL + "EchartPictureDowload.servlet",
        ltop_echart: "",        // 组端电压折线图
        rtop_echart: "",        // 单体电压柱状图
        lbottom_echart: "",     // 测试电流
        rbottom_echart: "",     // 单体电压折线图
        actucap_echart: "",     // 实际容量
        restcap_echart: "",     // 剩余容量
        capperc_echart: "",     // 容量百分比
        tmp_echart: "",         // 单体温度折线图
        mon_res: "",            // 单体内阻
        JH_curr: "",            // 单体均衡电流
        last_vol: "",           // 终止电压柱状图
        last_tmp: "",           // 终止温度柱状图
        obj_bmd: "",            //
        obj_title: "",          // 落后单体阀值信息
        arr_data: [],           // 存放单体的起始信息二维数组
        mon_vol_list: [],       // 所有单体电压测试信息
        mon_tmp_list: [],       // 所有单体温度测试信息
        mon_group_list: []      // 所有单体温度测试信息
      },
      low_list: [],
      monInfo: {
        title: "单体电压(V)",
        unit: "V",
      }
    }
  },
  methods: {
    toggleChange() {
      this.resize();
    components: {
        ContentBox,
        HomeList,
        BarChart,
        LineChart,
        ChartWrapper,
        comparison
    },
    resize() {
      this.$G.chartManage.resize("groupVol");
      this.$G.chartManage.resize("monBar");
      this.$G.chartManage.resize("groupCurr");
      this.$G.chartManage.resize("monInfo");
    },
    leafClick(data) {
      this.batt = data;
      // 重置页面内容
      this.init();
      // 获取充放电记录
      this.searchBattTestData();
    },
    // 初始化页面数据
    init() {
      // 初始化充放电记录
      this.test_record.value = [];
      this.test_record.list[0].children = [];
      this.test_record.list[1].children = [];
      this.test_record.list[2].children = [];
      this.test_record.list[3].children = [];
      // 初始化顶部文本框内容
      this.top = {
        state: "", // 电池状态
        group: "", // 端电压
        curr: "", // 电池电流
        test_long: "", // 测试时长
        test_cap: "", // 测试容量
        re_cap: "", // 剩余容量
        xuhang: "---" // 续航时长
      };
      // 初始化电池状态
      this.battState.test_type = -100;
      // 初始化图表
      this.initChart();
    },
    // 初始化图表和图表数据
    initChart() {
      let batt = this.batt;
      // 拖动条默认值100
      this.slider = 100;
      this.testTimeLong = [];
      // 端信息
      allData = {
        groupVol: [],
        onlineVol: [],
        testCurr: [],
        testTimeLong: [],
        recordTime: [],
        testCap: [],
        monNumList: [],
        dataList: [],
      };
      for (let i = 1; i <= batt.MonCount; i++) {
        allData.monNumList[i - 1] = ("#" + i);
      }
      // 单体折线信息
      monLineData = {
        vol: [],        // 单体电压
        temp: [],       // 单体温度
        realCap: [],    // 单体实际容量
        resCap: [],     // 单体剩余容量
        preCap: []      // 单体容量百分比
      };
      // 单体柱状信息
      monBarData = {
        vol: [],        // 单体电压
        temp: [],       // 单体温度
        realCap: [],    // 单体实际容量
        resCap: [],     // 单体剩余容量
        preCap: [],      // 单体容量百分比
        jh_curr: [],    // 单体均衡电流
        res: [],        // 单体内阻
      };
      // 图表类型
      let chartInfo = this.getChartInfo();
      let unit = chartInfo.unit;
      let label = chartInfo.label;
      // 端电压折线图
      groupVolLineChart = {
        color: ["#0081ff", "#df9d02"],
        title: {
          show: false,
          text: "端电压折线图(V)",
          x: "left",
          textStyle: {
            fontSize: "14"
          }
        },
        legend: {
          show: false,
          data: ["在线电压", "组端电压"],
          right: 0,
          orient: "vertical"
        },
        series: [{
          name: "在线电压",
          data: []
        },
          {
            name: "组端电压",
            data: []
          }
        ]
      };
      // 电池电流折线图
      currLineChart = {
        title: {
          show: false,
          text: "电池电流折线图(A)",
          x: "center",
          textStyle: {
            fontSize: "14"
          }
        },
        series: [{
          name: "电池电流",
          areaStyle: {
            color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
              offset: 0,
              color: '#00feff'
            }, {
              offset: 1,
              color: 'transparent'
            }])
          },
          data: []
        }]
      };
      // 单体信息折线图
      monLineChart = {
        title: {
          show: false,
          text: "单体电压(V)",
          x: "center",
          textStyle: {
            fontSize: "14"
          }
        },
        series: []
      };
      // 设置折线图
      this.setLineChart();
      // 单体信息柱状图
      this.monBarTitle = "最大值=0" + unit + ";最小值=0" + unit + ";平均值=0" + unit;
      monBarChart = {
        title: {
          show: false,
          text: "最大值=0" + unit + ";最小值=0" + unit + ";平均值=0" + unit,
          x: "center",
          textStyle: {
            fontSize: "14"
          }
        },
        series: [
          {
            name: "初始值",
            hColor: '#0B388B',
            data: []
          },
          {
            name: label,
            barGap: "-100%",
            data: []
          },
        ]
      };
      // 设置柱状图
      this.setBarChart();
    },
    // 设置折线图
    setLineChart() {
      // 设置端电压折线图
      this.setGroupVolLineChart();
      // 设置电池电流折线图
      this.setCurrLineChart();
      // 设置单体折线图
      this.setMonLineChart();
      // 建立联动
      this.$G.chartManage.connect(["groupVol", "groupCurr", "monInfo"]);
    },
    // 设置端电压折线图
    setGroupVolLineChart() {
      // 根据allData.groupVol数据设置groupVolLineChart的值
      groupVolLineChart.series[0].data = allData.onlineVol;
      groupVolLineChart.series[1].data = allData.groupVol;
      // 更新图表
      this.$refs.groupVol.setOption(groupVolLineChart);
    },
    // 设置电池电流折线图
    setCurrLineChart() {
      // 根据allData.testCurr数据设置currLineChart的值
      currLineChart.series[0].data = allData.testCurr;
      // 更新图表
      this.$refs.groupCurr.setOption(currLineChart);
    },
    // 设置单体折线图
    setMonLineChart() {
      let chartInfo = this.getChartInfo();
      // 根据monLineData的值设置monLineChart
      let dataList = monLineData.vol;
      let title = chartInfo.label + "(" + chartInfo.unit + ")";
      let unit = chartInfo.unit;
      let isUpdate = true;
      switch (chartInfo.value) {
        case "vol":
          dataList = monLineData.vol;
          break;
        case "temp":
          dataList = monLineData.temp;
          break;
        default:
          isUpdate = false;
          break;
      }
      // 检测是否更新
      if (!isUpdate) {
        return;
      }
      this.monInfo.title = title;
      this.monInfo.unit = unit;
      monLineChart.series = dataList.map((item, index) => {
        let monNum = "#" + (index + 1);
    data() {
        let baseURL = this.$axios.defaults.baseURL;
        baseURL = baseURL ? baseURL : "";
        return {
          name: monNum,
          data: item
        };
      });
      this.$nextTick(()=>{
          // 更新图表
          this.$refs.monInfo.setOption(monLineChart);
      });
    },
    // 设置柱状图
    setBarChart() {
      let chartInfo = this.getChartInfo();
      let unit = chartInfo.unit;
      let fixed = chartInfo.fixed;
      // 根据monBarData的值设置monBarChart
      let dataList = this.getBarDataList();
      let index = this.getDataIndex(dataList.length, this.slider);
      if (index != -1) {
        let data = dataList[index];
        let batNum = getBarNum(data);
        monBarChart.title.show = false;
        monBarChart.title.text = "最大值=" + batNum.max + unit + ";最小值=" + batNum.min + unit + ";平均值=" + batNum.avg.toFixed(fixed) + unit
        this.monBarTitle = monBarChart.title.text;
        monBarChart.series[1].name = chartInfo.label;
        monBarChart.series[1].data = data;
        monBarChart.series[0].data = dataList[0];
      } else {
        console.log("未获取到值")
      }
      // 设置柱状图
      this.$refs.monBar.setOption(monBarChart);
    },
    getBarDataList() {
      let chartInfo = this.getChartInfo();
      // 根据monBarData的值设置monBarChart
      let dataList = monBarData.vol;
      switch (chartInfo.value) {
        case 'vol':
          dataList = monBarData.vol;
          break;
        case 'temp':
          dataList = monBarData.temp;
          break;
        case 'realCap':
          dataList = monBarData.realCap;
          break;
        case 'resCap':
          dataList = monBarData.resCap;
          break;
        case 'preCap':
          dataList = monBarData.preCap;
          break;
        default:
          dataList = monBarData.vol
          break;
      }
      return dataList;
    },
    // 查询测试信息
    searchBattTestData() {
      let batt = this.batt;
      // 开启等待框
      let loading = this.$layer.loading(1);
      searchBattTestData({
        num: batt.FBSDeviceId,
        BattGroupId: batt.BattGroupId
      })
          .then(res => {
            // 关闭等待框
            this.$layer.close(loading);
            // 解析数据
            let rs = JSON.parse(res.data.result);
            let herongDischarge = []; // 核容放电
            let herongCharge = []; // 核容充电
            let jianceDischarge = []; // 监测放电
            let jianceCharge = []; // 监测充电
            if (rs.code == 1) {
              rs.data.forEach(item => {
                item.value = item.test_starttime;
                item.label = item.test_starttime;
                if (item.test_type == 3) {
                  // 测试类型为放电
                  if (item.test_starttype == 3) {
                    //  核容放电
                    herongDischarge.push(item);
                  } else {
                    // 监测放电
                    jianceDischarge.push(item);
                  }
                } else if (item.test_type == 2) {
                  // 测试类型为充电
                  if (item.test_starttype == 3) {
                    //  核容充电
                    herongCharge.push(item);
                  } else {
                    // 监测充电
                    jianceCharge.push(item);
                  }
            showComparison: false,
            data: [],
            batt: {},
            top: {
                state: "", // 电池状态
                group: "", // 端电压
                curr: "", // 电池电流
                test_long: "", // 测试时长
                test_cap: "", // 测试容量
                re_cap: "", // 剩余容量
                xuhang: "" // 续航时长
            },
            test_record: {
                value: [],
                list: [{
                    value: "herongDischarge",
                    label: "核容放电",
                    children: []
                },
                    {
                        value: "jianceDischarge",
                        label: "监测放电",
                        children: []
                    },
                    {
                        value: "herongCharge",
                        label: "核容充电",
                        children: []
                    },
                    {
                        value: "jianceCharge",
                        label: "监测充电",
                        children: []
                    }
                ]
            },
            slider: 100,
            testTimeLong: [],
            battState: {
                test_type: -100,
                stop_reason: ''
            },
            monBarTitle: "最大值=0V;最小值=0V;平均值=0V",
            chartType: 'vol',
            chartTypes: [
                {
                    label: '单体电压',
                    value: 'vol',
                    unit: 'V',
                    fixed: 3,
                },
                {
                    label: '单体温度',
                    value: 'temp',
                    unit: '℃',
                    fixed: 1,
                },
                {
                    label: '单体实际容量',
                    value: 'realCap',
                    unit: 'AH',
                    fixed: 0,
                },
                {
                    label: '单体剩余容量',
                    value: 'resCap',
                    unit: 'AH',
                    fixed: 0,
                },
                {
                    label: '单体容量百分比',
                    value: 'preCap',
                    unit: '%',
                    fixed: 0
                }
              });
            } else {
              this.$layer.msg("未获取到充放电记录");
            ],
            exportInfo: {
                action: baseURL + "EchartPictureDowload.servlet",
                ltop_echart: "",        // 组端电压折线图
                rtop_echart: "",        // 单体电压柱状图
                lbottom_echart: "",     // 测试电流
                rbottom_echart: "",     // 单体电压折线图
                actucap_echart: "",     // 实际容量
                restcap_echart: "",     // 剩余容量
                capperc_echart: "",     // 容量百分比
                tmp_echart: "",         // 单体温度折线图
                mon_res: "",            // 单体内阻
                JH_curr: "",            // 单体均衡电流
                last_vol: "",           // 终止电压柱状图
                last_tmp: "",           // 终止温度柱状图
                restcap_line_echart: "",    // 剩余容量
                obj_bmd: "",            //
                obj_title: "",          // 落后单体阀值信息
                arr_data: [],           // 存放单体的起始信息二维数组
                mon_vol_list: [],       // 所有单体电压测试信息
                mon_tmp_list: [],       // 所有单体温度测试信息
                mon_group_list: []      // 所有单体温度测试信息
            },
            low_list: [],
            monInfo: {
                title: "单体电压(V)",
                unit: "V",
            }
            // 充放电记录
            this.test_record.list[0].children = herongDischarge;
            this.test_record.list[1].children = jianceDischarge;
            this.test_record.list[2].children = herongCharge;
            this.test_record.list[3].children = jianceCharge;
          })
          .catch(error => {
            this.$layer.close(loading);
            console.log(error);
          });
    },
    // 切换测试信息
    testRecordChange() {
      let testRecord = this.getTestRecord();
      // 初始化图表
      this.initChart();
      // 获取顶部电池组信息
      // this.searchBattTestDataStop(
      //     testRecord.BattGroupId,
      //     testRecord.test_record_count
      // );
      // 查询历史数据
      this.searchHistory(testRecord.BattGroupId, testRecord.test_record_count);
    },
    // 查询顶部信息
    searchBattTestDataStop(BattGroupId, count) {
      searchBattTestDataStop(BattGroupId, count).then(res => {
        let rs = JSON.parse(res.data.result);
        if (rs.code == 1) {
          let data = rs.data[0];
          console.log(data);
          this.top.test_cap = data.test_cap.toFixed(1) + "AH";
          this.top.test_long = formatSeconds(data.test_timelong);
        }
      });
    },
    // 查询历史信息
    searchHistory(BattGroupId, count) {
      // 开启等待框
      let loading = this.$layer.loading(1);
      searchHistory({
        BattGroupId: BattGroupId,
        test_record_count: count
      }).then(res => {
        // 关闭等待框
        this.$layer.close(loading);
        let rs = JSON.parse(res.data.result);
        let data = [];
        // 数据
        if (rs.code == 1) {
          data = rs.data;
        }
        // 格式化数据
        this.formateHisData(data);
        this.searchBattresdata();
      })
          .catch(error => {
            // 关闭等待框
            this.$layer.close(loading);
            console.log(error);
          });
    },
    // 格式化历史信息数据
    formateHisData(data) {
      let record_time = -1; // 记录时间
      let record_num = -100;  // 记录笔数
      allData.endData = data[data.length - 1];
      data.forEach(item => {
        let mon_num = item.mon_num;
        let testTimeLong = formatSeconds(item.test_timelong);
        // 获取组端电压,在线电压,组端电流的信息和开辟一个单体柱状图
        if (record_num != item.record_num) {
          record_time = item.record_time;
          record_num = item.record_num;
          allData.groupVol.push([testTimeLong, item.group_vol]);
          allData.onlineVol.push([testTimeLong, item.online_vol]);
          allData.testCurr.push([testTimeLong, item.test_curr]);
          allData.recordTime.push(testTimeLong);
          allData.testTimeLong.push(item.test_timelong);
          allData.testCap.push(item.test_cap);
          allData.dataList.push(item);
          this.testTimeLong.push(item.test_timelong);
          // 开辟空间
          monBarData.vol.push([]);
          monBarData.temp.push([]);
          monBarData.realCap.push([]);
          monBarData.resCap.push([]);
          monBarData.preCap.push([]);
        }
        // 单体电压柱状图设置
        let mon_num_text = "#" + mon_num;
        let monBarVol = monBarData.vol[monBarData.vol.length - 1];
        monBarVol.push([mon_num_text, item.mon_vol]);
        // 单体温度柱状图
        let monBarTemp = monBarData.temp[monBarData.temp.length - 1];
        monBarTemp.push([mon_num_text, item.mon_tmp]);
        // 设置单体折线图信息
        if (typeof monLineData.vol[mon_num - 1] != "object") {
          let index = mon_num - 1;
          // 开辟空间
          monLineData.vol[index] = [];
          monLineData.temp[index] = [];
        }
        // 获取到需要使用的空间
        let monLineVol = monLineData.vol[mon_num - 1];
        monLineVol.push([testTimeLong, item.mon_vol]);
        let monLineTemp = monLineData.temp[mon_num - 1];
        monLineTemp.push([testTimeLong, item.mon_tmp]);
      });
      // 设置容量
      this.setCapList();
      // 设置折线图表
      this.setLineChart();
      // 执行滑动事件
      this.sliderInput();
    },
    setCapList() {
      let batt = this.batt;
      let batt_test_data = monBarData.vol;
      let batt_test_evary_record = allData.dataList;
      for (let i = 0; i < batt_test_data.length; i++) {
        let vol_list = batt_test_data[i].map(item => {
          return item[1];
        });
        let max_vol = Math.max.apply(null, vol_list);
        for (let j = 0; j < vol_list.length; j++) {
          let avg_curr = batt_test_evary_record[i].test_timelong > 0 ? batt_test_evary_record[i].test_cap * 3600 / batt_test_evary_record[i].test_timelong : batt_test_evary_record[i].test_curr;
          let actionvalue = GetMonomerCap(batt.MonCapStd, GetHourRate(batt.MonCapStd, avg_curr), batt_test_evary_record[i].test_cap, max_vol, vol_list[j], batt.MonVolStd, 1);
          let restvalue = GetMonomerCap(batt.MonCapStd, GetHourRate(batt.MonCapStd, avg_curr), batt_test_evary_record[i].test_cap, max_vol, vol_list[j], batt.MonVolStd, 0);
          let batt_num_text = "#" + (j + 1);
          monBarData.realCap[i].push([batt_num_text, actionvalue.toFixed(0)]);
          monBarData.resCap[i].push([batt_num_text, restvalue.toFixed(0)]);
          monBarData.preCap[i].push([batt_num_text, (actionvalue * 100 / batt.MonCapStd).toFixed(0)]);
        }
      }
    },
    // 获取测试的信息
    getTestRecord() {
      let value = this.test_record.value;
      // 没有选择充放电记录,返回-1
      if (value.length == 0) {
        return -1;
      }
      let type = value[0];
      let time = value[1];
      let list = this.test_record.list;
      let result = 0;
      // 遍历list
      for (let i in list) {
        let item = list[i];
        if (item.value == type) {
          for (let j in item.children) {
            let child = item.children[j];
            if (child.value == time) {
              result = child;
              break;
            }
          }
          break;
        }
      }
      // 设置电池状态
      this.battState.test_type = result.test_type;
      this.battState.stop_reason = result.test_stoptype_reason;
      // 返回结果集
      return result;
    },
    // 格式化滑块显示的内容
    formatTooltip(value) {
      let testTimeLong = this.testTimeLong;
      let index = this.getDataIndex(testTimeLong.length, value);
      let test_long = formatSeconds(0);
      if (index != -1) {
        test_long = formatSeconds(testTimeLong[index]);
      }
      this.top.test_long = test_long;
      return test_long;
    },
    // 拖动滑块时触发
    sliderInput() {
      // 设置头部信息
      this.setTopData();
      // 设置柱状图
      this.setBarChart();
    },
    // 设置顶部文本框的数据
    setTopData() {
      let batt = this.batt;
      // 组端电压和在线电压
      let groupVol = allData.groupVol;
      let onlineVol = allData.onlineVol;
      let testCurr = allData.testCurr;
      let testCap = allData.testCap;
      let monVols = monBarData.vol;
      let dataList = allData.dataList;
      let index = this.getDataIndex(groupVol.length, this.slider);
      if (index != -1) {
        this.top.group =
            "在线:" +
            onlineVol[index][1].toFixed(2) +
            "V;组端:" +
            groupVol[index][1].toFixed(2) +
            "V";
        this.top.curr = testCurr[index][1].toFixed(1) + "A";
        this.top.test_cap = testCap[index].toFixed(1) + "AH";
        // 剩余容量
        let monVol = monVols[index];
        let list = dataList[index];
        let avg_curr = list.test_timelong > 0 ? list.test_cap * 3600 / list.test_timelong : list.test_curr;
        let batNum = getBarNum(monVol);
        let over_cap = GetMonomerCap(batt.MonCapStd, GetHourRate(batt.MonCapStd, avg_curr),
            list.test_cap, batNum.max, batNum.min, batt.MonVolStd, 0);
        this.top.re_cap = over_cap.toFixed(1) + 'AH';
      }
      // 设置续航时长
      let lastIndex = this.getDataIndex(groupVol.length, 100);
      if (lastIndex != -1) {
        // 实际容量
        let monVol = monVols[lastIndex];
        let list = dataList[lastIndex];
        let avg_curr = list.test_timelong > 0 ? list.test_cap * 3600 / list.test_timelong : list.test_curr;
        let batNum = getBarNum(monVol);
        let real_cap = GetMonomerCap(batt.MonCapStd, GetHourRate(batt.MonCapStd, avg_curr),
            list.test_cap, batNum.max, batNum.min, batt.MonVolStd, 1);
        let xuhang = batt.Load_curr ? real_cap / batt.Load_curr : 0;
        this.top.xuhang = xuhang ? sethoubeiTime(xuhang) : '---';
      }
    },
    // 根据百分比获取显示的数据的笔数
    getDataIndex(num, percent) {
      if (percent <= 0) {
        return 0;
      }
      return Math.floor(num * percent / 100) - 1;
    },
    // 向父级发送同步页面的指令
    syncPage() {
      let batt = this.batt;
      let search = "?province=" + batt.StationName1 +
          "&city=" + batt.StationName2 + "&county=" + batt.StationName5 +
          "&home=" + batt.StationName3 + "&batt=" + batt.BattGroupId;
      window.parent.postMessage({
        cmd: "syncPage",
        params: {
          pageInfo: {
            label: '实时监控',
            name: 'movingRingSysteRrealTime',
            src: '#/moving-ring-system' + search,
            closable: true,
          }
    methods: {
        toggleChange() {
            this.resize();
        },
      }, "*");
    },
    toShowComparison() {
      this.showComparison = true;
    },
    getChartInfo() {
      let chartType = this.chartType;
      let chartTypes = this.chartTypes;
      let chartTypeInfo = chartTypes[0];
      for (let i = 0; i < chartTypes.length; i++) {
        if (chartType == chartTypes[i].value) {
          chartTypeInfo = chartTypes[i];
          break;
        resize() {
            this.$G.chartManage.resize("groupVol");
            this.$G.chartManage.resize("monBar");
            this.$G.chartManage.resize("groupCurr");
            this.$G.chartManage.resize("monInfo");
        },
        leafClick(data) {
            this.batt = data;
            // 重置页面内容
            this.init();
            // 获取充放电记录
            this.searchBattTestData();
        },
        // 初始化页面数据
        init() {
            // 初始化充放电记录
            this.test_record.value = [];
            this.test_record.list[0].children = [];
            this.test_record.list[1].children = [];
            this.test_record.list[2].children = [];
            this.test_record.list[3].children = [];
            // 初始化顶部文本框内容
            this.top = {
                state: "", // 电池状态
                group: "", // 端电压
                curr: "", // 电池电流
                test_long: "", // 测试时长
                test_cap: "", // 测试容量
                re_cap: "", // 剩余容量
                xuhang: "---" // 续航时长
            };
            // 初始化电池状态
            this.battState.test_type = -100;
            // 初始化图表
            this.initChart();
        },
        // 初始化图表和图表数据
        initChart() {
            let batt = this.batt;
            // 拖动条默认值100
            this.slider = 100;
            this.testTimeLong = [];
            // 端信息
            allData = {
                groupVol: [],
                onlineVol: [],
                testCurr: [],
                testTimeLong: [],
                recordTime: [],
                testCap: [],
                monNumList: [],
                dataList: [],
            };
            for (let i = 1; i <= batt.MonCount; i++) {
                allData.monNumList[i - 1] = ("#" + i);
            }
            // 单体折线信息
            monLineData = {
                vol: [],        // 单体电压
                temp: [],       // 单体温度
                realCap: [],    // 单体实际容量
                resCap: [],     // 单体剩余容量
                preCap: []      // 单体容量百分比
            };
            // 单体柱状信息
            monBarData = {
                vol: [],        // 单体电压
                temp: [],       // 单体温度
                realCap: [],    // 单体实际容量
                resCap: [],     // 单体剩余容量
                preCap: [],      // 单体容量百分比
                jh_curr: [],    // 单体均衡电流
                res: [],        // 单体内阻
            };
            // 图表类型
            let chartInfo = this.getChartInfo();
            let unit = chartInfo.unit;
            let label = chartInfo.label;
            // 端电压折线图
            groupVolLineChart = {
                color: ["#0081ff", "#df9d02"],
                title: {
                    show: false,
                    text: "端电压折线图(V)",
                    x: "left",
                    textStyle: {
                        fontSize: "14"
                    }
                },
                legend: {
                    show: false,
                    data: ["在线电压", "组端电压"],
                    right: 0,
                    orient: "vertical"
                },
                series: [{
                    name: "在线电压",
                    data: []
                },
                    {
                        name: "组端电压",
                        data: []
                    }
                ]
            };
            // 电池电流折线图
            currLineChart = {
                title: {
                    show: false,
                    text: "电池电流折线图(A)",
                    x: "center",
                    textStyle: {
                        fontSize: "14"
                    }
                },
                series: [{
                    name: "电池电流",
                    areaStyle: {
                        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                            offset: 0,
                            color: '#00feff'
                        }, {
                            offset: 1,
                            color: 'transparent'
                        }])
                    },
                    data: []
                }]
            };
            // 单体信息折线图
            monLineChart = {
                title: {
                    show: false,
                    text: "单体电压(V)",
                    x: "center",
                    textStyle: {
                        fontSize: "14"
                    }
                },
                series: []
            };
            // 设置折线图
            this.setLineChart();
            // 单体信息柱状图
            this.monBarTitle = "最大值=0" + unit + ";最小值=0" + unit + ";平均值=0" + unit;
            monBarChart = {
                title: {
                    show: false,
                    text: "最大值=0" + unit + ";最小值=0" + unit + ";平均值=0" + unit,
                    x: "center",
                    textStyle: {
                        fontSize: "14"
                    }
                },
                series: [
                    {
                        name: "初始值",
                        hColor: '#0B388B',
                        data: []
                    },
                    {
                        name: label,
                        barGap: "-100%",
                        data: []
                    },
                ]
            };
            // 设置柱状图
            this.setBarChart();
        },
        // 设置折线图
        setLineChart() {
            // 设置端电压折线图
            this.setGroupVolLineChart();
            // 设置电池电流折线图
            this.setCurrLineChart();
            // 设置单体折线图
            this.setMonLineChart();
            // 建立联动
            this.$G.chartManage.connect(["groupVol", "groupCurr", "monInfo"]);
        },
        // 设置端电压折线图
        setGroupVolLineChart() {
            // 根据allData.groupVol数据设置groupVolLineChart的值
            groupVolLineChart.series[0].data = allData.onlineVol;
            groupVolLineChart.series[1].data = allData.groupVol;
            // 更新图表
            this.$refs.groupVol.setOption(groupVolLineChart);
        },
        // 设置电池电流折线图
        setCurrLineChart() {
            // 根据allData.testCurr数据设置currLineChart的值
            currLineChart.series[0].data = allData.testCurr;
            // 更新图表
            this.$refs.groupCurr.setOption(currLineChart);
        },
        // 设置单体折线图
        setMonLineChart() {
            let chartInfo = this.getChartInfo();
            // 根据monLineData的值设置monLineChart
            let dataList = monLineData.vol;
            let title = chartInfo.label + "(" + chartInfo.unit + ")";
            let unit = chartInfo.unit;
            let isUpdate = true;
            switch (chartInfo.value) {
                case "vol":
                    dataList = monLineData.vol;
                    break;
                case "temp":
                    dataList = monLineData.temp;
                    break;
                case "resCap":
                    dataList = monLineData.resCap;
                    break;
                default:
                    isUpdate = false;
                    break;
            }
            // 检测是否更新
            if (!isUpdate) {
                return;
            }
            this.monInfo.title = title;
            this.monInfo.unit = unit;
            monLineChart.title.show=false;
            monLineChart.series = dataList.map((item, index) => {
                let monNum = "#" + (index + 1);
                return {
                    name: monNum,
                    data: item
                };
            });
            this.$nextTick(() => {
                // 更新图表
                this.$refs.monInfo.setOption(monLineChart);
            });
        },
        // 设置柱状图
        setBarChart() {
            let chartInfo = this.getChartInfo();
            let unit = chartInfo.unit;
            let fixed = chartInfo.fixed;
            // 根据monBarData的值设置monBarChart
            let dataList = this.getBarDataList();
            let index = this.getDataIndex(dataList.length, this.slider);
            if (index != -1) {
                let data = dataList[index];
                let batNum = getBarNum(data);
                monBarChart.title.show = false;
                monBarChart.title.text = "最大值=" + batNum.max + unit + ";最小值=" + batNum.min + unit + ";平均值=" + batNum.avg.toFixed(fixed) + unit
                this.monBarTitle = monBarChart.title.text;
                monBarChart.series[1].name = chartInfo.label;
                monBarChart.series[1].data = data;
                monBarChart.series[0].data = dataList[0];
            } else {
                console.log("未获取到值")
            }
            // 设置柱状图
            this.$refs.monBar.setOption(monBarChart);
        },
        getBarDataList() {
            let chartInfo = this.getChartInfo();
            // 根据monBarData的值设置monBarChart
            let dataList = monBarData.vol;
            switch (chartInfo.value) {
                case 'vol':
                    dataList = monBarData.vol;
                    break;
                case 'temp':
                    dataList = monBarData.temp;
                    break;
                case 'realCap':
                    dataList = monBarData.realCap;
                    break;
                case 'resCap':
                    dataList = monBarData.resCap;
                    break;
                case 'preCap':
                    dataList = monBarData.preCap;
                    break;
                default:
                    dataList = monBarData.vol
                    break;
            }
            return dataList;
        },
        // 查询测试信息
        searchBattTestData() {
            let batt = this.batt;
            // 开启等待框
            let loading = this.$layer.loading(1);
            searchBattTestData({
                num: batt.FBSDeviceId,
                BattGroupId: batt.BattGroupId
            })
                .then(res => {
                    // 关闭等待框
                    this.$layer.close(loading);
                    // 解析数据
                    let rs = JSON.parse(res.data.result);
                    let herongDischarge = []; // 核容放电
                    let herongCharge = []; // 核容充电
                    let jianceDischarge = []; // 监测放电
                    let jianceCharge = []; // 监测充电
                    if (rs.code == 1) {
                        rs.data.forEach(item => {
                            item.value = item.test_starttime;
                            item.label = item.test_starttime;
                            if (item.test_type == 3) {
                                // 测试类型为放电
                                if (item.test_starttype == 3) {
                                    //  核容放电
                                    herongDischarge.push(item);
                                } else {
                                    // 监测放电
                                    jianceDischarge.push(item);
                                }
                            } else if (item.test_type == 2) {
                                // 测试类型为充电
                                if (item.test_starttype == 3) {
                                    //  核容充电
                                    herongCharge.push(item);
                                } else {
                                    // 监测充电
                                    jianceCharge.push(item);
                                }
                            }
                        });
                    } else {
                        this.$layer.msg("未获取到充放电记录");
                    }
                    // 充放电记录
                    this.test_record.list[0].children = herongDischarge;
                    this.test_record.list[1].children = jianceDischarge;
                    this.test_record.list[2].children = herongCharge;
                    this.test_record.list[3].children = jianceCharge;
                })
                .catch(error => {
                    this.$layer.close(loading);
                    console.log(error);
                });
        },
        // 切换测试信息
        testRecordChange() {
            let testRecord = this.getTestRecord();
            // 初始化图表
            this.initChart();
            // 获取顶部电池组信息
            // this.searchBattTestDataStop(
            //     testRecord.BattGroupId,
            //     testRecord.test_record_count
            // );
            // 查询历史数据
            this.searchHistory(testRecord.BattGroupId, testRecord.test_record_count);
        },
        // 查询顶部信息
        searchBattTestDataStop(BattGroupId, count) {
            searchBattTestDataStop(BattGroupId, count).then(res => {
                let rs = JSON.parse(res.data.result);
                if (rs.code == 1) {
                    let data = rs.data[0];
                    console.log(data);
                    this.top.test_cap = data.test_cap.toFixed(1) + "AH";
                    this.top.test_long = formatSeconds(data.test_timelong);
                }
            });
        },
        // 查询历史信息
        searchHistory(BattGroupId, count) {
            // 开启等待框
            let loading = this.$layer.loading(1);
            searchHistory({
                BattGroupId: BattGroupId,
                test_record_count: count
            }).then(res => {
                // 关闭等待框
                this.$layer.close(loading);
                let rs = JSON.parse(res.data.result);
                let data = [];
                // 数据
                if (rs.code == 1) {
                    data = rs.data;
                }
                // 格式化数据
                this.formateHisData(data);
                this.searchBattresdata();
            })
                .catch(error => {
                    // 关闭等待框
                    this.$layer.close(loading);
                    console.log(error);
                });
        },
        // 格式化历史信息数据
        formateHisData(data) {
            let record_time = -1; // 记录时间
            let record_num = -100;  // 记录笔数
            allData.endData = data[data.length - 1];
            data.forEach(item => {
                let mon_num = item.mon_num;
                let testTimeLong = formatSeconds(item.test_timelong);
                // 获取组端电压,在线电压,组端电流的信息和开辟一个单体柱状图
                if (record_num != item.record_num) {
                    record_time = item.record_time;
                    record_num = item.record_num;
                    allData.groupVol.push([testTimeLong, item.group_vol]);
                    allData.onlineVol.push([testTimeLong, item.online_vol]);
                    allData.testCurr.push([testTimeLong, item.test_curr]);
                    allData.recordTime.push(testTimeLong);
                    allData.testTimeLong.push(item.test_timelong);
                    allData.testCap.push(item.test_cap);
                    allData.dataList.push(item);
                    this.testTimeLong.push(item.test_timelong);
                    // 开辟空间
                    monBarData.vol.push([]);
                    monBarData.temp.push([]);
                    monBarData.realCap.push([]);
                    monBarData.resCap.push([]);
                    monBarData.preCap.push([]);
                }
                // 单体电压柱状图设置
                let mon_num_text = "#" + mon_num;
                let monBarVol = monBarData.vol[monBarData.vol.length - 1];
                monBarVol.push([mon_num_text, item.mon_vol]);
                // 单体温度柱状图
                let monBarTemp = monBarData.temp[monBarData.temp.length - 1];
                monBarTemp.push([mon_num_text, item.mon_tmp]);
                // 设置单体折线图信息
                if (typeof monLineData.vol[mon_num - 1] != "object") {
                    let index = mon_num - 1;
                    // 开辟空间
                    monLineData.vol[index] = [];
                    monLineData.temp[index] = [];
                    monLineData.resCap[index] = [];
                }
                // 获取到需要使用的空间
                let monLineVol = monLineData.vol[mon_num - 1];
                monLineVol.push([testTimeLong, item.mon_vol]);
                let monLineTemp = monLineData.temp[mon_num - 1];
                monLineTemp.push([testTimeLong, item.mon_tmp]);
            });
            // 设置容量
            this.setCapList();
            // 设置折线图表
            this.setLineChart();
            // 执行滑动事件
            this.sliderInput();
        },
        setCapList() {
            let batt = this.batt;
            let batt_test_data = monBarData.vol;
            let batt_test_evary_record = allData.dataList;
            for (let i = 0; i < batt_test_data.length; i++) {
                let vol_list = batt_test_data[i].map(item => {
                    return item[1];
                });
                let max_vol = Math.max.apply(null, vol_list);
                for (let j = 0; j < vol_list.length; j++) {
                    let avg_curr = batt_test_evary_record[i].test_timelong > 0 ? batt_test_evary_record[i].test_cap * 3600 / batt_test_evary_record[i].test_timelong : batt_test_evary_record[i].test_curr;
                    let actionvalue = GetMonomerCap(batt.MonCapStd, GetHourRate(batt.MonCapStd, avg_curr), batt_test_evary_record[i].test_cap, max_vol, vol_list[j], batt.MonVolStd, 1);
                    let restvalue = GetMonomerCap(batt.MonCapStd, GetHourRate(batt.MonCapStd, avg_curr), batt_test_evary_record[i].test_cap, max_vol, vol_list[j], batt.MonVolStd, 0);
                    let batt_num_text = "#" + (j + 1);
                    monBarData.realCap[i].push([batt_num_text, actionvalue.toFixed(0)]);
                    monBarData.resCap[i].push([batt_num_text, restvalue.toFixed(0)]);
                    monBarData.preCap[i].push([batt_num_text, (actionvalue * 100 / batt.MonCapStd).toFixed(0)]);
                }
            }
            // 容量
            monLineData.vol.forEach((item, key)=>{
                item.forEach((volItem, volItemKey)=>{
                    let resCapItem = monBarData.resCap[volItemKey];
                    monLineData.resCap[key].push([volItem[0], resCapItem[key][1]]);
                });
            });
        },
        // 获取测试的信息
        getTestRecord() {
            let value = this.test_record.value;
            // 没有选择充放电记录,返回-1
            if (value.length == 0) {
                return -1;
            }
            let type = value[0];
            let time = value[1];
            let list = this.test_record.list;
            let result = 0;
            // 遍历list
            for (let i in list) {
                let item = list[i];
                if (item.value == type) {
                    for (let j in item.children) {
                        let child = item.children[j];
                        if (child.value == time) {
                            result = child;
                            break;
                        }
                    }
                    break;
                }
            }
            // 设置电池状态
            this.battState.test_type = result.test_type;
            this.battState.stop_reason = result.test_stoptype_reason;
            // 返回结果集
            return result;
        },
        // 格式化滑块显示的内容
        formatTooltip(value) {
            let testTimeLong = this.testTimeLong;
            let index = this.getDataIndex(testTimeLong.length, value);
            let test_long = formatSeconds(0);
            if (index != -1) {
                test_long = formatSeconds(testTimeLong[index]);
            }
            this.top.test_long = test_long;
            return test_long;
        },
        // 拖动滑块时触发
        sliderInput() {
            // 设置头部信息
            this.setTopData();
            // 设置柱状图
            this.setBarChart();
        },
        // 设置顶部文本框的数据
        setTopData() {
            let batt = this.batt;
            // 组端电压和在线电压
            let groupVol = allData.groupVol;
            let onlineVol = allData.onlineVol;
            let testCurr = allData.testCurr;
            let testCap = allData.testCap;
            let monVols = monBarData.vol;
            let dataList = allData.dataList;
            let index = this.getDataIndex(groupVol.length, this.slider);
            if (index != -1) {
                this.top.group =
                    "在线:" +
                    onlineVol[index][1].toFixed(2) +
                    "V;组端:" +
                    groupVol[index][1].toFixed(2) +
                    "V";
                this.top.curr = testCurr[index][1].toFixed(1) + "A";
                this.top.test_cap = testCap[index].toFixed(1) + "AH";
                // 剩余容量
                let monVol = monVols[index];
                let list = dataList[index];
                let avg_curr = list.test_timelong > 0 ? list.test_cap * 3600 / list.test_timelong : list.test_curr;
                let batNum = getBarNum(monVol);
                let over_cap = GetMonomerCap(batt.MonCapStd, GetHourRate(batt.MonCapStd, avg_curr),
                    list.test_cap, batNum.max, batNum.min, batt.MonVolStd, 0);
                this.top.re_cap = over_cap.toFixed(1) + 'AH';
            }
            // 设置续航时长
            let lastIndex = this.getDataIndex(groupVol.length, 100);
            if (lastIndex != -1) {
                // 实际容量
                let monVol = monVols[lastIndex];
                let list = dataList[lastIndex];
                let avg_curr = list.test_timelong > 0 ? list.test_cap * 3600 / list.test_timelong : list.test_curr;
                let batNum = getBarNum(monVol);
                let real_cap = GetMonomerCap(batt.MonCapStd, GetHourRate(batt.MonCapStd, avg_curr),
                    list.test_cap, batNum.max, batNum.min, batt.MonVolStd, 1);
                let xuhang = batt.Load_curr ? real_cap / batt.Load_curr : 0;
                this.top.xuhang = xuhang ? sethoubeiTime(xuhang) : '---';
            }
        },
        // 根据百分比获取显示的数据的笔数
        getDataIndex(num, percent) {
            if (percent <= 0) {
                return 0;
            }
            return Math.floor(num * percent / 100) - 1;
        },
        // 向父级发送同步页面的指令
        syncPage() {
            let batt = this.batt;
            let search = "?province=" + batt.StationName1 +
                "&city=" + batt.StationName2 + "&county=" + batt.StationName5 +
                "&home=" + batt.StationName3 + "&batt=" + batt.BattGroupId;
            window.parent.postMessage({
                cmd: "syncPage",
                params: {
                    pageInfo: {
                        label: '实时监控',
                        name: 'movingRingSysteRrealTime',
                        src: '#/moving-ring-system' + search,
                        closable: true,
                    }
                },
            }, "*");
        },
        toShowComparison() {
            this.showComparison = true;
        },
        getChartInfo() {
            let chartType = this.chartType;
            let chartTypes = this.chartTypes;
            let chartTypeInfo = chartTypes[0];
            for (let i = 0; i < chartTypes.length; i++) {
                if (chartType == chartTypes[i].value) {
                    chartTypeInfo = chartTypes[i];
                    break;
                }
            }
            return chartTypeInfo;
        },
        changeChartType() {
            if (allData.groupVol.length == 0) {
                this.initChart();
            } else {
                let loading = this.$layer.loading();
                setTimeout(() => {
                    this.setBarChart();
                    this.setMonLineChart();
                    this.$layer.close(loading);
                }, 100);
            }
        },
        // 导出报表
        exportExcel() {
            if (allData.groupVol.length == 0) {
                this.$layer.msg('暂无数据导出,请先选择充放电数据!');
                return false;
            }
            let lastarray = new Array();
            lastarray.push(allData.monNumList);
            //组端电压折线图
            let groupVolLineChartOption = this.$refs.groupVol.getOption(groupVolLineChart);
            groupVolLineChartOption.title.show = true;
            groupVolLineChartOption.title.x = 'center';
            groupVolLineChartOption.legend.show = false;
            this.createGraphByOpt(groupVolLineChartOption);
            let oltop = allGraph.getDataURL({
                pixelRatio: 1,
                backgroundColor: '#fff'
            });
            // 电池电流折线图
            let currLineChartOption = this.$refs.groupVol.getOption(currLineChart);
            currLineChartOption.title.show = true;
            currLineChartOption.title.x = 'center';
            currLineChartOption.legend.show = false;
            this.createGraphByOpt(currLineChartOption);
            let ortop = allGraph.getDataURL({
                pixelRatio: 1,
                backgroundColor: '#fff'
            });
            //获取起始单体电压
            lastarray.push(monBarData.vol[0].map(item => {
                return item[1];
            }));
            //单体电压柱状图
            let monBarVol = monBarData.vol;
            let monBarEndVol = monBarVol[this.getDataIndex(monBarVol.length, this.slider)];
            //获取单体截止电压
            let monBarVolArr = monBarEndVol.map(item => {
                return item[1];
            });
            lastarray.push(monBarVolArr);
            monBarChart.title.show = true;
            monBarChart.title.text = this.getTitle(monBarVolArr, 'Voltage');
            let lowObj = Titleobj;                                //落后单体电压信息
            monBarChart.title.x = 'center';
            monBarChart.series[0].name = "单体电压";
            monBarChart.series[0].data = monBarEndVol;
            let monBarChartVolOption = this.$refs.monBar.getOption(monBarChart);
            this.createGraphByOpt(monBarChartVolOption);
            let orbottom1 = allGraph.getDataURL({
                pixelRatio: 1,
                backgroundColor: '#fff'
            });
            //单体实际容量柱状图
            let monBarRealCap = monBarData.realCap;
            let monBarRealCapEnd = monBarRealCap[this.getDataIndex(monBarRealCap.length, this.slider)];
            let monBarRealCapArr = monBarRealCapEnd.map(item => {
                return item[1];
            });
            lastarray.push(monBarRealCapArr);
            let monRealCapNum = getBarNum(monBarRealCapEnd);
            monBarChart.title.show = true;
            monBarChart.title.text = this.getTitle(monBarRealCapArr, "Actual_capacity");
            monBarChart.title.x = 'center';
            monBarChart.series[0].name = "单体实际容量";
            monBarChart.series[0].data = monBarRealCapEnd;
            let monBarChartRealCapOption = this.$refs.monBar.getOption(monBarChart);
            this.createGraphByOpt(monBarChartRealCapOption);
            let orbottom2 = allGraph.getDataURL({
                pixelRatio: 1,
                backgroundColor: '#fff'
            });
            //单体剩余容量柱状图
            let monBarResCap = monBarData.resCap;
            let monBarResCapEnd = monBarResCap[this.getDataIndex(monBarResCap.length, this.slider)];
            let monBarResCapArr = monBarResCapEnd.map(item => {
                return item[1];
            });
            lastarray.push(monBarResCapArr);
            monBarChart.title.show = true;
            monBarChart.title.text = this.getTitle(monBarResCapArr, "Residual_capacity");
            monBarChart.title.x = 'center';
            monBarChart.series[0].name = "单体剩余容量";
            monBarChart.series[0].data = monBarResCapEnd;
            let monBarChartResCapOption = this.$refs.monBar.getOption(monBarChart);
            this.createGraphByOpt(monBarChartResCapOption);
            let orbottom3 = allGraph.getDataURL({
                pixelRatio: 1,
                backgroundColor: '#fff'
            });
            //单体容量百分比柱状图
            let monBarPreCap = monBarData.preCap;
            let monBarPreCapEnd = monBarPreCap[this.getDataIndex(monBarPreCap.length, this.slider)];
            let monBarPreCapArr = monBarPreCapEnd.map(item => {
                return item[1];
            });
            lastarray.push(monBarPreCapArr);
            monBarChart.title.show = true;
            monBarChart.title.text = this.getTitle(monBarPreCapArr, "Percent_total_capacity");
            monBarChart.title.x = 'center';
            monBarChart.series[0].name = "单体容量百分比";
            monBarChart.series[0].data = monBarPreCapEnd;
            let monBarChartPreCapOption = this.$refs.monBar.getOption(monBarChart);
            this.createGraphByOpt(monBarChartPreCapOption);
            let orbottom4 = allGraph.getDataURL({
                pixelRatio: 1,
                backgroundColor: '#fff'
            });
            // 单体电压折线图
            monLineChart.title.show = true;
            monLineChart.title.text = "单体电压(V)";
            monLineChart.title.x = 'center';
            monLineChart.series = monLineData.vol.map((item, index) => {
                let monNum = "#" + (index + 1);
                return {
                    name: monNum,
                    data: item
                };
            });
            let monLineChartVolOption = this.$refs.groupVol.getOption(monLineChart);
            this.createGraphByOpt(monLineChartVolOption);
            let vol_line = allGraph.getDataURL({
                pixelRatio: 1,
                backgroundColor: '#fff'
            });
            // 单体温度折线图
            monLineChart.title.show = true;
            monLineChart.title.text = "单体温度(℃)";
            monLineChart.title.x = 'center';
            monLineChart.series = monLineData.temp.map((item, index) => {
                let monNum = "#" + (index + 1);
                return {
                    name: monNum,
                    data: item
                };
            });
            let monLineChartTempOption = this.$refs.groupVol.getOption(monLineChart);
            this.createGraphByOpt(monLineChartTempOption);
            let tmp_line = allGraph.getDataURL({
                pixelRatio: 1,
                backgroundColor: '#fff'
            });
            // 单体剩余容量折线图
            monLineChart.title.show = true;
            monLineChart.title.text = "剩余容量(AH)";
            monLineChart.title.x = 'center';
            monLineChart.series = monLineData.resCap.map((item, index) => {
                let monNum = "#" + (index + 1);
                return {
                    name: monNum,
                    data: item
                };
            });
            let monLineChartResCapOption = this.$refs.groupVol.getOption(monLineChart);
            this.createGraphByOpt(monLineChartResCapOption);
            let resCap_line = allGraph.getDataURL({
                pixelRatio: 1,
                backgroundColor: '#fff'
            });
            // 单体内阻
            let monBarRes = monBarData.res;
            let monBarResArr = monBarRes.map(item => {
                return item[1];
            });
            monBarChart.title.show = true;
            monBarChart.title.text = this.getTitle(monBarResArr, "Resistance");
            monBarChart.title.x = 'center';
            monBarChart.series[0].name = "单体内阻";
            monBarChart.series[0].data = monBarRes;
            monBarChart.series[1].name = "";
            monBarChart.series[1].data = [];
            let monBarResOption = this.$refs.monBar.getOption(monBarChart);
            this.createGraphByOpt(monBarResOption);
            let mon_res = allGraph.getDataURL({
                pixelRatio: 1,
                backgroundColor: '#fff'
            });
            // 单体均衡电流
            let jhCurr = monBarData.jh_curr;
            let jhCurrArr = jhCurr.map(item => {
                return item[1];
            });
            let jhCurrNum = getBarNum(jhCurr);
            monBarChart.title.show = true;
            monBarChart.title.text = "最大值=" + jhCurrNum.max + "A;最小值=" + jhCurrNum.min + 'A;平局值=' + jhCurrNum.avg.toFixed(0) + "A";
            monBarChart.title.x = 'center';
            monBarChart.series[0].name = "单体均衡电流";
            monBarChart.series[0].data = jhCurr;
            monBarChart.series[1].name = "";
            monBarChart.series[1].data = [];
            let jhCurrOption = this.$refs.monBar.getOption(monBarChart);
            this.createGraphByOpt(jhCurrOption);
            let JH_curr = allGraph.getDataURL({
                pixelRatio: 1,
                backgroundColor: '#fff'
            });
            // 终止单体电压
            let endVolData = monBarData.vol[monBarData.vol.length - 1];
            let endVolDataNum = getBarNum(endVolData);
            monBarChart.title.show = true;
            monBarChart.title.text = "最大值=" + endVolDataNum.max + "V;最小值=" + endVolDataNum.min + 'V;平局值=' + endVolDataNum.avg.toFixed(2) + "V";
            monBarChart.title.x = 'center';
            monBarChart.series[0].name = "终止单体电压";
            monBarChart.series[0].data = endVolData;
            let endVolDataOption = this.$refs.monBar.getOption(monBarChart);
            this.createGraphByOpt(endVolDataOption);
            let last_vol = allGraph.getDataURL({
                pixelRatio: 1,
                backgroundColor: '#fff'
            });
            // 终止温度电压
            let endTempData = monBarData.temp[monBarData.temp.length - 1];
            let endTempDataNum = getBarNum(endTempData);
            monBarChart.title.show = true;
            monBarChart.title.text = "最大值=" + endTempDataNum.max + "℃;最小值=" + endTempDataNum.min + '℃;平局值=' + endTempDataNum.avg.toFixed(0) + "℃";
            monBarChart.title.x = 'center';
            monBarChart.series[0].name = "终止单体温度";
            monBarChart.series[0].data = endTempData;
            let endTempDataOption = this.$refs.monBar.getOption(monBarChart);
            this.createGraphByOpt(endTempDataOption);
            let last_tmp = allGraph.getDataURL({
                pixelRatio: 1,
                backgroundColor: '#fff'
            });
            lastarray.push(monBarData.res.map(item => {
                return item[1];
            }));
            lastarray.push(monBarData.temp[0].map(item => {
                return item[1];
            }));
            lastarray.push(monBarData.temp[monBarData.temp.length - 1].map(item => {
                return item[1];
            }));
            let batt = this.batt;
            let testdata = allData.endData;
            this.$refs.ltop_echart.value = oltop;                // 组端电压折线图
            this.$refs.rtop_echart.value = ortop;                // 电池电流折线图
            this.$refs.lbottom_echart.value = vol_line;        // 单体电压折线图
            this.$refs.rbottom_echart.value = orbottom1;        //单体电压柱状图
            this.$refs.actucap_echart.value = orbottom2;    //单体实际容量
            this.$refs.restcap_echart.value = orbottom3;    //单体剩余容量
            this.$refs.capperc_echart.value = orbottom4;    //单体容量百分比
            this.$refs.tmp_echart.value = tmp_line;    // 单体温度
            this.$refs.restcap_line_echart.value = resCap_line;      // 剩余容量
            this.$refs.mon_res.value = mon_res;    // 单体内阻
            this.$refs.JH_curr.value = JH_curr;    // 单体均衡电流
            this.$refs.last_vol.value = last_vol;    // 终止单体电压柱状图
            this.$refs.last_tmp.value = last_tmp;    // 终止单体温度柱状图
            let top_cause = this.battState.stop_reason;
            batt.StationIp = top_cause;
            this.$refs.obj_bmd.value = JSON.stringify({
                binf: batt,
                sdata: testdata
            });
            this.$refs.obj_title.value = JSON.stringify(lowObj);
            this.$refs.arr_data.value = JSON.stringify(lastarray);
            let batt_test_data = monBarData.vol.map(item => {
                return item.map(item2 => {
                    return item2[1];
                })
            });
            this.$refs.mon_vol_list.value = JSON.stringify(batt_test_data);
            let batt_test_tmpdata = monLineData.temp.map(item => {
                return item.map(item2 => {
                    return item2[1];
                })
            });
            this.$refs.mon_tmp_list.value = JSON.stringify(batt_test_tmpdata);
            this.$refs.mon_group_list.value = JSON.stringify(allData.dataList);
            this.$refs.all_picture.submit();
        },
        createGraphByOpt(opt) {
            allGraph.clear();
            opt.animation = false;
            allGraph.setOption(opt);
        },
        // 设置内阻信息
        searchBattresdata() {
            let batt = this.batt;
            searchBattresdata(batt.BattGroupId).then(res => {
                let rs = JSON.parse(res.data.result);
                if (rs.code == 1) {
                    let data = rs.data;
                    for (let i = 0; i < data.length; i++) {
                        let item = data[i];
                        let battNumText = '#' + item.mon_num;
                        monBarData.jh_curr.push([battNumText, item.mon_JH_curr]);
                        monBarData.res.push([battNumText, item.mon_res]);
                    }
                }
            }).catch(error => {
                console.log(error);
            });
        },
        getTitle(array, units) {
            let getLow = this.getLow;
            var title = "";
            //a=new Title();
            //alert(Titleobj);
            Titleobj = new Title();
            var sum = 0;
            if (array != undefined && array.length > 0) {
                Titleobj.setMax(Math.max.apply(null, array));
                Titleobj.setMin(Math.min.apply(null, array));
                for (var i = 0; i < array.length; i++) {
                    sum += parseFloat(array[i]);
                }
                var batt = this.batt;
                //console.info(batt);
                if ("Resistance" == units) {
                    Titleobj.setAvg((sum / array.length).toFixed(3));
                    var low = getLow(3, 2);
                    if (low.low_method == 0) {
                        //根据标称值计算
                        Titleobj.setAlow(((2 - low.low_value) * batt.MonResStd).toFixed(3));
                        low = getLow(3, 3);
                        Titleobj.setClow(((2 - low.low_value) * batt.MonResStd).toFixed(3));
                    } else {
                        //根据平均值计算
                        Titleobj.setAlow(((2 - low.low_value) * Titleobj.getAvg()).toFixed(3));
                        low = getLow(3, 3);
                        Titleobj.setClow(((2 - low.low_value) * Titleobj.getAvg()).toFixed(3));
                    }
                    var count = 0;
                    for (var i = 0; i < array.length; i++) {
                        if (parseFloat(Titleobj.getAlow()) < parseFloat(array[i])) {
                            //console.info(title.getAlow()+"<"+array[i]);
                            count++;
                        }
                    }
                    Titleobj.setLc(count);
                    Titleobj.setLp((count * 100 / array.length).toFixed(1));
                    //console.info(title);
                } else {
                    if ("Voltage" == units) {
                        Titleobj.setAvg((sum / array.length).toFixed(3));
                        var low = getLow(1, 1);
                        if (low.low_method == 0) {
                            //根据标称值计算
                            Titleobj.setAlow((low.low_value * batt.MonVolStd).toFixed(3));
                            low = getLow(1, 0);
                            Titleobj.setClow((low.low_value * batt.MonVolStd).toFixed(3));
                        } else {
                            //根据平均值计算
                            Titleobj.setAlow((low.low_value * Titleobj.getAvg()).toFixed(3));
                            low = getLow(1, 0);
                            Titleobj.setClow((low.low_value * Titleobj.getAvg()).toFixed(3));
                        }
                    } else if ("Temperature" == units) {
                        Titleobj.setAvg((sum / array.length).toFixed(1));
                        var low = getLow(1, 1);
                        if (low.low_method == 0) {
                            //根据标称值计算
                            Titleobj.setAlow((low.low_value * batt.MonTmpStd).toFixed(1));
                            low = getLow(1, 0);
                            Titleobj.setClow((low.low_value * batt.MonTmpStd).toFixed(1));
                        } else {
                            //根据平均值计算
                            Titleobj.setAlow((low.low_value * Titleobj.getAvg()).toFixed(1));
                            low = getLow(1, 0);
                            Titleobj.setClow((low.low_value * Titleobj.getAvg()).toFixed(1));
                        }
                    } else if ("Conductance" == units) {
                        Titleobj.setAvg((sum / array.length).toFixed(0));
                        var low = getLow(3, 2);
                        if (low.low_method == 0) {
                            //根据标称值计算
                            Titleobj.setAlow((low.low_value * batt.MonSerStd).toFixed(0));
                            low = getLow(3, 3);
                            Titleobj.setClow((low.low_value * batt.MonSerStd).toFixed(0));
                        } else {
                            //根据平均值计算
                            Titleobj.setAlow((low.low_value * Titleobj.getAvg()).toFixed(0));
                            low = getLow(3, 3);
                            Titleobj.setClow((low.low_value * Titleobj.getAvg()).toFixed(0));
                        }
                    } else if ("Actual_capacity" == units) {
                        Titleobj.setAvg((sum / array.length).toFixed(0));
                        var low = getLow(2, 2);
                        if (low.low_method == 0) {
                            //根据标称值计算
                            Titleobj.setAlow((low.low_value * batt.MonCapStd).toFixed(0));
                            //console.info(batt);
                            low = getLow(2, 3);
                            Titleobj.setClow((low.low_value * batt.MonCapStd).toFixed(0));
                        } else {
                            //根据平均值计算
                            Titleobj.setAlow((low.low_value * Titleobj.getAvg()).toFixed(0));
                            low = getLow(2, 3);
                            Titleobj.setClow((low.low_value * Titleobj.getAvg()).toFixed(0));
                        }
                    } else if ("Residual_capacity" == units) {
                        Titleobj.setAvg((sum / array.length).toFixed(0));
                        var low = getLow(1, 1);
                        if (low.low_method == 0) {
                            //根据标称值计算
                            Titleobj.setAlow((low.low_value * Titleobj.getAvg()).toFixed(0));
                            //console.info(batt);
                            low = getLow(1, 0);
                            Titleobj.setClow((low.low_value * Titleobj.getAvg()).toFixed(0));
                        } else {
                            //根据平均值计算
                            Titleobj.setAlow((low.low_value * Titleobj.getAvg()).toFixed(0));
                            //console.info(batt);
                            low = getLow(1, 0);
                            Titleobj.setClow((low.low_value * Titleobj.getAvg()).toFixed(0));
                        }
                    } else if ("Percent_total_capacity" == units) {
                        Titleobj.setAvg((sum / array.length).toFixed(2));
                        var low = getLow(2, 2);
                        if (low.low_method == 0) {
                            //根据标称值计算
                            Titleobj.setAlow((low.low_value * batt.MonCapStd).toFixed(2));
                            //console.info(batt);
                            low = getLow(2, 3);
                            Titleobj.setClow((low.low_value * batt.MonCapStd).toFixed(2));
                        } else {
                            //根据平均值计算
                            Titleobj.setAlow((low.low_value * Titleobj.getAvg()).toFixed(2));
                            low = getLow(2, 3);
                            Titleobj.setClow((low.low_value * Titleobj.getAvg()).toFixed(2));
                        }
                    } else if ("MonJHCurr" == units) {
                        //单体均衡
                        Titleobj.setAvg((sum / array.length).toFixed(2));
                    }
                    var count = 0;
                    for (var i = 0; i < array.length; i++) {
                        if (parseFloat(Titleobj.getAlow()) > parseFloat(array[i])) {
                            count++;
                        }
                    }
                    Titleobj.setLc(count);
                    Titleobj.setLp((count * 100 / array.length).toFixed(1));
                }
                //console.info(Title);
                title = Titleobj.getAllTile(units);
            }
            return title;
        },
        searchAll_lowAction() {
            searchAll_lowAction().then(res => {
                let rs = JSON.parse(res.data.result);
                if (rs.code == 1) {
                    this.low_list = rs.data;
                }
            }).catch(error => {
                console.log(error);
            });
        },
        getLow(lowtype, lownametype) {
            let low_list = this.low_list;
            if (lowtype != undefined && low_list != undefined && lownametype != undefined) {
                for (var i = 0; i < low_list.length; i++) {
                    if (lowtype == low_list[i].low_type && lownametype == low_list[i].low_nametype) {
                        return low_list[i];
                    }
                }
            }
        },
        // 添加标准曲线
        confirmAddStandardLine() {
            // 电池信息
            let batt = this.batt;
            // 记录信息
            let testRecord = this.getTestRecord();
            console.log(testRecord);
            if (testRecord != -1) {
                if (testRecord.test_type != 3) {
                    this.$layer.msg('请选择放电数据');
                    return;
                }
                let note = (testRecord.test_cap / (testRecord.test_timelong / 3600)).toHold(0);
                let searchParams = {
                    BattgroupId: batt.BattGroupId,
                    test_record_count: testRecord.test_record_count,
                    monvolstd: batt.MonVolStd,
                    moncapstd: batt.MonCapStd,
                    note: Math.abs(note),
                    battproducer: batt.BattProducer,
                    battmodel: batt.BattModel,
                };
                const h = this.$createElement;
                this.$confirm(h('div', null, [
                    h('p', null, '标称容量:' + searchParams.moncapstd + "AH"),
                    h('p', null, '标称电压:' + searchParams.monvolstd + "V"),
                    h('p', null, '电池品牌:' + searchParams.battproducer),
                    h('p', null, '电池型号:' + searchParams.battmodel),
                    h('p', null, '小时率:' + searchParams.note),
                ]), "添加标准曲线", {
                    type: 'null',
                }).then(() => {
                    this.addStandardLine(searchParams);
                }).catch(() => {
                });
            } else {
                this.$layer.msg('暂无放电数据,请先选择充放电数据!');
            }
        },
        addStandardLine(params) {
            // 添加标准曲线
            this.$apis.dataTest.history.addStandardLine(params).then(res => {
                let rs = JSON.parse(res.data.result);
                if (rs.code == 1) {
                    this.$layer.msg("添加标准曲线成功");
                } else {
                    this.$layer.msg("添加标准曲线失败");
                }
            }).catch(error => {
                console.log(error);
            });
        }
      }
      return chartTypeInfo;
    },
    changeChartType() {
      if (allData.groupVol.length == 0) {
    computed: {
        battFullName() {
            let batt = this.batt;
            if (batt.StationName && batt.BattGroupName) {
                return batt.StationName + "-" + batt.BattGroupName;
            }
            return "电池组全称";
        },
        formateBattState() {
            let battState = this.battState;
            if (battState.test_type == 3) {
                return "放电(终止原因:" + battState.stop_reason + ")";
            } else if (battState.test_type == 2) {
                return "充电"
            } else {
                return "";
            }
        },
    },
    mounted() {
        // 初始化图表
        this.initChart();
      } else {
        let loading = this.$layer.loading();
        setTimeout(() => {
          this.setBarChart();
          this.setMonLineChart();
          this.$layer.close(loading);
        }, 100);
      }
    },
    // 导出报表
    exportExcel() {
      if (allData.groupVol.length == 0) {
        this.$layer.msg('暂无数据导出,请先选择充放电数据!');
        return false;
      }
      let lastarray = new Array();
      lastarray.push(allData.monNumList);
      //组端电压折线图
      let groupVolLineChartOption = this.$refs.groupVol.getOption(groupVolLineChart);
      groupVolLineChartOption.title.show = true;
      groupVolLineChartOption.title.x = 'center';
      groupVolLineChartOption.legend.show = false;
      this.createGraphByOpt(groupVolLineChartOption);
      let oltop = allGraph.getDataURL({
        pixelRatio: 1,
        backgroundColor: '#fff'
      });
      // 电池电流折线图
      let currLineChartOption = this.$refs.groupVol.getOption(currLineChart);
      currLineChartOption.title.show = true;
      currLineChartOption.title.x = 'center';
      currLineChartOption.legend.show = false;
      this.createGraphByOpt(currLineChartOption);
      let ortop = allGraph.getDataURL({
        pixelRatio: 1,
        backgroundColor: '#fff'
      });
      // 单体电压折线图
      let monLineChartVolOption = this.$refs.groupVol.getOption(monLineChart);
      monLineChartVolOption.title.show = true;
      monLineChartVolOption.title.x = 'center';
      this.createGraphByOpt(monLineChartVolOption);
      let vol_line = allGraph.getDataURL({
        pixelRatio: 1,
        backgroundColor: '#fff'
      });
      //获取起始单体电压
      lastarray.push(monBarData.vol[0].map(item => {
        return item[1];
      }));
      //单体电压柱状图
      let monBarVol = monBarData.vol;
      let monBarEndVol = monBarVol[this.getDataIndex(monBarVol.length, this.slider)];
      //获取单体截止电压
      let monBarVolArr = monBarEndVol.map(item => {
        return item[1];
      });
      lastarray.push(monBarVolArr);
      monBarChart.title.show = true;
      monBarChart.title.text = this.getTitle(monBarVolArr, 'Voltage');
      let lowObj = Titleobj;                                //落后单体电压信息
      monBarChart.title.x = 'center';
      monBarChart.series[0].name = "单体电压";
      monBarChart.series[0].data = monBarEndVol;
      let monBarChartVolOption = this.$refs.monBar.getOption(monBarChart);
      this.createGraphByOpt(monBarChartVolOption);
      let orbottom1 = allGraph.getDataURL({
        pixelRatio: 1,
        backgroundColor: '#fff'
      });
      //单体实际容量柱状图
      let monBarRealCap = monBarData.realCap;
      let monBarRealCapEnd = monBarRealCap[this.getDataIndex(monBarRealCap.length, this.slider)];
      let monBarRealCapArr = monBarRealCapEnd.map(item => {
        return item[1];
      });
      lastarray.push(monBarRealCapArr);
      let monRealCapNum = getBarNum(monBarRealCapEnd);
      monBarChart.title.show = true;
      monBarChart.title.text = this.getTitle(monBarRealCapArr, "Actual_capacity");
      monBarChart.title.x = 'center';
      monBarChart.series[0].name = "单体实际容量";
      monBarChart.series[0].data = monBarRealCapEnd;
      let monBarChartRealCapOption = this.$refs.monBar.getOption(monBarChart);
      this.createGraphByOpt(monBarChartRealCapOption);
      let orbottom2 = allGraph.getDataURL({
        pixelRatio: 1,
        backgroundColor: '#fff'
      });
      //单体剩余容量柱状图
      let monBarResCap = monBarData.resCap;
      let monBarResCapEnd = monBarResCap[this.getDataIndex(monBarResCap.length, this.slider)];
      let monBarResCapArr = monBarResCapEnd.map(item => {
        return item[1];
      });
      lastarray.push(monBarResCapArr);
      monBarChart.title.show = true;
      monBarChart.title.text = this.getTitle(monBarResCapArr, "Residual_capacity");
      monBarChart.title.x = 'center';
      monBarChart.series[0].name = "单体剩余容量";
      monBarChart.series[0].data = monBarResCapEnd;
      let monBarChartResCapOption = this.$refs.monBar.getOption(monBarChart);
      this.createGraphByOpt(monBarChartResCapOption);
      let orbottom3 = allGraph.getDataURL({
        pixelRatio: 1,
        backgroundColor: '#fff'
      });
      //单体容量百分比柱状图
      let monBarPreCap = monBarData.preCap;
      let monBarPreCapEnd = monBarPreCap[this.getDataIndex(monBarPreCap.length, this.slider)];
      let monBarPreCapArr = monBarPreCapEnd.map(item => {
        return item[1];
      });
      lastarray.push(monBarPreCapArr);
      monBarChart.title.show = true;
      monBarChart.title.text = this.getTitle(monBarPreCapArr, "Percent_total_capacity");
      monBarChart.title.x = 'center';
      monBarChart.series[0].name = "单体容量百分比";
      monBarChart.series[0].data = monBarPreCapEnd;
      let monBarChartPreCapOption = this.$refs.monBar.getOption(monBarChart);
      this.createGraphByOpt(monBarChartPreCapOption);
      let orbottom4 = allGraph.getDataURL({
        pixelRatio: 1,
        backgroundColor: '#fff'
      });
      // 单体温度折线图
      monLineChart.title.show = true;
      monLineChart.title.text = "单体温度(℃)";
      monLineChart.title.x = 'center';
      monLineChart.series = monLineData.temp.map((item, index) => {
        let monNum = "#" + (index + 1);
        return {
          name: monNum,
          data: item
        };
      });
      let monLineChartTempOption = this.$refs.groupVol.getOption(monLineChart);
      this.createGraphByOpt(monLineChartTempOption);
      let tmp_line = allGraph.getDataURL({
        pixelRatio: 1,
        backgroundColor: '#fff'
      });
      // 单体内阻
      let monBarRes = monBarData.res;
      let monBarResArr = monBarRes.map(item => {
        return item[1];
      });
      debugger;
      monBarChart.title.show = true;
      monBarChart.title.text = this.getTitle(monBarResArr, "Resistance");
      monBarChart.title.x = 'center';
      monBarChart.series[0].name = "单体内阻";
      monBarChart.series[0].data = monBarRes;
      monBarChart.series[1].name = "";
      monBarChart.series[1].data = [];
      let monBarResOption = this.$refs.monBar.getOption(monBarChart);
      this.createGraphByOpt(monBarResOption);
      let mon_res = allGraph.getDataURL({
        pixelRatio: 1,
        backgroundColor: '#fff'
      });
      // 单体均衡电流
      let jhCurr = monBarData.jh_curr;
      let jhCurrArr = jhCurr.map(item => {
        return item[1];
      });
      let jhCurrNum = getBarNum(jhCurr);
      monBarChart.title.show = true;
      monBarChart.title.text = "最大值=" + jhCurrNum.max + "A;最小值=" + jhCurrNum.min + 'A;平局值=' + jhCurrNum.avg.toFixed(0) + "A";
      monBarChart.title.x = 'center';
      monBarChart.series[0].name = "单体均衡电流";
      monBarChart.series[0].data = jhCurr;
      monBarChart.series[1].name = "";
      monBarChart.series[1].data = [];
      let jhCurrOption = this.$refs.monBar.getOption(monBarChart);
      this.createGraphByOpt(jhCurrOption);
      let JH_curr = allGraph.getDataURL({
        pixelRatio: 1,
        backgroundColor: '#fff'
      });
      // 终止单体电压
      let endVolData = monBarData.vol[monBarData.vol.length - 1];
      let endVolDataNum = getBarNum(endVolData);
      monBarChart.title.show = true;
      monBarChart.title.text = "最大值=" + endVolDataNum.max + "V;最小值=" + endVolDataNum.min + 'V;平局值=' + endVolDataNum.avg.toFixed(2) + "V";
      monBarChart.title.x = 'center';
      monBarChart.series[0].name = "终止单体电压";
      monBarChart.series[0].data = endVolData;
      let endVolDataOption = this.$refs.monBar.getOption(monBarChart);
      this.createGraphByOpt(endVolDataOption);
      let last_vol = allGraph.getDataURL({
        pixelRatio: 1,
        backgroundColor: '#fff'
      });
      // 终止温度电压
      let endTempData = monBarData.temp[monBarData.temp.length - 1];
      let endTempDataNum = getBarNum(endTempData);
      monBarChart.title.show = true;
      monBarChart.title.text = "最大值=" + endTempDataNum.max + "℃;最小值=" + endTempDataNum.min + '℃;平局值=' + endTempDataNum.avg.toFixed(0) + "℃";
      monBarChart.title.x = 'center';
      monBarChart.series[0].name = "终止单体温度";
      monBarChart.series[0].data = endTempData;
      let endTempDataOption = this.$refs.monBar.getOption(monBarChart);
      this.createGraphByOpt(endTempDataOption);
      let last_tmp = allGraph.getDataURL({
        pixelRatio: 1,
        backgroundColor: '#fff'
      });
      lastarray.push(monBarData.res.map(item => {
        return item[1];
      }));
      lastarray.push(monBarData.temp[0].map(item => {
        return item[1];
      }));
      lastarray.push(monBarData.temp[monBarData.temp.length - 1].map(item => {
        return item[1];
      }));
      let batt = this.batt;
      let testdata = allData.endData;
      this.$refs.ltop_echart.value = oltop;                // 组端电压折线图
      this.$refs.rtop_echart.value = ortop;                // 电池电流折线图
      this.$refs.lbottom_echart.value = vol_line;        // 单体电压折线图
      this.$refs.rbottom_echart.value = orbottom1;        //单体电压柱状图
      this.$refs.actucap_echart.value = orbottom2;    //单体实际容量
      this.$refs.restcap_echart.value = orbottom3;    //单体剩余容量
      this.$refs.capperc_echart.value = orbottom4;    //单体容量百分比
      this.$refs.tmp_echart.value = tmp_line;    // 单体温度
      this.$refs.mon_res.value = mon_res;    // 单体内阻
      this.$refs.JH_curr.value = JH_curr;    // 单体均衡电流
      this.$refs.last_vol.value = last_vol;    // 终止单体电压柱状图
      this.$refs.last_tmp.value = last_tmp;    // 终止单体温度柱状图
      let top_cause = this.battState.stop_reason;
      batt.StationIp = top_cause;
      this.$refs.obj_bmd.value = JSON.stringify({
        binf: batt,
        sdata: testdata
      });
      this.$refs.obj_title.value = JSON.stringify(lowObj);
      this.$refs.arr_data.value = JSON.stringify(lastarray);
      let batt_test_data = monBarData.vol.map(item => {
        return item.map(item2 => {
          return item2[1];
        })
      });
      this.$refs.mon_vol_list.value = JSON.stringify(batt_test_data);
      let batt_test_tmpdata = monLineData.temp.map(item => {
        return item.map(item2 => {
          return item2[1];
        })
      });
      this.$refs.mon_tmp_list.value = JSON.stringify(batt_test_tmpdata);
      this.$refs.mon_group_list.value = JSON.stringify(allData.dataList);
      this.$refs.all_picture.submit();
    },
    createGraphByOpt(opt) {
      allGraph.clear();
      opt.animation = false;
      allGraph.setOption(opt);
    },
    // 设置内阻信息
    searchBattresdata() {
      let batt = this.batt;
      searchBattresdata(batt.BattGroupId).then(res => {
        let rs = JSON.parse(res.data.result);
        if (rs.code == 1) {
          let data = rs.data;
          for (let i = 0; i < data.length; i++) {
            let item = data[i];
            let battNumText = '#' + item.mon_num;
            monBarData.jh_curr.push([battNumText, item.mon_JH_curr]);
            monBarData.res.push([battNumText, item.mon_res]);
          }
        }
      }).catch(error => {
        console.log(error);
      });
    },
    getTitle(array, units) {
      let getLow = this.getLow;
      var title = "";
      //a=new Title();
      //alert(Titleobj);
      Titleobj = new Title();
      var sum = 0;
      if (array != undefined && array.length > 0) {
        Titleobj.setMax(Math.max.apply(null, array));
        Titleobj.setMin(Math.min.apply(null, array));
        for (var i = 0; i < array.length; i++) {
          sum += parseFloat(array[i]);
        }
        var batt = this.batt;
        //console.info(batt);
        if ("Resistance" == units) {
          Titleobj.setAvg((sum / array.length).toFixed(3));
          var low = getLow(3, 2);
          if (low.low_method == 0) {
            //根据标称值计算
            Titleobj.setAlow(((2 - low.low_value) * batt.MonResStd).toFixed(3));
            low = getLow(3, 3);
            Titleobj.setClow(((2 - low.low_value) * batt.MonResStd).toFixed(3));
          } else {
            //根据平均值计算
            Titleobj.setAlow(((2 - low.low_value) * Titleobj.getAvg()).toFixed(3));
            low = getLow(3, 3);
            Titleobj.setClow(((2 - low.low_value) * Titleobj.getAvg()).toFixed(3));
          }
          var count = 0;
          for (var i = 0; i < array.length; i++) {
            if (parseFloat(Titleobj.getAlow()) < parseFloat(array[i])) {
              //console.info(title.getAlow()+"<"+array[i]);
              count++;
            }
          }
          Titleobj.setLc(count);
          Titleobj.setLp((count * 100 / array.length).toFixed(1));
          //console.info(title);
        } else {
          if ("Voltage" == units) {
            Titleobj.setAvg((sum / array.length).toFixed(3));
            var low = getLow(1, 1);
            if (low.low_method == 0) {
              //根据标称值计算
              Titleobj.setAlow((low.low_value * batt.MonVolStd).toFixed(3));
              low = getLow(1, 0);
              Titleobj.setClow((low.low_value * batt.MonVolStd).toFixed(3));
            } else {
              //根据平均值计算
              Titleobj.setAlow((low.low_value * Titleobj.getAvg()).toFixed(3));
              low = getLow(1, 0);
              Titleobj.setClow((low.low_value * Titleobj.getAvg()).toFixed(3));
            }
          } else if ("Temperature" == units) {
            Titleobj.setAvg((sum / array.length).toFixed(1));
            var low = getLow(1, 1);
            if (low.low_method == 0) {
              //根据标称值计算
              Titleobj.setAlow((low.low_value * batt.MonTmpStd).toFixed(1));
              low = getLow(1, 0);
              Titleobj.setClow((low.low_value * batt.MonTmpStd).toFixed(1));
            } else {
              //根据平均值计算
              Titleobj.setAlow((low.low_value * Titleobj.getAvg()).toFixed(1));
              low = getLow(1, 0);
              Titleobj.setClow((low.low_value * Titleobj.getAvg()).toFixed(1));
            }
          } else if ("Conductance" == units) {
            Titleobj.setAvg((sum / array.length).toFixed(0));
            var low = getLow(3, 2);
            if (low.low_method == 0) {
              //根据标称值计算
              Titleobj.setAlow((low.low_value * batt.MonSerStd).toFixed(0));
              low = getLow(3, 3);
              Titleobj.setClow((low.low_value * batt.MonSerStd).toFixed(0));
            } else {
              //根据平均值计算
              Titleobj.setAlow((low.low_value * Titleobj.getAvg()).toFixed(0));
              low = getLow(3, 3);
              Titleobj.setClow((low.low_value * Titleobj.getAvg()).toFixed(0));
            }
          } else if ("Actual_capacity" == units) {
            Titleobj.setAvg((sum / array.length).toFixed(0));
            var low = getLow(2, 2);
            if (low.low_method == 0) {
              //根据标称值计算
              Titleobj.setAlow((low.low_value * batt.MonCapStd).toFixed(0));
              //console.info(batt);
              low = getLow(2, 3);
              Titleobj.setClow((low.low_value * batt.MonCapStd).toFixed(0));
            } else {
              //根据平均值计算
              Titleobj.setAlow((low.low_value * Titleobj.getAvg()).toFixed(0));
              low = getLow(2, 3);
              Titleobj.setClow((low.low_value * Titleobj.getAvg()).toFixed(0));
            }
          } else if ("Residual_capacity" == units) {
            Titleobj.setAvg((sum / array.length).toFixed(0));
            var low = getLow(1, 1);
            if (low.low_method == 0) {
              //根据标称值计算
              Titleobj.setAlow((low.low_value * Titleobj.getAvg()).toFixed(0));
              //console.info(batt);
              low = getLow(1, 0);
              Titleobj.setClow((low.low_value * Titleobj.getAvg()).toFixed(0));
            } else {
              //根据平均值计算
              Titleobj.setAlow((low.low_value * Titleobj.getAvg()).toFixed(0));
              //console.info(batt);
              low = getLow(1, 0);
              Titleobj.setClow((low.low_value * Titleobj.getAvg()).toFixed(0));
            }
          } else if ("Percent_total_capacity" == units) {
            Titleobj.setAvg((sum / array.length).toFixed(2));
            var low = getLow(2, 2);
            if (low.low_method == 0) {
              //根据标称值计算
              Titleobj.setAlow((low.low_value * batt.MonCapStd).toFixed(2));
              //console.info(batt);
              low = getLow(2, 3);
              Titleobj.setClow((low.low_value * batt.MonCapStd).toFixed(2));
            } else {
              //根据平均值计算
              Titleobj.setAlow((low.low_value * Titleobj.getAvg()).toFixed(2));
              low = getLow(2, 3);
              Titleobj.setClow((low.low_value * Titleobj.getAvg()).toFixed(2));
            }
          } else if ("MonJHCurr" == units) {
            //单体均衡
            Titleobj.setAvg((sum / array.length).toFixed(2));
          }
          var count = 0;
          for (var i = 0; i < array.length; i++) {
            if (parseFloat(Titleobj.getAlow()) > parseFloat(array[i])) {
              count++;
            }
          }
          Titleobj.setLc(count);
          Titleobj.setLp((count * 100 / array.length).toFixed(1));
        }
        //console.info(Title);
        title = Titleobj.getAllTile(units);
      }
      return title;
    },
    searchAll_lowAction() {
      searchAll_lowAction().then(res => {
        let rs = JSON.parse(res.data.result);
        if (rs.code == 1) {
          this.low_list = rs.data;
        }
      }).catch(error => {
        console.log(error);
      });
    },
    getLow(lowtype, lownametype) {
      let low_list = this.low_list;
      if (lowtype != undefined && low_list != undefined && lownametype != undefined) {
        for (var i = 0; i < low_list.length; i++) {
          if (lowtype == low_list[i].low_type && lownametype == low_list[i].low_nametype) {
            return low_list[i];
          }
        }
      }
    },
    // 添加标准曲线
    confirmAddStandardLine() {
      // 电池信息
      let batt = this.batt;
      // 记录信息
      let testRecord = this.getTestRecord();
      console.log(testRecord);
      if (testRecord != -1) {
        if(testRecord.test_type != 3) {
          this.$layer.msg('请选择放电数据');
          return;
        }
        let note = (testRecord.test_cap / (testRecord.test_timelong / 3600)).toHold(0);
        let searchParams = {
          BattgroupId: batt.BattGroupId,
          test_record_count: testRecord.test_record_count,
          monvolstd: batt.MonVolStd,
          moncapstd: batt.MonCapStd,
          note: Math.abs(note),
          battproducer: batt.BattProducer,
          battmodel: batt.BattModel,
        };
        const h = this.$createElement;
        this.$confirm(h('div', null, [
          h('p', null, '标称容量:' + searchParams.moncapstd + "AH"),
          h('p', null, '标称电压:' + searchParams.monvolstd + "V"),
          h('p', null, '电池品牌:' + searchParams.battproducer),
          h('p', null, '电池型号:' + searchParams.battmodel),
          h('p', null, '小时率:' + searchParams.note),
        ]), "添加标准曲线", {
          type: 'null',
        }).then(() => {
          this.addStandardLine(searchParams);
        }).catch(() => {});
      } else {
        this.$layer.msg('暂无放电数据,请先选择充放电数据!');
      }
    },
    addStandardLine(params) {
      // 添加标准曲线
      this.$apis.dataTest.history.addStandardLine(params).then(res=>{
        let rs = JSON.parse(res.data.result);
        if(rs.code == 1) {
          this.$layer.msg("添加标准曲线成功");
        }else {
          this.$layer.msg("添加标准曲线失败");
        }
      }).catch(error=>{
        console.log(error);
      });
        this.searchAll_lowAction();
        // 基于准备好的dom,初始化echarts实例
        allGraph = ECharts.init(this.$refs.allGraph, 'transparent');
        // 屏幕缩放时触发
        window.addEventListener("resize", () => {
            this.resize();
        });
    }
  },
  computed: {
    battFullName() {
      let batt = this.batt;
      if (batt.StationName && batt.BattGroupName) {
        return batt.StationName + "-" + batt.BattGroupName;
      }
      return "电池组全称";
    },
    formateBattState() {
      let battState = this.battState;
      if (battState.test_type == 3) {
        return "放电(终止原因:" + battState.stop_reason + ")";
      } else if (battState.test_type == 2) {
        return "充电"
      } else {
        return "";
      }
    },
  },
  mounted() {
    // 初始化图表
    this.initChart();
    this.searchAll_lowAction();
    // 基于准备好的dom,初始化echarts实例
    allGraph = ECharts.init(this.$refs.allGraph, 'transparent');
    // 屏幕缩放时触发
    window.addEventListener("resize", () => {
      this.resize();
    });
  }
};
</script>
<style scoped>
.page-history {
  color: #ffffff;
    color: #ffffff;
}
.table-cell.text-right {
  font-size: 14px;
    font-size: 14px;
}
.table-row .table-cell {
  padding-top: 12px;
    padding-top: 12px;
}
.page-content {
  position: relative;
  padding-top: 8px;
  padding-bottom: 2px;
  box-sizing: border-box;
  height: 100%;
    position: relative;
    padding-top: 8px;
    padding-bottom: 2px;
    box-sizing: border-box;
    height: 100%;
}
.history-list {
  position: absolute;
  top: 8px;
  left: 24px;
  z-index: 99;
    position: absolute;
    top: 8px;
    left: 24px;
    z-index: 99;
}
.flex-box-list {
  display: flex;
  flex-direction: row;
  height: 50%;
  box-sizing: border-box;
    display: flex;
    flex-direction: row;
    height: 50%;
    box-sizing: border-box;
}
.page-content .flex-box {
  flex: 1;
  overflow-x: hidden;
    flex: 1;
    overflow-x: hidden;
}
.slider-container {
  padding-left: 16px;
  padding-right: 16px;
  overflow: hidden;
    padding-left: 16px;
    padding-right: 16px;
    overflow: hidden;
}
.box-tools {
  line-height: 32px;
    line-height: 32px;
}
.box-tools .iconfont {
  font-size: 20px;
    font-size: 20px;
}
.box-tools .iconfont:hover {
  cursor: pointer;
  color: #cfcfcf;
    cursor: pointer;
    color: #cfcfcf;
}
.box-tools .iconfont:active {
  color: #FF0000;
    color: #FF0000;
}
.chart-wrapper {
  position: relative;
  box-sizing: border-box;
  margin: 0 16px;
  height: 100%;
  padding: 12px;
  background-image: radial-gradient(#151f4140, #3667ec40);
    position: relative;
    box-sizing: border-box;
    margin: 0 16px;
    height: 100%;
    padding: 12px;
    background-image: radial-gradient(#151f4140, #3667ec40);
}
.chart-wrapper:before,
.chart-wrapper:after,
.chart-wrapper-corner {
  position: absolute;
  display: inline-block;
  content: " ";
  width: 18px;
  height: 18px;
    position: absolute;
    display: inline-block;
    content: " ";
    width: 18px;
    height: 18px;
}
.chart-wrapper:before {
  left: 0;
  top: 0;
  border-top: 2px solid #00FEFF;
  border-left: 2px solid #00FEFF;
    left: 0;
    top: 0;
    border-top: 2px solid #00FEFF;
    border-left: 2px solid #00FEFF;
}
.chart-wrapper:after {
  left: 0;
  bottom: 0;
  border-bottom: 2px solid #00FEFF;
  border-left: 2px solid #00FEFF;
    left: 0;
    bottom: 0;
    border-bottom: 2px solid #00FEFF;
    border-left: 2px solid #00FEFF;
}
.chart-wrapper-corner.top-right {
  top: 0;
  right: 0;
  border-top: 2px solid #00FEFF;
  border-right: 2px solid #00FEFF;
    top: 0;
    right: 0;
    border-top: 2px solid #00FEFF;
    border-right: 2px solid #00FEFF;
}
.chart-wrapper-corner.bottom-right {
  bottom: 0;
  right: 0;
  border-bottom: 2px solid #00FEFF;
  border-right: 2px solid #00FEFF;
    bottom: 0;
    right: 0;
    border-bottom: 2px solid #00FEFF;
    border-right: 2px solid #00FEFF;
}
.chart-tools-wrapper {
  position: absolute;
  top: 12px;
  right: 12px;
  z-index: 99;
    position: absolute;
    top: 12px;
    right: 12px;
    z-index: 99;
}
#allGraph {
  position: absolute;
  top: -1000px;
  left: 0;
  width: 600px;
  height: 400px;
    position: absolute;
    top: -1000px;
    left: 0;
    width: 600px;
    height: 400px;
}
.chart-contain {
  width: 100%;
  height: 100%;
  background-color: #FFFFFF;
    width: 100%;
    height: 100%;
    background-color: #FFFFFF;
}
.chart {
  width: 100%;
  height: 100%;
    width: 100%;
    height: 100%;
}
</style>
src/pages/dataTest/movingRingSystem/const/getPowerConfigData.js
@@ -4,6 +4,7 @@
        moduleCap: 0,
        moduleInUseCount: 16,
        moduleSlotCount: 16,
        usePurpose: '没意图',
    };
    let ac = {
        powerDeviceId: 0,
src/pages/dataTest/movingRingSystem/dialog/acConfig.vue
@@ -23,6 +23,30 @@
                        </el-input>
                    </el-form-item>
                </el-col>
                <el-col :span="layout.span">
                    <el-form-item label="交流母线输入开关个数" prop="inputSWCount">
                        <el-input
                            placeholder="请输入交流母线输出开关个数"
                            v-model="params.inputSWCount">
                        </el-input>
                    </el-form-item>
                </el-col>
                <el-col :span="layout.span">
                    <el-form-item label="容量" prop="cap">
                        <el-input
                            placeholder="请输入容量"
                            v-model="params.cap">
                        </el-input>
                    </el-form-item>
                </el-col>
                <el-col :span="layout.span">
                    <el-form-item label="用途" prop="usePurpose">
                        <el-input
                            placeholder="请输入用途"
                            v-model="params.usePurpose">
                        </el-input>
                    </el-form-item>
                </el-col>
            </el-row>
            <div class="form-footer">
                <three-btn @click="validData">确定</three-btn>
@@ -83,9 +107,18 @@
                usePurpose: '没意图',
            },
            rules: {
                inputSWCount: [
                    {required: true, message: '请输入交流母线输入开关个数', trigger: 'change'},
                ],
                outputSWCount: [
                    {required: true, message: '请输入交流母线输出开关个数', trigger: 'change'},
                ]
                ],
                cap: [
                    {required: true, message: '请输入容量', trigger: 'change'},
                ],
                usePurpose: [
                    {required: true, message: '请输入用途', trigger: 'change'},
                ],
            },
        }
    },
src/pages/dataTest/movingRingSystem/dialog/acDcConfig.vue
@@ -35,7 +35,7 @@
                    <el-form-item label="模块容量(AH)" prop="moduleCap">
                        <el-input
                            placeholder="请输入模块容量"
                            v-model="params.moduleSlotCount">
                            v-model="params.moduleCap">
                        </el-input>
                    </el-form-item>
                </el-col>
src/pages/dataTest/movingRingSystem/dialog/dcConfig.vue
@@ -18,8 +18,32 @@
                <el-col :span="layout.span">
                    <el-form-item label="直流开关路数" prop="outputSWCount">
                        <el-input
                            placeholder="请输入直流开关路数"
                            placeholder="请输入直流开关输出路数"
                            v-model="params.outputSWCount">
                        </el-input>
                    </el-form-item>
                </el-col>
                <el-col :span="layout.span">
                    <el-form-item label="直流开关路数" prop="inputSWCount">
                        <el-input
                            placeholder="请输入直流开关输入路数"
                            v-model="params.inputSWCount">
                        </el-input>
                    </el-form-item>
                </el-col>
                <el-col :span="layout.span">
                    <el-form-item label="容量" prop="cap">
                        <el-input
                            placeholder="请输入容量"
                            v-model="params.cap">
                        </el-input>
                    </el-form-item>
                </el-col>
                <el-col :span="layout.span">
                    <el-form-item label="用途" prop="usePurpose">
                        <el-input
                            placeholder="请输入用途"
                            v-model="params.usePurpose">
                        </el-input>
                    </el-form-item>
                </el-col>
@@ -83,9 +107,18 @@
                usePurpose: '没意图',
            },
            rules: {
                inputSWCount: [
                    {required: true, message: '请输入直流开关输入路数', trigger: 'change'},
                ],
                outputSWCount: [
                    {required: true, message: '请输入交流母线输出开关个数', trigger: 'change'},
                ]
                ],
                cap: [
                    {required: true, message: '请输入容量', trigger: 'change'},
                ],
                usePurpose: [
                    {required: true, message: '请输入用途', trigger: 'change'},
                ],
            },
        }
    },
src/pages/dataTest/movingRingSystem/powerBox.vue
@@ -2,6 +2,20 @@
    <flex-layout direction="row" class="page-real-time" :no-bg="true">
        <content-box style="margin-left: 4px; margin-right: 4px;" :title="battFullName">
            <div class="flex-page-content">
                <div class="page-content-tools">
                    <div>
                        <el-row :gutter="8">
                            <el-col :span="16" class="status-text">
                                通讯状态:
                            </el-col>
                            <el-col :span="8">
                                <hdw-light :type="allSignal"></hdw-light>
                            </el-col>
                        </el-row>
                    </div>
                </div>
                <el-tabs type="border-card" class="flex-layout noborder top-border" v-model="acTabs" @tab-click="tabsChange">
                    <el-tab-pane label="交流配电柜遥测量" name="acData">
                        <div class="full-height">
@@ -61,7 +75,8 @@
                        </div>
                    </el-tab-pane>
                    <el-tab-pane label="交流配电柜遥信量" name="acSignalData">
                        <power-box-component title="交流配电柜遥信量" :data="acSignalData" :length="6">
                        <power-box-component title="交流配电柜遥测量" :data="acData" :length="1"></power-box-component>
                        <power-box-component title="交流配电柜遥信量" :data="acSignalData" :length="4">
                            <div slot="tools">
                                <i class="box-tools el-icon-s-tools" @click="acDialog=true"></i>
                            </div>
@@ -141,7 +156,8 @@
                        </div>
                    </el-tab-pane>
                    <el-tab-pane label="高频开关电源柜遥信量" name="acDcSignalData">
                        <power-box-component title="高频开关电源柜遥信量" :data="acDcSignalData" :length="6">
                        <power-box-component title="高频开关电源柜遥测量" :data="acDcData" :length="1"></power-box-component>
                        <power-box-component title="高频开关电源柜遥信量" :data="acDcSignalData" :length="4">
                            <div slot="tools">
                                <i class="box-tools el-icon-s-tools" @click="acDcDialog=true"></i>
                            </div>
@@ -197,7 +213,8 @@
                        </div>
                    </el-tab-pane>
                    <el-tab-pane label="直流配电柜遥信量" name="dcSignalData">
                        <power-box-component title="直流配电柜遥信量" :data="dcSignalData" :length="6">
                        <power-box-component title="直流配电柜遥测量" :data="dcData" :length="1"></power-box-component>
                        <power-box-component title="直流配电柜遥信量" :data="dcSignalData" :length="4">
                            <div slot="tools">
                                <i class="box-tools el-icon-s-tools" @click="dcDialog=true"></i>
                            </div>
@@ -273,9 +290,11 @@
import getYMax from "@/components/chart/js/getYMax";
import getItemByKey from "@/assets/js/tools/getItemByKey";
import ChartTypeConfig from "@/pages/dataTest/movingRingSystem/dialog/chartTypeConfig";
import HdwLight from "@/pages/dataMager/components/HdwLight";
export default {
    name: "powerBox",
    components: {
        HdwLight,
        ChartTypeConfig,
        FlexBox,
        DcConfig,
@@ -354,6 +373,7 @@
            },
            timer: new Timeout(),
            acTabs: "acData",
            allSignal: -1,
            batt: {},
            powerData: {
                info: {
@@ -432,6 +452,7 @@
                        moduleCap: data.moduleCap,
                        moduleInUseCount: data.moduleInUseCount,
                        moduleSlotCount: data.moduleSlotCount,
                        usePurpose: data.usePurpose,
                    };
                }else {
                    this.configs.acDc = getPowerConfigData('acDc');
@@ -620,14 +641,32 @@
            this.$apis.dataMager.powerMager.getPowerBoxData(id).then(res=>{
                let rs = JSON.parse(res.data.result);
                if(rs.code == 1) {
                    this.allSignal = 0;
                    let data = rs.data;
                    this.setAcInfo(data.ac);
                    this.setAcDcInfo(data.acdc);
                    this.setDcInfo(data.dc);
                    // 交流
                    if(data.ac.commStatus) {
                        this.setAcInfo(data.ac);
                    }else {
                        this.setAcInfo({});
                    }
                    // 高频
                    if(data.acdc.commStatus) {
                        this.setAcDcInfo(data.acdc);
                    }else {
                        this.setAcDcInfo({});
                    }
                    // 直流
                    if(data.dc.commStatus) {
                        this.setDcInfo(data.dc);
                    }else {
                        this.setDcInfo({});
                    }
                }else {
                    this.setAcInfo({});
                    this.setAcDcInfo({});
                    this.setDcInfo({});
                    this.allSignal = 1;
                }
            }).catch(error=>{
@@ -636,11 +675,14 @@
        },
        setAcInfo(data) {       // 设置交流配电柜的值
            let acTabs = this.acTabs;
            if(acTabs == "acData") {
            if(acTabs == "acData" || acTabs == "acSignalData") {
                this.acData.map(item=>{
                    item.value = getValByKey(item.key, data, "???");
                });
                this.setAcChart(this.acData);
                if(acTabs == "acData") {
                    this.setAcChart(this.acData);
                }
            }
            if(acTabs == "acSignalData") {
@@ -651,11 +693,15 @@
        },
        setAcDcInfo(data) {     // 设置高频开关电源柜的值
            let acTabs = this.acTabs;
            if(acTabs == "acDcData") {
            if(acTabs == "acDcData" || acTabs == "acDcSignalData") {
                this.acDcData.map(item=>{
                    item.value = getValByKey(item.key, data, "???");
                });
                this.setAcDcChart(this.acDcData);
                if(acTabs == "acDcData") {
                    this.setAcDcChart(this.acDcData);
                }
            }
            if(acTabs == "acDcSignalData") {
                this.acDcSignalData.map(item=>{
@@ -665,11 +711,14 @@
        },
        setDcInfo(data) {       // 设置直流配电柜的值
            let acTabs = this.acTabs;
            if(acTabs == "dcData") {
            if(acTabs == "dcData" || acTabs == "dcSignalData") {
                this.dcData.map(item=>{
                    item.value = getValByKey(item.key, data, "???");
                });
                this.setDcChart(this.dcData);
                if(acTabs == "dcData") {
                    this.setDcChart(this.dcData);
                }
            }
            if(acTabs == "dcSignalData") {
                this.dcSignalData.map(item=>{
@@ -1001,4 +1050,15 @@
.flex-box-tools-icon:active {
    color: #FF0000;
}
.page-content-tools {
    position: absolute;
    top: 12px;
    right: 12px;
    z-index: 99;
}
.status-text {
    line-height: 32px;
    white-space: nowrap;
    font-size: 14px;
}
</style>