whychdw
2021-09-26 edb8909baf10f7433ed783439891bb7c28e2295d
内容提交
2个文件已添加
6个文件已修改
734 ■■■■■ 已修改文件
public/theme/science-black.css 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/theme/science-blue.css 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/theme/science-green.css 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/js/apis/dcdc/index.js 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/js/const/const_9100.js 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/dataTest/dialogs/dcdc/addPlan.vue 453 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/dataTest/dialogs/dcdc/workPlan.vue 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/dataTest/realTime.vue 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/theme/science-black.css
@@ -805,6 +805,11 @@
  border: 1px solid #0ca7e2 !important;
  background: #031a46 !important;
}
.el-picker-panel.white-bg {
  color: #606266 !important;
  border: 1px solid #e4e7ed !important;
  background: #fff !important;
}
.el-picker-panel .el-picker-panel__footer {
  background-color: #072d5e !important;
public/theme/science-blue.css
@@ -791,6 +791,11 @@
  border: 1px solid #2761b5 !important;
  background: #042271 !important;
}
.el-picker-panel.white-bg {
  color: #606266 !important;
  border: 1px solid #e4e7ed !important;
  background: #fff !important;
}
.el-picker-panel .el-picker-panel__footer {
  background-color: #042271 !important;
public/theme/science-green.css
@@ -983,6 +983,12 @@
  background: #153953 !important;
}
.el-picker-panel.white-bg {
  color: #606266 !important;
  border: 1px solid #e4e7ed !important;
  background: #fff !important;
}
.el-picker-panel .el-picker-panel__footer {
  background-color: #153953 !important;
}
src/assets/js/apis/dcdc/index.js
@@ -91,4 +91,45 @@
            data: 'json=' + JSON.stringify(data),
        });
    },
    // 查询所有的放电计划
    searchDcDcPlanAll(id) {
        // 请求后台查询内容
        return axios({
            method: 'post',
            url: 'Li9130_setparam_planAction_action_serchByCondition',
            data: 'json=' + JSON.stringify({
                dev_id: id,
            }),
        });
    },
    // 添加充放电计划
    addDcDcPlan(data) {
        // 请求后台查询内容
        return axios({
            method: 'post',
            url: 'Li9130_setparam_planAction_action_add',
            data: 'json=' + JSON.stringify([data]),
        });
    },
    // 添加充放电计划
    editDcDcPlan(data) {
        // 请求后台查询内容
        return axios({
            method: 'post',
            url: 'Li9130_setparam_planAction_action_update',
            data: 'json=' + JSON.stringify(data),
        });
    },
    // 删除充放电计划
    delDcDcPlan(data) {
        // 请求后台查询内容
        return axios({
            method: 'post',
            url: 'Li9130_setparam_planAction_action_del',
            data: 'json=' + JSON.stringify(data),
        });
    },
};
src/assets/js/const/const_9100.js
@@ -1,10 +1,10 @@
export default {
    workstates: ['在线监测','放电测试','充电测试','内阻测试','未知'],
    workstates: ['在线监测', '放电测试', '充电测试', '内阻测试', '未知'],
    alarmstates: [
        '无','暂停','放电测试','放电等待','限流充电','直流充电','充电等待','测试时间到',
        '测试容量到','单体下限到','组端下限到','市电异常','存储卡不足','负载温度高','电流异常','远程通信坏',
        '负载通信坏','选择通信坏','载模块放电过功率停止','内部程序异常停止','市电恢复停止升压放电','充电过程中市电中断',
        '合路器放电功能组端电压下限','温度上限到','未知'
        '无', '暂停', '放电测试', '放电等待', '限流充电', '直流充电', '充电等待', '测试时间到',
        '测试容量到', '单体下限到', '组端下限到', '市电异常', '存储卡不足', '负载温度高', '电流异常', '远程通信坏',
        '负载通信坏', '选择通信坏', '载模块放电过功率停止', '内部程序异常停止', '市电恢复停止升压放电', '充电过程中市电中断',
        '合路器放电功能组端电压下限', '温度上限到', '未知'
    ],
    cmd: {
        get: 41,
@@ -25,10 +25,20 @@
            label: 'K1/D1测试',
            value: 72
        },
        // {
        //     label: '充电测试',
        //     value: 0x40,
        // }
        {
            label: '充电测试',
            value: 0x40,
        }
    ],
    testType1: [
        {
            label: '容量测试',
            value: 37,
        },
        {
            label: '充电测试',
            value: 0x40,
        }
    ],
    dischargeRules: {
        DisCurr: {  // 放电电流
src/pages/dataTest/dialogs/dcdc/addPlan.vue
New file
@@ -0,0 +1,453 @@
<template>
  <div class="table-container">
    <el-form
      ref="ruleForm"
      size="mini"
      label-position="top"
      :model="params"
      :rules="rules"
      class="params-dialog bg-white"
    >
      <el-row :gutter="layout.gutter">
        <el-col :span="layout.span">
          <el-form-item label="电池组编号">
            <el-select v-model="params.BattGroupNum">
              <el-option :value="1" label="电池组1"></el-option>
              <el-option :value="2" label="电池组2"></el-option>
              <el-option :value="3" label="电池组3"></el-option>
              <el-option :value="4" label="电池组4"></el-option>
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="layout.span">
          <el-form-item label="测试类型">
            <el-select v-model="params.test_type" placeholder="请选择">
              <el-option
                v-for="item in testType"
                :key="item.value"
                :label="item.label"
                :value="item.value"
              ></el-option>
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="layout.span">
          <el-form-item label="放电电流(0~1000A)" prop="DisCurr">
            <el-input v-model="params.DisCurr"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="layout.span">
          <el-form-item label="放电小时率">
            <el-input v-model="params.HourRate"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="layout.span">
          <el-form-item label="放电容量(0~90000AH)" prop="DisCap">
            <el-input v-model="params.DisCap"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="layout.span">
          <el-form-item label="放电时长(0~5940分钟)" prop="DisTime">
            <el-input v-model="params.DisTime"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="layout.span">
          <el-form-item
            :label="rangeLabel.MonomerVol_Low"
            prop="MonomerVol_LOW"
          >
            <el-input v-model="params.MonomerVol_LOW"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="layout.span">
          <el-form-item :label="rangeLabel.GroupVol_Low" prop="GroupVol_LOW">
            <el-input v-model="params.GroupVol_LOW"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="layout.span">
          <el-form-item label="在线电压低处理">
            <el-select v-model="params.OnlineVolLowAction" placeholder="请选择">
              <el-option label="停止测试" :value="0"></el-option>
              <el-option label="继续测试" :value="1"></el-option>
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="layout.span">
          <el-form-item label="升压上限(V)">
            <el-input v-model="params.DCVolHighLimit"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="layout.span">
          <el-form-item label="充电电流(A)">
            <el-input v-model="params.ChargeCurrSet"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="layout.span">
          <el-form-item label="设备温度上限(℃)">
            <el-input v-model="params.MonomerTmp_High"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="layout.span">
          <el-form-item label="是否启用计划">
            <el-select v-model="params.is_startup" placeholder="请选择">
              <el-option label="不启用" :value="0"></el-option>
              <el-option label="启用" :value="1"></el-option>
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="layout.span">
          <el-form-item label="启停时间范围">
            <el-time-picker
              is-range
              v-model="value1"
              range-separator="至"
              start-placeholder="开始时间"
              end-placeholder="结束时间"
              placeholder="选择时间范围"
              popper-class="white-bg"
            >
            </el-time-picker>
          </el-form-item>
        </el-col>
      </el-row>
      <div class="form-footer">
        <three-btn v-if="type == 'add'" @click="submitFrom">新建</three-btn>
        <three-btn v-if="type == 'edit'" @click="submitFrom">编辑</three-btn>
        <three-btn v-if="type == 'edit'" @click="del">删除</three-btn>
      </div>
    </el-form>
  </div>
</template>
<script>
import { testVal } from "@/assets/js/tools";
import { const_9100 } from "@/assets/js/const";
export default {
  props: {
    batt: {
      type: Object,
      default() {
        return {};
      },
    },
    type: {
      type: String,
      default: "add", // add:添加 edit:编辑
    },
    info: {
      type: Object,
      default() {
        return {};
      },
    },
    timeList: {
      type: Array,
      default() {
        return [];
      },
    },
  },
  data() {
    let testType = const_9100.testType1;
    let rules = const_9100.dischargeRules;
    let batt = this.batt;
    // 修改组端下限的取值范围
    rules.GroupVol_Low.min = (batt.MonCount * batt.MonVolStd * 0.875).toHold(1);
    rules.GroupVol_Low.max = (batt.MonCount * batt.MonVolStd * 1.125).toHold(1);
    rules.GroupVol_Low.msg =
      "取值范围" +
      rules.GroupVol_Low.min +
      "~" +
      rules.GroupVol_Low.max +
      "(保留一位小数)";
    // 修改电池单体下限的取值范围
    rules.MonomerVol_Low.min = (batt.MonVolStd * 0.9).toHold(1);
    rules.MonomerVol_Low.max = (batt.MonVolStd * 1.2).toHold(1);
    rules.MonomerVol_Low.msg =
      "取值范围" +
      rules.MonomerVol_Low.min +
      "~" +
      rules.MonomerVol_Low.max +
      "(保留一位小数)";
    return {
      layout: {
        gutter: 16,
        span: 8,
      },
      params: {
        num: 0, //命令
        dev_id: 0, //设备id
        BattGroupNum: 1, //电池组编号
        DisCurr: 0, //放电电流
        DisCap: 0, //放电容量
        DisTime: 0, //放电时长
        GroupVol_LOW: 0, //组端下限阀值
        HourRate: 0, //放电小时率
        MonomerLowCount: 0, //单体下限数量
        MonomerVol_LOW: 0, //单体下限阀值
        OnlineVolLowAction: 0, //在线电压低处理
        test_type: 37, //测试类型  改变
        ChargeCurrSet: 0, //充电电流
        DCVolHighLimit: 0, //升压上限
        MonomerTmp_High: 0, //温度上限
        BattGroupId: 0, // 电池组id
        test_starttime: 0, // 测试开始时间
        test_stoptime: 0, // 结束时间
        is_startup: 1, // 是否启动
      },
      value1: [new Date(2016, 9, 10, 8, 40), new Date(2016, 9, 10, 9, 40)],
      testType: testType, // 测试类型
      ranges: {
        GroupVol_Low: {
          name: "组端电压下限",
          unit: "V",
          min: rules.GroupVol_Low.min,
          max: rules.GroupVol_Low.max,
        },
        MonomerVol_Low: {
          name: "单体电压下限",
          unit: "V",
          min: rules.MonomerVol_Low.min,
          max: rules.MonomerVol_Low.max,
        },
      },
      rules: {
        DisCurr: [
          {
            validator(rule, value, callback) {
              testVal(rule, value, callback, rules.DisCurr);
            },
            trigger: "change",
          },
        ],
        DisCap: [
          {
            validator(rule, value, callback) {
              testVal(rule, value, callback, rules.DisCap);
            },
            trigger: "change",
          },
        ],
        DisTime: [
          {
            validator(rule, value, callback) {
              testVal(rule, value, callback, rules.DisTime);
            },
            trigger: "change",
          },
        ],
        MonomerVol_LOW: [
          {
            validator(rule, value, callback) {
              testVal(rule, value, callback, rules.MonomerVol_Low);
            },
            trigger: "change",
          },
        ],
        GroupVol_LOW: [
          {
            validator(rule, value, callback) {
              testVal(rule, value, callback, rules.GroupVol_Low);
            },
            trigger: "change",
          },
        ],
      },
    };
  },
  methods: {
    initParams() {
      // 初始化参数
      this.params = {
        num: 0, //命令
        dev_id: 0, //设备id
        BattGroupNum: 1, //电池组编号
        DisCurr: 0, //放电电流
        DisCap: 0, //放电容量
        DisTime: 0, //放电时长
        GroupVol_LOW: 0, //组端下限阀值
        HourRate: 0, //放电小时率
        MonomerLowCount: 0, //单体下限数量
        MonomerVol_LOW: 0, //单体下限阀值
        OnlineVolLowAction: 0, //在线电压低处理
        test_type: 37, //测试类型  改变
        ChargeCurrSet: 0, //充电电流
        DCVolHighLimit: 0, //升压上限
        MonomerTmp_High: 0, //温度上限
        BattGroupId: 0, // 电池组id
        test_starttime: 0, // 测试开始时间
        test_stoptime: 0, // 结束时间
        is_startup: 1, // 是否启动
      };
      // 编辑
      if (this.type == "edit") {
        // 根据info值初始化内容
        Object.keys(this.params).forEach((key) => {
          let value = this.info[key];
          if (typeof value != "undefined") {
            this.params[key] = value;
          }
        });
        // 时间范围初始化
        this.value1 = [
          this.getTime(this.info.test_starttime),
          this.getTime(this.info.test_stoptime),
        ];
      }
    },
    getTime(time) {
      let times = time.toString().split(":");
      let hour = typeof times[0] != "undefined" ? times[0] : 8;
      let minute = typeof times[1] != "undefined" ? times[1] : 40;
      return new Date(2016, 9, 10, hour, minute);
    },
    // 提交表单设置参数
    submitFrom() {
      this.$refs.ruleForm.validate((valid) => {
        // 校验通过
        if (valid) {
          this.params.test_starttime = this.value1[0].format("hh:mm:ss");
          this.params.test_stoptime = this.value1[1].format("hh:mm:ss");
          this.params.BattGroupId = this.batt.BattGroupId;
          this.params.dev_id = this.batt.FBSDeviceId;
          let type = this.type;
          let confirmMsg = this.confirmMsg;
          this.$confirm(confirmMsg, "提示", {
            confirmButtonText: "确定",
            cancelButtonText: "取消",
            type: "warning",
          })
            .then(() => {
              switch (type) {
                case "add":
                  this.add(this.params);
                  break;
                case "edit":
                  this.edit(this.params);
                  break;
                default:
                  this.$layer.msg("未知类型");
                  break;
              }
            })
            .catch(() => {});
        } else {
          this.$layer.msg("存在校验未通过的数据!");
          return false;
        }
      });
    },
    add(params) {
      let loading = this.$layer.loading();
      this.$apis.dcdc
        .addDcDcPlan(this.params)
        .then((res) => {
          let rs = JSON.parse(res.data.result);
          if (rs.code == 1) {
            this.$layer.msg("添加成功");
            this.$emit("success");
          } else {
            this.$layer.msg("添加失败");
          }
          // 关闭弹出框
          this.$layer.close(loading);
        })
        .catch((error) => {
          console.log(error);
          // 关闭弹出框
          this.$layer.close(loading);
        });
    },
    edit(params) {
      let loading = this.$layer.loading();
      this.$apis.dcdc
        .editDcDcPlan(this.params)
        .then((res) => {
          let rs = JSON.parse(res.data.result);
          if (rs.code == 1) {
            this.$layer.msg("编辑成功");
            this.$emit("success");
          } else {
            this.$layer.msg("编辑失败");
          }
          // 关闭弹出框
          this.$layer.close(loading);
        })
        .catch((error) => {
          console.log(error);
          // 关闭弹出框
          this.$layer.close(loading);
        });
    },
    del() {
      this.$confirm("确认删除计划", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      })
        .then(() => {
          let loading = this.$layer.loading();
          let params = {
            num: this.info.num,
            dev_id: this.info.dev_id,
          };
          this.$apis.dcdc
            .delDcDcPlan(params)
            .then((res) => {
              let rs = JSON.parse(res.data.result);
              if (rs.code == 1) {
                this.$layer.msg("删除成功");
                this.$emit("success");
              } else {
                this.$layer.msg("删除失败");
              }
              // 关闭弹出框
              this.$layer.close(loading);
            })
            .catch((error) => {
              console.log(error);
              // 关闭弹出框
              this.$layer.close(loading);
            });
        })
        .catch(() => {});
    },
  },
  computed: {
    rangeLabel() {
      let ranges = this.ranges;
      let result = {};
      for (let key in ranges) {
        let item = ranges[key];
        result[key] =
          item.name + "(" + item.min + "~" + item.max + item.unit + ")";
      }
      return result;
    },
    confirmMsg() {
      return this.type == "add" ? "确认添加计划" : "确认编辑计划";
    },
  },
  mounted() {
    this.initParams();
  },
};
</script>
<style scoped>
.table-container {
  padding: 8px;
}
.form-footer {
  margin: 0;
}
</style>
src/pages/dataTest/dialogs/dcdc/workPlan.vue
New file
@@ -0,0 +1,169 @@
<template>
  <div class="params-container">
    <el-form
      ref="ruleForm"
      size="mini"
      label-position="top"
      :model="params"
      :rules="rules"
      class="params-dialog bg-white"
    >
      <el-row :gutter="layout.gutter">
        <el-col :span="12">
          <el-form-item label="电池组名称">
            <el-input v-model="otherParams.groupName" 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-row>
      <el-tabs
        name="dcdcPlan"
        v-model="acTabs"
        type="border-card"
        class="flex-layout noborder"
      >
        <el-tab-pane
          v-for="item in list"
          :key="item.tabLabel"
          :label="item.tabLabel"
          :name="item.tabLabel"
        >
          <span slot="label">
            {{ item.tabLabel }}
            {{ getMsg(item) }}
          </span>
          <add-plan
            type="edit"
            :batt="batt"
            :info="item"
            :time-list="timeList"
            @success="successMethod"
          ></add-plan>
        </el-tab-pane>
        <el-tab-pane key="addPlan" label="新建计划" name="addPlan">
          <add-plan
            :batt="batt"
            @success="successMethod"
            :time-list="timeList"
          ></add-plan>
        </el-tab-pane>
      </el-tabs>
    </el-form>
  </div>
</template>
<script>
import AddPlan from "./addPlan.vue";
export default {
  components: {
    AddPlan,
  },
  props: {
    batt: {
      type: Object,
      default() {
        return {};
      },
    },
  },
  data() {
    return {
      acTabs: "addPlan",
      layout: {
        gutter: 16,
        span: 8,
      },
      params: {},
      rules: {},
      list: [],
      timeList: [],
    };
  },
  methods: {
    searchPlan() {
      let loading = this.$layer.loading();
      let batt = this.batt;
      this.$apis.dcdc
        .searchDcDcPlanAll(batt.FBSDeviceId)
        .then((res) => {
          let rs = JSON.parse(res.data.result);
          let data = [];
          if (rs.code == 1) {
            data = rs.data;
          }
          data.map((item) => {
            item.tabLabel = item.test_starttime + "~" + item.test_stoptime;
            return item;
          });
          this.timeList = data.map((item) => {
            return [item.test_starttime, item.test_stoptime];
          });
          if (data.length) {
            this.acTabs = data[0].tabLabel;
          }
          // 设置计划
          this.list = data;
          // 关闭弹出框
          this.$layer.close(loading);
        })
        .catch((error) => {
          console.log(error);
          // 关闭弹出框
          this.$layer.close(loading);
        });
    },
    successMethod() {
      this.searchPlan();
    },
    getMsg(data) {
      if (data.is_startup == 0) {
        return "(未启用)";
      }
      if (data.test_type == "37") {
        return "(放电)";
      }
      if (data.test_type == "64") {
        return "(充电)";
      }
    },
  },
  computed: {
    otherParams() {
      let batt = this.batt;
      let groupInfo =
        "单体数量:" +
        this.batt.MonCount +
        ";电压(V):" +
        this.batt.MonVolStd +
        ";容量(AH):" +
        this.batt.MonCapStd;
      return {
        groupName: batt.StationName + "-" + batt.BattGroupName,
        FBSDeviceId: batt.FBSDeviceId,
        groupInfo: groupInfo,
        GroupIndexInFBSDevice: this.batt.GroupIndexInFBSDevice + 1,
      };
    },
  },
  mounted() {
    this.searchPlan();
  },
};
</script>
<style scoped>
.params-container {
  width: 1200px;
  background-color: #ececec;
}
</style>
src/pages/dataTest/realTime.vue
@@ -159,6 +159,11 @@
                      >DCDC工作参数</a
                    >
                  </li>
                  <li class="hdw-menu-item" v-if="isLithium">
                    <a @click="workPlanDialog = true" href="javascript:void(0);"
                      >消峰填谷计划</a
                    >
                  </li>
                  <li class="hdw-menu-item" v-if="isShowJunHeng">
                    <a
                      @click="balanceControlDialog = true"
@@ -744,6 +749,23 @@
        :batt="batt"
      ></dc-work-params>
    </el-dialog>
    <!-- 锂电池消峰填谷 -->
    <el-dialog
      title="消峰填谷计划"
      width="auto"
      :visible.sync="workPlanDialog"
      :close-on-click-modal="false"
      top="0"
      class="dialog-center"
      :modal-append-to-body="false"
    >
      <work-plan
        v-if="workPlanDialog"
        :visible.sync="workPlanDialog"
        :batt="batt"
      ></work-plan>
    </el-dialog>
    <right-menu
      :visible.sync="rightMenu.show"
      :x="rightMenu.x"
@@ -819,6 +841,7 @@
import BalanceControlParams from "@/components/params/balance-control-params.vue";
import getTblHeader from "@/pages/dataTest/js/getTblHeader";
import lithiumInfo from "@/assets/js/tools/lithium";
import workPlan from "@/pages/dataTest/dialogs/dcdc/workPlan";
/* import moment from "moment"; */
let vol, resChart, temp, conduct, currChart, leakVol;
@@ -850,6 +873,7 @@
    BalanceSupplyModule,
    BalanceControlParams,
    dcWorkParams,
    workPlan,
  },
  watch: {
    "$route.params.BattGroupId"(BattGroupId) {
@@ -874,6 +898,7 @@
    let stateList = const_61850.stateList;
    let historyStateList = const_61850.historyStateList;
    return {
      workPlanDialog: false,
      dcdcWorkDialog: false,
      balanceControlDialog: false,
      hisResDialog: false,
@@ -2763,7 +2788,7 @@
      let isLithium = regEquipType(batt.FBSDeviceId, ["lithium"]);
      if (isLithium) {
        list.batt_syrl_cap =
          this.lithiumParams.analog.params.restCap.toFixed(1) + "AH";
          this.lithiumParams.analog.restCap.toFixed(1) + "AH";
      }
      return list;