| | |
| | | <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> |
| | |
| | | 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(); |
| | |
| | | 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> |