<template>
<div class="mod-config">
<el-form :inline="true" :model="dataForm" ref="dataForm" @keyup.enter.native="onSubmit(0)">
<el-form-item label="项目" prop="projectId" v-if="projectIdShow" style="margin-left: 0.05rem;">
<el-select v-model="dataForm.projectId" placeholder="请选择项目" >
<el-option
v-for="item in projectIds"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="电池编码" prop="deviceId">
<!-- <el-input v-model="dataForm.deviceId" placeholder="设备编号" clearable></el-input> -->
<el-autocomplete style="width:3.3rem" size="normal" v-model="dataForm.deviceId" :popper-append-to-body="false"
:fetch-suggestions="querySearchAsync" @select="handleSelect"
placeholder="电池编码,如U231221040200001">
</el-autocomplete>
</el-form-item>
<el-form-item label="数据来源" prop="flag">
<el-select v-model="dataForm.flag" placeholder="请选择" clearable>
<el-option
v-for="item in flagIds"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="上报时间">
<el-date-picker
v-model="dataForm.starttime"
type="datetime"
placeholder="选择起始时间"
align="right"
:picker-options="pickerOptions" clearable>
</el-date-picker>
至
<el-date-picker
v-model="dataForm.endtime"
type="datetime"
placeholder="选择结束时间"
default-time="00:00:00" clearable>
</el-date-picker>
</el-form-item>
<el-form-item label="SN码" prop="sn">
<el-input v-model="dataForm.sn" placeholder="输入sn码" clearable></el-input>
</el-form-item>
<el-form-item>
<el-input v-model="dataForm.key" placeholder="其他参数名" clearable></el-input>
</el-form-item>
</el-form-item>
<el-form-item label="电池类型" style="margin-left: 0.25rem;">
<el-select v-model="dataForm.batteryKind" placeholder="电池类型" clearable style="width:1.5rem">
<el-option
v-for="item in batteryKindOptions"
:key="item.value"
:label="item.label"
:value="item.value"
:disabled="item.disabled">
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="onSubmit(0)" type="success" icon="el-icon-search">查询</el-button>
<el-button @click="reset()" type="primary" icon="el-icon-refresh">重置</el-button>
<!-- <el-button v-if="isAuth('maya:mybatteryinfolastest:save')" type="primary" @click="addOrUpdateHandle()">新增</el-button> -->
<el-button v-if="isAuth('maya:mybatteryinfolastest:delete')" type="danger" @click="deleteHandle()" :disabled="dataListSelections.length <= 0">批量删除</el-button>
<el-button v-if="isAuth('maya:mybatteryinfolastest:list')" type="info" @click="list2Export()">导出</el-button>
</el-form-item>
</el-form>
<el-table
:height="tableHeight"
:data="dataList"
border
v-loading="dataListLoading"
@selection-change="selectionChangeHandle"
style="width: 100%;">
<el-table-column
type="selection"
header-align="center"
align="center"
width="50">
</el-table-column>
<!-- <el-table-column
prop="id"
header-align="center"
align="center"
label="ID">
</el-table-column> -->
<el-table-column
prop="batteryId"
header-align="center"
align="center"
label="电池编码"
width="140">
</el-table-column>
<el-table-column
prop="sn"
header-align="center"
align="center"
label="sn码" show-overflow-tooltip>
</el-table-column>
<el-table-column align="center" prop="batteryKind" label="电池类型">
<template slot-scope="scope">
<el-button
class="custom-size-my"
:stroke-width="5"
:type="getBatteryKindStyle(scope.row.batteryKind)"
size="mini"
round
>
{{ getBatteryKindText(scope.row.batteryKind) }}
</el-button>
</template>
</el-table-column>
<el-table-column
prop="uploadTime"
header-align="center"
align="center"
label="上报时间"
width="140">
</el-table-column>
<el-table-column
prop="batteryVoltage"
header-align="center"
align="center"
label="电压(mV)">
</el-table-column>
<el-table-column
prop="cellVoltage"
header-align="center"
align="center"
label="电芯电压" show-overflow-tooltip>
</el-table-column>
<el-table-column
prop="batteryCurrent"
header-align="center"
align="center"
label="电流(mA)">
</el-table-column>
<el-table-column
prop="batterySoc"
header-align="center"
align="center"
label="SOC(%)">
</el-table-column>
<el-table-column
prop="batteryHardVersion"
header-align="center"
align="center"
label="硬件版本">
</el-table-column>
<el-table-column
prop="batterySoftVersion"
header-align="center"
align="center"
label="软件版本"
width="120">
</el-table-column>
<el-table-column
prop="batteryWorkModeValue"
header-align="center"
align="center"
label="电池状态"
width="140">
</el-table-column>
<el-table-column
prop="batteryProtectCode"
header-align="center"
align="center"
label="保护状态">
</el-table-column>
<el-table-column
prop="batteryErrorCode"
header-align="center"
align="center"
label="电池故障码"
width="100"
show-overflow-tooltip>
</el-table-column>
<el-table-column
prop="batteryTemperatureMax"
header-align="center"
align="center"
label="电芯最高温度(℃)"
width="140">
</el-table-column>
<el-table-column
prop="batteryTemperatureMin"
header-align="center"
align="center"
label="电芯最低温度(℃)"
width="140">
</el-table-column>
<el-table-column
prop="batteryVoltageMax"
header-align="center"
align="center"
label="电芯最高电压"
width="140">
</el-table-column>
<el-table-column
prop="batteryVoltageMin"
header-align="center"
align="center"
label="电芯最低电压"
width="140">
</el-table-column>
<el-table-column
prop="mosStatus"
header-align="center"
align="center"
label="MOS状态">
</el-table-column>
<el-table-column
prop="mosTemp"
header-align="center"
align="center"
label="MOS温度(℃)"
width="100">
</el-table-column>
<el-table-column
prop="batteryCycleTimes"
header-align="center"
align="center"
label="循环次数">
</el-table-column>
<el-table-column
prop="soh"
header-align="center"
align="center"
label="SOH">
</el-table-column>
<el-table-column
prop="batteryTemperatureAvg"
header-align="center"
align="center"
label="平均温度(℃)"
width="100">
</el-table-column>
<el-table-column
prop="chargeMode"
header-align="center"
align="center"
label="充电模式"
:formatter = "chargeModeFormat" >
</el-table-column>
<el-table-column
prop="lowBatteryWarn"
header-align="center"
align="center"
label="低电量提示"
width="100"
:formatter = "lowBatteryWarnFormat" >
</el-table-column>
<el-table-column
prop="chargeCurrentMax"
header-align="center"
align="center"
label="最大充电电流(mA)"
width="140">
</el-table-column>
<el-table-column
prop="dischargeCurrentMax"
header-align="center"
align="center"
label="最大放电电流(mA)"
width="140">
</el-table-column>
<el-table-column
prop="chargeCurrentAvg"
header-align="center"
align="center"
label="平均充电电流(mA)"
width="140">
</el-table-column>
<el-table-column
prop="dischargeCurrentAvg"
header-align="center"
align="center"
label="平均放电电流(mA)"
width="140">
</el-table-column>
<el-table-column
prop="steadyStatus"
header-align="center"
align="center"
label="均衡状态">
</el-table-column>
<!-- <el-table-column
prop="model"
header-align="center"
align="center"
label="设备型号">
</el-table-column>
<el-table-column
prop="manufacture"
header-align="center"
align="center"
label="设备厂家">
</el-table-column> -->
<el-table-column
prop="imei"
header-align="center"
align="center"
label="IMEI"
width="150">
</el-table-column>
<el-table-column
prop="imsi"
header-align="center"
align="center"
label="IMSI"
width="150">
</el-table-column>
<el-table-column
prop="iccid"
header-align="center"
align="center"
label="ICCID"
width="160">
</el-table-column>
<!-- <el-table-column
prop="trackerHardwareVersion"
header-align="center"
align="center"
label="tracker硬件版本">
</el-table-column> -->
<el-table-column
prop="trackerSoftwareVersion"
header-align="center"
align="center"
label="tracker软件版本"
width="200">
</el-table-column>
<!-- <el-table-column
prop="csq"
header-align="center"
align="center"
label="CSQ">
</el-table-column>
<el-table-column
prop="networkType"
header-align="center"
align="center"
label="网络制式">
</el-table-column> -->
<el-table-column
prop="locationMode"
header-align="center"
align="center"
label="定位模式">
</el-table-column>
<el-table-column
prop="longitude"
header-align="center"
align="center"
label="经度"
width="150">
</el-table-column>
<el-table-column
prop="longitudeDirection"
header-align="center"
align="center"
label="经度方向">
</el-table-column>
<el-table-column
prop="latitude"
header-align="center"
align="center"
label="纬度"
width="150">
</el-table-column>
<el-table-column
prop="latitudeDirection"
header-align="center"
align="center"
label="纬度方向">
</el-table-column>
<el-table-column
prop="gpsCog"
header-align="center"
align="center"
label="对地航向角(°)"
width="120">
</el-table-column>
<el-table-column
prop="gpsSpeed"
header-align="center"
align="center"
label="gps速度(Km/h)"
width="120">
</el-table-column>
<el-table-column
prop="gpsSignal"
header-align="center"
align="center"
label="gps信号强度"
width="120">
</el-table-column>
<el-table-column
prop="satelliteNum"
header-align="center"
align="center"
label="定位卫星数"
width="100">
</el-table-column>
<!-- <el-table-column
prop="accuracy"
header-align="center"
align="center"
label="定位精度">
</el-table-column> -->
<el-table-column
prop="flag"
header-align="center"
align="center"
label="数据来源"
:formatter = "flagFormat">
</el-table-column>
<!-- <el-table-column
prop="businessmode"
header-align="center"
align="center"
label="业务模式">
</el-table-column> -->
<el-table-column
prop="createTime"
header-align="center"
align="center"
label="创建时间"
width="140">
</el-table-column>
<el-table-column
prop="updateTime"
header-align="center"
align="center"
label="更新时间"
width="140">
</el-table-column>
<el-table-column
fixed="right"
header-align="center"
align="center"
width="150"
label="操作">
<template slot-scope="scope">
<el-button v-if="isAuth('maya:mybatteryinfolastest:update')" type="text" size="small" @click="addOrUpdateHandle(scope.row.id)">修改</el-button>
<el-button v-if="isAuth('maya:mybatteryinfolastest:delete')" type="text" size="small" @click="deleteHandle(scope.row.id)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
@size-change="sizeChangeHandle"
@current-change="currentChangeHandle"
:current-page="pageIndex"
:page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"
:total="totalPage"
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
<!-- 弹窗, 新增 / 修改 -->
<add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList"></add-or-update>
</div>
</template>
<script>
import AddOrUpdate from './mybatteryinfolastest-add-or-update'
import { debounce } from '@/utils' // 表格滚动
export default {
data () {
return {
clientHeight: document.documentElement.clientHeight,
tableHeight:640,// 定义table高度
// 1:设备主动请求或上报 2:平台主动推送或下指令 3:平台指令反馈的结果
flagIds:[ {
value: '1',
label: '设备主动请求或上报'
},
// {
// value: '2',
// label: '平台主动推送或下指令'
// },
{
value: '3',
label: '平台指令反馈的结果'
}],
batteryKindOptions: [
{
value: '0',
label: '运营'
},{
value: '1',
label: '售后'
},{
value: '2',
label: '内测'
},{
value: '3',
label: '报废'
}],
dataForm: {
sn: '',
starttime: '',
endtime: '',
batteryKind: '',
flag: '',
deviceId: '',
key: '',
projectId: ''
},
projectIdShow: true,
snExportShow: false,
projectIds:[],
dataList: [],
pageIndex: 1,
pageSize: 10,
totalPage: 0,
dataListLoading: false,
dataListSelections: [],
addOrUpdateVisible: false,
updateVisible: false,
resultShowVisible: false,
pickerOptions: {
shortcuts: [{
text: '今天',
onClick(picker) {
picker.$emit('pick', new Date());
}
}, {
text: '昨天',
onClick(picker) {
const date = new Date();
date.setTime(date.getTime() - 3600 * 1000 * 24);
picker.$emit('pick', date);
}
}, {
text: '一周前',
onClick(picker) {
const date = new Date();
date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
picker.$emit('pick', date);
}
}, {
text: '一个月前',
onClick(picker) {
const date = new Date();
date.setTime(date.getTime() - 3600 * 1000 * 24 * 30);
picker.$emit('pick', date);
}
}, {
text: '三个月前',
onClick(picker) {
const date = new Date();
date.setTime(date.getTime() - 3600 * 1000 * 24 * 90);
picker.$emit('pick', date);
}
}]
}
}
},
components: {
AddOrUpdate
},
activated () {
this.getQueryMenus()
this.getDataList()
},
methods: {
getQueryMenus () {
this.$http({
url: this.$http.adornUrl(`/battery/bmsbatteryinfo/getmenus`),
method: 'get',
params: this.$http.adornParams()
}).then(({data}) => {
if (data && data.code === 0) {
// this.provices = data.data.provices
// this.sysStatuses = data.data.sysStatuses
// this.alarmStatuses = data.data.alarmStatuses
if(data.data.projectPerm===1){
this.dataForm.projectId = data.data.projectPermData //data.data.projectPerm
this.projectIdShow = false
// 这里只为马牙项目设置了导出功能,项目ID==38
if(data.data.projectPermData === 38 || data.data.projectPermData==='38'
|| data.data.projectPermData === 39 || data.data.projectPermData==='39'
|| data.data.projectPermData === 40 || data.data.projectPermData==='40'){
this.snExportShow = true
}else{
this.snExportShow = false
}
}else{
this.dataForm.projectId = data.data.projectPermData //data.data.projectPerm
this.projectIds = data.data.projectIds
this.projectIdShow = true
// 这里只为马牙项目设置了导出功能,项目ID==38
if(data.data.projectPermData === 38 || data.data.projectPermData==='38'
|| data.data.projectPermData === 39 || data.data.projectPermData==='39'
|| data.data.projectPermData === 40 || data.data.projectPermData==='40'){
this.snExportShow = true
}else{
this.snExportShow = false
}
}
if(this.dataForm.projectId === '' || this.dataForm.projectId === undefined || this.dataForm.projectId === null){
this.dataForm.projectId = 38;
this.snExportShow = true
}
// this.customIds = data.data.customIds
}
})
},
// 充电模式 1--标准充;2--快充;3--盲充;
chargeModeFormat (row, column) {
console.log(row.chargeMode)
if (row.chargeMode === 1) {
return '标准充'
} else if (row.chargeMode === 2) {
return '快充'
}else if (row.chargeMode === 3) {
return '盲充'
}else{
return '未知'
}
},
lowBatteryWarnFormat (row, column) {
console.log(row.lowBatteryWarn)
if (row.lowBatteryWarn === 1) {
return '告警'
} else{
return '否'
}
},
flagFormat (row, column) {
console.log(row.flag)
if (row.flag === 1) {
return '设备上报'
} else if (row.flag === 2) {
return '平台指令'
}
},
reset(){
this.dataForm = {
key: undefined,
deviceId: undefined,
starttime: undefined,
endtime: undefined,
flag: undefined,
projectId: undefined,
};
this.$refs["dataForm"].resetFields();
this.onSubmit(0)
},
querySearchAsync(queryString, cb) {
clearTimeout(1000);
var results = []
// alert('queryString='+queryString)
if (queryString == '') {
cb(results);
} else {
//掉接口需要的参数
this.$http({
url: this.$http.adornUrl('/mqtt/mqtttriad/getDeviceIds'),
method: 'get',
params: this.$http.adornParams({
'deviceId': queryString,
'projectParameter': this.dataForm.projectParameter
})
}).then(({data}) => {
if (data && data.code === 0) {
// alert(data.data.length)
var result = data.data
//循环放到一个远程搜索需要的数组
for (let i = 0; i < result.length; i++) {
const element = result[i];
// alert(element)
results.push({
value: element,
id: i
})
}
cb(results);
} else {
console.log('没有数据的显示')
results = []
cb(results);
}
})
}
},
//点击出现搜索后点击的每一项
handleSelect(item) {
this.id = item.id
this.name = item.value
},
onSubmit(pgindex) {
//alert("刷新一下")
// 添加参数判断,防止总是跳到第一页
if (pgindex==1) {
// alert(pgindex);
this.getDataList()
}else{
// alert(pgindex);
this.pageIndex = 1
this.getDataList()
}
},
formatJson(filterVal, jsonData) {
return jsonData.map(v => filterVal.map(j => v[j]))
},
// 导出当前列表
list2Export() {
this.$confirm(`确定对数据进行导出操作?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$http({
url: this.$http.adornUrl('/maya/mybatteryinfolastest/list2Export'),
method: 'get',
params: this.$http.adornParams({
'key': this.dataForm.key,
'deviceId': this.dataForm.deviceId,
'starttime': this.dataForm.starttime,
'endtime': this.dataForm.endtime,
'sn': this.dataForm.sn,
'flag': this.dataForm.flag,
'projectId': this.dataForm.projectId
})
}).then(({data}) => {
if (data && data.code === 0) {
this.exportList = data.data
require.ensure([], () => {
const { export_json_to_excel } = require('../../../vendor/Export2Excel')
// const tHeader = ['ID','设备ID','IMEI','ICCID','IMSI','CSQ','经度标识','经度','纬度标识','纬度','GPS行驶速度(km/h)','BMS软件版本号','tracker软件版本','信号强度','GPS定位卫星数','SOC(%)','循环次数','温度最高(电芯℃)','温度最低(电芯℃)','均衡状态','MOS温度(℃)','MOS状态','电池整包电压(mV)','电压最高(单节电芯mV)','电压最低(单节电芯mV)','全电芯电压(mV)','电池包状态','电流(mA)','上传时间','保护状态码','原始数据','故障码','入库时间','更新时间'];
// const filterVal = ['id','batteryId','imei','iccid','imsi','csq','longitudeDirection','longitude','latitudeDirection','latitude','gpsSpeed','batterySoftVersion','trackerSoftwareVersion','gpsSignal','satelliteNum','batterySoc','batteryCycleTimes','batteryTemperatureMax','batteryTemperatureMin','steadyStatus','mosTemp','mosStatus','batteryVoltage','batteryVoltageMax','batteryVoltageMin','cellVoltage','batteryWorkMode','batteryCurrent','uploadTime','batteryProtectCode','payload','batteryErrorCode','createTime','updateTime'];
const tHeader = ['ID','设备ID','SN码','项目ID','IMEI','ICCID','IMSI','CSQ','经度标识','经度','纬度标识','纬度','GPS行驶速度(km/h)','对地航向角(°)','BMS软件版本号','tracker软件版本','信号强度','GPS定位卫星数','SOC(%)','循环次数','温度最高(电芯℃)','温度最低(电芯℃)','均衡状态','MOS温度(℃)','MOS状态','电池整包电压(mV)','电压最高(单节电芯mV)','电压最低(单节电芯mV)','全电芯电压(mV)','电池包状态','电流(mA)','上传时间','保护状态码','故障码','SOH','平均温度','充电模式(1标准充2快充3盲充)','低电量提示','最大充电电流','最大放电电流','平均充电电流','平均放电电流','入库时间','更新时间'];
const filterVal = ['id','batteryId','sn','projectId','imei','iccid','imsi','csq','longitudeDirection','longitude','latitudeDirection','latitude','gpsSpeed','gpsCog','batterySoftVersion','trackerSoftwareVersion','gpsSignal','satelliteNum','batterySoc','batteryCycleTimes','batteryTemperatureMax','batteryTemperatureMin','steadyStatus','mosTemp','mosStatus','batteryVoltage','batteryVoltageMax','batteryVoltageMin','cellVoltage','batteryWorkMode','batteryCurrent','uploadTime','batteryProtectCode','batteryErrorCode','soh','batteryTemperatureAvg','chargeMode','lowBatteryWarn','chargeCurrentMax','dischargeCurrentMax','chargeCurrentAvg','dischargeCurrentAvg','createTime','updateTime'];
const list = this.exportList;
const data = this.formatJson(filterVal,list);
export_json_to_excel(tHeader, data, '马牙电池最新数据导出-('+this.dataForm.key+'_'+this.dataForm.starttime+'-'+this.dataForm.endtime+')');
})
} else {
this.$message.error(data.msg)
}
})
})
},
// 获取数据列表
getDataList () {
this.dataListLoading = true
this.$http({
url: this.$http.adornUrl('/maya/mybatteryinfolastest/list'),
method: 'get',
params: this.$http.adornParams({
'page': this.pageIndex,
'limit': this.pageSize,
'key': this.dataForm.key,
'deviceId': this.dataForm.deviceId,
'starttime': this.dataForm.starttime,
'endtime': this.dataForm.endtime,
'sn': this.dataForm.sn,
'batteryKind': this.dataForm.batteryKind,
'flag': this.dataForm.flag,
'projectId': this.dataForm.projectId
})
}).then(({data}) => {
if (data && data.code === 0) {
this.dataList = data.page.list
this.totalPage = data.page.totalCount
} else {
this.dataList = []
this.totalPage = 0
}
this.dataListLoading = false
})
},
// 每页数
sizeChangeHandle (val) {
this.pageSize = val
this.pageIndex = 1
this.getDataList()
},
// 当前页
currentChangeHandle (val) {
this.pageIndex = val
this.getDataList()
},
// 多选
selectionChangeHandle (val) {
this.dataListSelections = val
},
// 新增 / 修改
addOrUpdateHandle (id) {
this.addOrUpdateVisible = true
this.$nextTick(() => {
this.$refs.addOrUpdate.init(id)
})
},
getBatteryKindStyle(kind) {
const styleMap = {
0: 'success',
1: 'warning',
2: 'primary',
3: 'danger'
};
return styleMap[kind] || 'info';
},
getBatteryKindText(kind) {
const map = {
0: '运营',
1: '售后',
2: '内测',
3: '报废'
};
return map[kind] || '未知类型';
},
// 删除
deleteHandle (id) {
var ids = id ? [id] : this.dataListSelections.map(item => {
return item.id
})
this.$confirm(`确定对[id=${ids.join(',')}]进行[${id ? '删除' : '批量删除'}]操作?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$http({
url: this.$http.adornUrl('/maya/mybatteryinfolastest/delete'),
method: 'post',
data: this.$http.adornData(ids, false)
}).then(({data}) => {
if (data && data.code === 0) {
this.$message({
message: '操作成功',
type: 'success',
duration: 1500,
onClose: () => {
this.getDataList()
}
})
} else {
this.$message.error(data.msg)
}
})
})
}
}
}
</script>
新增一个导入excel按钮,以deviceId为第一列,batteryKind为第二列,解析后以map传入后台,excel不需要表头