<template>
|
<el-form ref="ruleForm" size="mini" label-position="top" :model="params" :rules="rules" class="params-dialog">
|
<el-row :gutter="row.gutter">
|
<el-col :span="18">
|
<el-form-item label="电池组名称">
|
<el-input v-model="otherParams.groupName" readonly></el-input>
|
</el-form-item>
|
</el-col>
|
<el-col :span="6">
|
<el-form-item label="电池组号">
|
<el-select v-model="battGroupNum" @change="battNumChanged" placeholder="请选择">
|
<el-option v-for="item in groupIndexList" :key="'idx_' + item.value" :label="item.label"
|
:value="item.value"></el-option>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-row :gutter="row.gutter">
|
<el-col :span="row.span">
|
<el-form-item label="设备ID">
|
<el-input v-model="otherParams.fbsdeviceId" readonly></el-input>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="电池组信息">
|
<el-input v-model="otherParams.groupInfo" readonly></el-input>
|
</el-form-item>
|
</el-col>
|
<!-- <el-col :span="row.span">
|
<el-form-item label="参数类型">
|
<el-select v-model="params.hvMonUppernum1" :disabled="readOnly" placeholder="请选择">
|
<el-option v-for="item in paramsTypeList" :key="'params_' + item.value" :label="item.label"
|
:value="item.value"></el-option>
|
</el-select>
|
</el-form-item>
|
</el-col> -->
|
<el-col :span="row.span">
|
<el-form-item label="电池管理方式">
|
<el-select v-model="params.onlineVolLowAction" :disabled="readOnly" placeholder="请选择">
|
<el-option v-for="item in battManageList" :key="'battm_' + item.value" :label="item.label"
|
:value="item.value"></el-option>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
<el-col :span="row.span">
|
<el-form-item label="定时均充功能">
|
<el-select v-model="params.offLineYHOnceCycle" :disabled="readOnly" placeholder="请选择">
|
<el-option v-for="item in JCList" :key="'jc_' + item.value" :label="item.label"
|
:value="item.value"></el-option>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
<el-col :span="row.span">
|
<el-form-item label="电池标称容量(50~200AH)" prop="monCapStd">
|
<el-input v-model="params.monCapStd" :readonly="readOnly"></el-input>
|
</el-form-item>
|
</el-col>
|
<el-col :span="row.span">
|
<el-form-item label="电池浮充电压(10~15V)" prop="cprotectvol1">
|
<el-input v-model="params.cprotectvol1" :readonly="readOnly"></el-input>
|
</el-form-item>
|
</el-col>
|
<el-col :span="row.span">
|
<el-form-item label="电池均充电压(10~15V)" prop="cprotectvol2">
|
<el-input v-model="params.cprotectvol2" :readonly="readOnly"></el-input>
|
</el-form-item>
|
</el-col>
|
<el-col :span="row.span">
|
<el-form-item :label="`电池充电限流(${chargeCurrSetRange}A)`" prop="chargeCurrSet">
|
<el-input v-model="params.chargeCurrSet" :readonly="readOnly"></el-input>
|
</el-form-item>
|
</el-col>
|
<el-col :span="row.span">
|
<el-form-item :label="`浮充转均充电流(${flowoverCharcurr1Range}A)`" prop="flowoverCharcurr1">
|
<el-input v-model="params.flowoverCharcurr1" :readonly="readOnly"></el-input>
|
</el-form-item>
|
</el-col>
|
<el-col :span="row.span">
|
<el-form-item :label="`均充转浮充电流(${charSotpCurrRange}A)`" prop="charSotpCurr">
|
<el-input v-model="params.charSotpCurr" :readonly="readOnly"></el-input>
|
</el-form-item>
|
</el-col>
|
<el-col :span="row.span">
|
<el-form-item label="尾电流充电时间(H)">
|
<el-select v-model="params.charTimeLong" :disabled="readOnly" placeholder="请选择">
|
<el-option v-for="item in CharTimeList" :key="'charTime_' + item" :label="item + '(H)'"
|
:value="item"></el-option>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
<el-col :span="row.span">
|
<el-form-item label="定时均充周期(30~180天)" prop="offlineyhCycle">
|
<el-input v-model="params.offlineyhCycle" :readonly="readOnly"></el-input>
|
</el-form-item>
|
</el-col>
|
<el-col :span="row.span">
|
<el-form-item label="最长均充时间(1~30H)" prop="offLineYHTimes">
|
<el-input v-model="params.offLineYHTimes" :readonly="readOnly"></el-input>
|
</el-form-item>
|
</el-col>
|
<el-col :span="row.span">
|
<el-form-item label="温度补偿开关">
|
<el-select v-model="params.hvChargeNum" :disabled="readOnly" placeholder="请选择">
|
<el-option v-for="item in switchTempList" :key="'temp_' + item.value" :label="item.label"
|
:value="item.value"></el-option>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
<el-col :span="row.span">
|
<el-form-item label="电池过温点(20~80℃)" prop="monomertmpHigh">
|
<el-input v-model="params.monomertmpHigh" :readonly="readOnly"></el-input>
|
</el-form-item>
|
</el-col>
|
<el-col :span="row.span">
|
<el-form-item label="电池欠温点(-40~10℃)" prop="flowoverChartime1">
|
<el-input v-model="params.flowoverChartime1" :readonly="readOnly"></el-input>
|
</el-form-item>
|
</el-col>
|
<el-col :span="row.span">
|
<el-form-item label="温补中心点(10~40℃)" prop="flowoverChartime2">
|
<el-input v-model="params.flowoverChartime2" :readonly="readOnly"></el-input>
|
</el-form-item>
|
</el-col>
|
<el-col :span="row.span">
|
<el-form-item label="温补系数(0~50mV/℃)" prop="flowoverChartime3">
|
<el-input v-model="params.flowoverChartime3" :readonly="readOnly"></el-input>
|
</el-form-item>
|
</el-col>
|
<el-col :span="row.span">
|
<el-form-item label="电池放电终止电压(10~50V)" prop="groupvolLow">
|
<el-input v-model="params.groupvolLow" :readonly="readOnly"></el-input>
|
</el-form-item>
|
</el-col>
|
<el-col :span="row.span">
|
<el-form-item label="单节放电终止电压(1.6~2V)" prop="monomervolLow">
|
<el-input v-model="params.monomervolLow" :readonly="readOnly"></el-input>
|
</el-form-item>
|
</el-col>
|
<el-col :span="row.span">
|
<el-form-item label="本地远程设置">
|
<el-select v-model="params.onlineTestFlag" :disabled="readOnly" placeholder="请选择">
|
<el-option v-for="item in OnlineTestFlagList" :key="'OnlineTestFlag_' + item.value" :label="item.label"
|
:value="item.value"></el-option>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
<el-col :span="row.span">
|
<el-form-item label="电池充电控制">
|
<el-select v-model="params.charWaitTime" :disabled="readOnly" placeholder="请选择">
|
<el-option v-for="item in CharWaitTimeList" :key="'CharWaitTime_' + item.value" :label="item.label"
|
:value="item.value"></el-option>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
<el-col :span="row.span">
|
<el-form-item label="电池放电控制">
|
<el-select v-model="params.disWaitTime" :disabled="readOnly" placeholder="请选择">
|
<el-option v-for="item in DisWaitTimeList" :key="'DisWaitTime_' + item.value" :label="item.label"
|
:value="item.value"></el-option>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
<el-col :span="row.span">
|
<el-form-item :label="`核容限流(${disCurrRange}A)`" prop="disCurr">
|
<el-input v-model="params.disCurr" :readonly="readOnly"></el-input>
|
</el-form-item>
|
</el-col>
|
<el-col :span="row.span">
|
<el-form-item label="核容时限(0~20H)" prop="disTime">
|
<el-input v-model="params.disTime" :readonly="readOnly"></el-input>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<div class="form-footer">
|
<!-- <three-btn>清除告警</three-btn> -->
|
<template v-if="!readOnly">
|
<three-btn :class="{ disabled: canStartAll }" @click="startTestCheck(255)">启动全部</three-btn>
|
<three-btn :disabled="!startTestFlag" @click="startTestCheck(battGroupNum)">启动{{ battLabel }}</three-btn>
|
<three-btn @click="getParams(true)">读取</three-btn>
|
<three-btn :disabled="!setTestFlag" @click="submitFrom">设定</three-btn>
|
</template>
|
<three-btn @click="$emit('close')">关闭</three-btn>
|
</div>
|
<el-dialog title="人脸校验" width="480px" :visible.sync="setFaceShow" :close-on-click-modal="false" top="0" :modal="false"
|
class="dialog-center" :modal-append-to-body="false" :destroy-on-close="true">
|
<check-face v-if="setFaceShow" @checkSuccess="setFaceSuccess"></check-face>
|
</el-dialog>
|
<el-dialog title="人脸校验" width="480px" :visible.sync="startFaceShow" :close-on-click-modal="false" top="0"
|
:modal="false" class="dialog-center" :modal-append-to-body="false" :destroy-on-close="true">
|
<check-face v-if="startFaceShow" @checkSuccess="startFaceSuccess"></check-face>
|
</el-dialog>
|
</el-form>
|
</template>
|
|
<script>
|
import { testVal } from "@/assets/js/tools";
|
import const_9141 from "@/assets/js/const/const_9141";
|
import config from "@/assets/js/config";
|
import checkFace from "@/components/checkFace";
|
import {
|
updateParalleParam as setParams,
|
searchParalleParam as getParams,
|
controllerParalle as start,
|
} from "../js/realTime";
|
import { checkUserPwd } from "@/views/login/js/api";
|
import toFixed from "@/assets/js/tools/toFixed";
|
|
const rules = const_9141.dischargeRules;
|
|
export default {
|
name: "BtsDischargeParams",
|
components: {
|
checkFace,
|
},
|
props: {
|
batt: {
|
type: Object,
|
default() {
|
return {};
|
},
|
},
|
// 只读模式 显示参数用
|
readOnly: {
|
type: Boolean,
|
default: false
|
},
|
paramData: {
|
type: Object,
|
default() {
|
return {}
|
}
|
},
|
type: {
|
type: String,
|
default: 'charge'
|
},
|
},
|
data() {
|
let {
|
cmd,
|
testCmd,
|
dischargeRules: rules,
|
CharWaitTimeList,
|
DisWaitTimeList,
|
OnlineTestFlagList,
|
switchTempList,
|
CharTimeList,
|
JCList,
|
paramsTypeList,
|
battManageList,
|
groupIndexList,
|
getInitParams,
|
} = const_9141;
|
return {
|
row: {
|
gutter: 16,
|
span: 6,
|
},
|
cacheParams: {
|
0: null,
|
1: null,
|
2: null,
|
3: null
|
},
|
startNum: 0,
|
battGroupNum: 0,
|
CharWaitTimeList,
|
DisWaitTimeList,
|
OnlineTestFlagList,
|
switchTempList,
|
CharTimeList,
|
JCList,
|
paramsTypeList,
|
battManageList,
|
setFaceShow: false,
|
startFaceShow: false,
|
cmd: cmd, // 操作命令
|
testCmd,
|
startTestFlag: false, // 启动测试的状态
|
setTestFlag: false, // 设置参数的状态
|
params: getInitParams(),
|
groupIndexList,
|
rules: {
|
monCapStd: [
|
{
|
validator(rule, value, callback) {
|
testVal(rule, value, callback, rules.monCapStd);
|
},
|
trigger: "change",
|
},
|
],
|
cprotectvol1: [
|
{
|
validator(rule, value, callback) {
|
testVal(rule, value, callback, rules.cprotectvol1);
|
},
|
trigger: "change",
|
},
|
],
|
cprotectvol2: [
|
{
|
validator(rule, value, callback) {
|
testVal(rule, value, callback, rules.cprotectvol2);
|
},
|
trigger: "change",
|
},
|
],
|
chargeCurrSet: [
|
{
|
validator(rule, value, callback) {
|
testVal(rule, value, callback, rules.chargeCurrSet);
|
},
|
trigger: "change",
|
},
|
],
|
flowoverCharcurr1: [
|
{
|
validator(rule, value, callback) {
|
testVal(rule, value, callback, rules.flowoverCharcurr1);
|
},
|
trigger: "change",
|
},
|
],
|
charSotpCurr: [
|
{
|
validator(rule, value, callback) {
|
testVal(rule, value, callback, rules.charSotpCurr);
|
},
|
trigger: "change",
|
},
|
],
|
offlineyhCycle: [
|
{
|
validator(rule, value, callback) {
|
testVal(rule, value, callback, rules.offlineyhCycle);
|
},
|
trigger: "change",
|
},
|
],
|
offLineYHTimes: [
|
{
|
validator(rule, value, callback) {
|
testVal(rule, value, callback, rules.offLineYHTimes);
|
},
|
trigger: "change",
|
},
|
],
|
monomertmpHigh: [
|
{
|
validator(rule, value, callback) {
|
testVal(rule, value, callback, rules.monomertmpHigh);
|
},
|
trigger: "change",
|
},
|
],
|
flowoverChartime1: [
|
{
|
validator(rule, value, callback) {
|
testVal(rule, value, callback, rules.flowoverChartime1);
|
},
|
trigger: "change",
|
},
|
],
|
flowoverChartime2: [
|
{
|
validator(rule, value, callback) {
|
testVal(rule, value, callback, rules.flowoverChartime2);
|
},
|
trigger: "change",
|
},
|
],
|
flowoverChartime3: [
|
{
|
validator(rule, value, callback) {
|
testVal(rule, value, callback, rules.flowoverChartime3);
|
},
|
trigger: "change",
|
},
|
],
|
groupvolLow: [
|
{
|
validator(rule, value, callback) {
|
testVal(rule, value, callback, rules.groupvolLow);
|
},
|
trigger: "change",
|
},
|
],
|
monomervolLow: [
|
{
|
validator(rule, value, callback) {
|
testVal(rule, value, callback, rules.monomervolLow);
|
},
|
trigger: "change",
|
},
|
],
|
disCurr: [
|
{
|
validator(rule, value, callback) {
|
testVal(rule, value, callback, rules.disCurr);
|
},
|
trigger: "change",
|
},
|
],
|
disTime: [
|
{
|
validator(rule, value, callback) {
|
testVal(rule, value, callback, rules.disTime);
|
},
|
trigger: "change",
|
},
|
]
|
},
|
};
|
},
|
watch: {
|
'params.monCapStd'(num) {
|
// 计算rules
|
let names = ['disCurr', 'charSotpCurr', 'flowoverCharcurr1', 'chargeCurrSet'];
|
this.upDateRules(names, num);
|
}
|
},
|
methods: {
|
battNumChanged() {
|
let num = this.battGroupNum;
|
let cache = this.cacheParams[num];
|
if (cache) {
|
this.params = cache;
|
this.startTestFlag = true;
|
} else {
|
this.initParams();
|
this.startTestFlag = false;
|
}
|
},
|
upDateRules(names, num) {
|
let range = [0, 1];
|
names.forEach((v) => {
|
switch (v) {
|
case 'disCurr':
|
range = [0.1, 0.5];
|
break;
|
case 'charSotpCurr':
|
range = [0.01, 0.1];
|
break;
|
case 'flowoverCharcurr1':
|
range = [0.01, 0.1];
|
break;
|
case 'chargeCurrSet':
|
range = [0.05, 0.2];
|
break;
|
}
|
|
// 修改取值范围
|
rules[v].min = toFixed(range[0] * num, 2);
|
rules[v].max = toFixed(range[1] * num, 2);
|
rules[v].msg =
|
"取值范围" +
|
rules[v].min +
|
"~" +
|
rules[v].max +
|
"(保留两位小数)";
|
|
this.rules[v] = [
|
{
|
validator(rule, value, callback) {
|
testVal(rule, value, callback, rules[v]);
|
},
|
trigger: "change",
|
},
|
];
|
});
|
},
|
initParams() {
|
// 初始化参数
|
this.params = const_9141.getInitParams();
|
},
|
// 获取参数
|
getParams(showLoad) {
|
// 定义等待框
|
let loading;
|
if (showLoad) {
|
loading = this.$layer.loading(1);
|
}
|
// 启动按钮不可点击
|
this.startTestFlag = false;
|
// TODO 参数类型 来自于启动时的类型 type
|
// let {
|
// hvMonUppernum1,
|
// } = this.params;
|
let hvMonUppernum1 = const_9141.paramsTypeList.filter((v) => v.type == this.type)[0].value;
|
let parms = {
|
opCmd: this.cmd.get,
|
devId: this.batt.fbsdeviceId,
|
hvMonUppernum1,
|
battGroupNum: this.battGroupNum,
|
};
|
// 查询后台
|
getParams(parms)
|
.then((res) => {
|
res = res.data;
|
if (res.code && res.data) {
|
this.params = res.data2;
|
console.log(res.data2, '===data2')
|
this.$layer.msg("读取成功!");
|
// 设置按钮可点击
|
this.setTestFlag = true;
|
} else {
|
// 初始化参数
|
this.initParams();
|
// 设置按钮不可点击
|
this.setTestFlag = false;
|
this.$layer.msg("读取失败!");
|
}
|
// 关闭等待框
|
this.$layer.close(loading);
|
})
|
.catch((error) => {
|
console.log(error);
|
// 初始化参数
|
this.initParams();
|
// 设置按钮不可点击
|
this.setTestFlag = false;
|
// 关闭等待框
|
this.$layer.close(loading);
|
this.$layer.msg("读取失败,读取请求异常!");
|
});
|
},
|
// 提交表单设置参数
|
submitFrom() {
|
this.$refs.ruleForm.validate((valid) => {
|
// 校验通过
|
if (valid) {
|
// 设置参数
|
this.setParamsCheck();
|
} else {
|
this.$layer.msg("存在校验未通过的数据!");
|
return false;
|
}
|
});
|
},
|
setParamsCheck() {
|
if (config.dischargeByFace.value) {
|
this.setFaceShow = true;
|
} else {
|
this.setParams(true);
|
}
|
},
|
// 设置参数
|
setParams() {
|
// 等待框
|
let loading = this.$layer.loading(1);
|
let { battGroupNum } = this;
|
let params = {
|
...this.params,
|
battGroupNum,
|
opCmd: const_9141.cmd.set,
|
}
|
// 请求后台
|
setParams(params)
|
.then((res) => {
|
res = res.data;
|
if (res.code && res.data) {
|
// 设置成功 缓存
|
this.cacheParams[battGroupNum] = { ...this.params };
|
// 启动按钮可点击
|
this.startTestFlag = true;
|
// 提示信息
|
this.$layer.msg("设置成功");
|
} else {
|
// 清除缓存
|
this.cacheParams[battGroupNum] = null;
|
// 启动按钮不可点击
|
this.startTestFlag = false;
|
// 提示信息
|
this.$layer.msg("设置失败!");
|
}
|
// 关闭等待框
|
this.$layer.close(loading);
|
})
|
.catch((error) => {
|
console.log(error);
|
// 关闭等待框
|
this.$layer.close(loading);
|
// 清除缓存
|
this.cacheParams[battGroupNum] = null;
|
// 启动按钮不可点击
|
this.startTestFlag = false;
|
// 提示信息
|
this.$layer.msg("设置失败,设置请求异常!");
|
});
|
},
|
startTestCheck(num) {
|
this.startNum = num;
|
if (config.dischargeByFace.value) {
|
this.startFaceShow = true;
|
} else {
|
this.confirmStartTest();
|
}
|
},
|
// 确认框
|
confirmStartTest() {
|
this.$layer.prompt(
|
{
|
title: "输入启动口令,并确认",
|
formType: 2,
|
area: ["300px", "180px"],
|
},
|
(pass, index) => {
|
// 请求后台校验密码
|
checkUserPwd(pass)
|
.then((res) => {
|
res = res.data;
|
if (res.code) {
|
// 关闭弹出框
|
this.$layer.close(index);
|
this.$layer.msg("密码检测通过,启动测试");
|
// 启动测试
|
this.startTest();
|
} else {
|
this.$layer.msg("启动口令错误!");
|
}
|
})
|
.catch((error) => {
|
console.log(error);
|
this.$layer.msg("网络请求异常");
|
});
|
}
|
);
|
},
|
// 启动
|
startTest() {
|
// 启动组 this.startNum
|
// 等待框
|
let loading = this.$layer.loading(1);
|
let params = {
|
opCmd: this.cmd.start,
|
devId: this.batt.fbsdeviceId,
|
battGroupNum: this.startNum,
|
testCmd: this.testCmd[this.type],
|
}
|
// 请求后台
|
start(params)
|
.then((res) => {
|
res = res.data;
|
if (res.code && res.data) {
|
// 提示信息
|
this.$layer.msg("启动测试成功");
|
// 关闭弹出框
|
this.$emit("close");
|
} else {
|
// 提示信息
|
this.$layer.msg("启动测试失败!");
|
}
|
// 关闭等待框
|
this.$layer.close(loading);
|
})
|
.catch((error) => {
|
console.log(error);
|
// 关闭等待框
|
this.$layer.close(loading);
|
// 提示信息
|
this.$layer.msg("启动测试失败,启动测试请求异常!");
|
});
|
},
|
checkValIsInObjects(val, objects) {
|
let rs = false;
|
for (let i = 0; i < objects.length; i++) {
|
let obj = objects[i];
|
if (obj.value === val) {
|
rs = true;
|
break;
|
}
|
}
|
return false;
|
},
|
setFaceSuccess() {
|
this.setFaceShow = false;
|
this.setParams();
|
},
|
startFaceSuccess() {
|
this.startFaceShow = false;
|
this.startTest();
|
}
|
},
|
computed: {
|
otherParams() {
|
let batt = this.batt;
|
let groupInfo =
|
"单体数量:" +
|
this.batt.monCount +
|
";电压(V):" +
|
this.batt.monVolStd;
|
return {
|
groupName: batt.stationName + "-" + batt.battGroupName,
|
fbsdeviceId: batt.fbsdeviceId,
|
groupInfo: groupInfo
|
};
|
},
|
// 0.1C-0.5C //核容限流(A)
|
disCurrRange() {
|
let { monCapStd } = this.params;
|
let r0 = toFixed(0.1 * monCapStd, 2);
|
let r1 = toFixed(0.5 * monCapStd, 2);
|
return `${r0}~${r1}`;
|
},
|
// 0.01-0.10C //均充转浮充电流(A)
|
charSotpCurrRange() {
|
let { monCapStd } = this.params;
|
let r0 = toFixed(0.01 * monCapStd, 2);
|
let r1 = toFixed(0.1 * monCapStd, 2);
|
return `${r0}~${r1}`;
|
},
|
// 0.01-0.10C //浮充转均充电流(A)
|
flowoverCharcurr1Range() {
|
let { monCapStd } = this.params;
|
let r0 = toFixed(0.01 * monCapStd, 2);
|
let r1 = toFixed(0.1 * monCapStd, 2);
|
return `${r0}~${r1}`;
|
},
|
// 0.05-0.20 C //电池充电限流(A)
|
chargeCurrSetRange() {
|
let { monCapStd } = this.params;
|
let r0 = toFixed(0.05 * monCapStd, 2);
|
let r1 = toFixed(0.2 * monCapStd, 2);
|
return `${r0}~${r1}`;
|
},
|
canStartAll() {
|
let { cacheParams } = this;
|
return cacheParams[0] && cacheParams[1] && cacheParams[2] && cacheParams[3];
|
},
|
battLabel() {
|
let { groupIndexList } = const_9141;
|
return groupIndexList.filter((v) => v.value == this.battGroupNum)[0].label;
|
},
|
},
|
mounted() {
|
// 获取数据
|
if (this.readOnly) {
|
this.initParams();
|
this.params = {
|
...this.params,
|
...this.paramData
|
};
|
} else {
|
this.getParams(true);
|
}
|
// console.log(this.batt, this.readOnly, this.paramData);
|
},
|
};
|
</script>
|
|
<style scoped>
|
.form-footer {
|
margin-top: 16px;
|
margin-bottom: 16px;
|
text-align: right;
|
}
|
|
.form-footer .three-btn {
|
margin-left: 12px;
|
}
|
</style>
|