he wei
2024-01-18 d065ca03f746cae1b98d6d2d5afb8e4437297043
UA 核容添加告警模拟等
7个文件已修改
2个文件已添加
2110 ■■■■ 已修改文件
src/views/hrControl/components/card2.vue 231 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/hrControl/components/card3.vue 250 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/hrControl/components/cardBatt.vue 97 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/hrControl/index.vue 815 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/hrControl/js/apis.js 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/hrControl/js/const_props.js 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/hrTestRecord/index.vue 513 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/hrTestRecord/js/apis.js 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/realTime/index.vue 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/hrControl/components/card2.vue
New file
@@ -0,0 +1,231 @@
<template>
  <div class="card flex-c">
    <div class="card-title">
      <div class="flex-r">
        {{ title }}
      </div>
      <el-checkbox v-model="checked1" @change="changed"></el-checkbox>
    </div>
    <div class="card-content">
      <div class="col">
        实时:
        <div :class="['value', { alarm: !!value }]">
          {{ value ? "告警" : "正常" }}
        </div>
      </div>
      <div class="col">
        模拟:
        <div class="btn">
          <gradient-btn
            :active="setFlag"
            :disabled="!hasPermission"
            @click="handlerClick"
            size="xs"
            >{{ setFlag ? "执行中" : "执行" }}</gradient-btn
          >
        </div>
      </div>
    </div>
  </div>
</template>
<script>
import gradientBtn from "@/components/gradientBtn.vue";
import { setAlarm } from "../js/apis";
import changeBinaryBits from "@/assets/js/changeBinaryBits";
import getBit from "@/assets/js/getBit";
import setBitAtPositions from "@/assets/js/setBitAtPositions";
export default {
  name: "",
  props: {
    option: {
      type: Object,
      required: true,
    },
    datas: {
      type: Object,
      required: true,
    },
    checked: {
      type: Boolean,
      required: true,
    },
  },
  watch: {
    checked(n) {
      this.checked1 = n;
    },
  },
  data() {
    return {
      checked1: this.checked,
    };
  },
  computed: {
    hasPermission() {
      return this.$store.state.user.downloadFlag == 1;
    },
    title() {
      return this.option.label;
    },
    setFlag() {
      let { flag, childrenCount, index } = this.option;
      if (childrenCount) {
        // 通过index获得它在flag数组中的index
        let propIdx = Math.floor(index / 25);
        let prop_flag = flag[propIdx];
        let _flag = this.datas[prop_flag];
        return !!getBit(_flag, index % 25);
      } else {
        return !!this.datas[flag];
      }
    },
    value() {
      let {
        datas,
        option: { key0, key1, childrenCount, index },
      } = this;
      if (childrenCount) {
        // 通过index获得它在flag数组中的index
        let propIdx = Math.floor(index / 25);
        let prop_key0 = key0[propIdx];
        let prop_key1 = key1[propIdx];
        let _key0 = datas[prop_key0];
        let _key1 = datas[prop_key1];
        return !this.setFlag
        ? getBit(_key0, index % 25)
        : getBit(_key1, index % 25);
      } else {
        return this.setFlag ? datas[key1] : datas[key0];
      }
    },
  },
  components: {
    gradientBtn,
  },
  methods: {
    changed() {
      this.$emit("update:checked", this.checked1);
    },
    handlerClick() {
      let title = "";
      let pflag = 0;
      if (this.setFlag) {
        title = "是否取消执行?";
        pflag = 0;
      } else {
        title = "是否执行?";
        pflag = 1;
      }
      this.$confirm(title, "提示", {
        type: "warning",
      })
        .then(() => {
          let loading = this.$layer.loading();
          let params = { logList: [], rsAlmSet: {} };
          let { key1, flag } = this.option;
            params.rsAlmSet[key1] = 1;
            params.rsAlmSet[flag] = pflag;
            params["logList"].push({
              param: flag,
              paramCn: this.title,
              fake: pflag || undefined,
              st: pflag,
            });
          setAlarm(params)
            .then((res) => {
              let { code, data, msg } = res.data;
              this.$layer.close(loading);
              this.$message(msg);
            })
            .catch((err) => {
              console.log(err);
              this.$layer.close(loading);
            });
        })
        .catch(() => {});
    },
  },
  mounted() {},
};
</script>
<style scoped lang="less">
.flex-r {
  display: flex;
  flex-direction: row;
}
.flex-c {
  display: flex;
  flex-direction: column;
}
.card {
  height: 100px;
  border: 1px solid #77edf6;
  border-radius: 4px;
  color: #fff;
  overflow: hidden;
  .card-title {
    background: #011f39;
    height: 30px;
    color: #77edf6;
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding-left: 6px;
    padding-right: 6px;
    border-bottom: 1px solid #77edf6;
  }
  .i {
    cursor: pointer;
    margin-left: 4px;
    margin-right: 6px;
    width: 20px;
    height: 20px;
    border-radius: 50%;
    background: #77edf6 url("../../../assets/images/gantan.png") 50% 50% / auto
      60% no-repeat;
  }
  .card-content {
    flex: 1;
    background: #0c4d77;
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 6px;
  }
  .col {
    display: flex;
    align-items: center;
  }
  .value {
    flex: 1;
    color: #77edf6;
    margin-left: 6px;
    margin-right: 6px;
    padding-left: 6px;
    height: 26px;
    line-height: 26px;
    border-radius: 6px;
    &.alarm {
      color: #ff4f45;
      font-weight: 700;
    }
  }
  .input {
    color: #000;
    flex: 1;
    margin-left: 6px;
    margin-right: 6px;
    :deep(.el-input__inner) {
      color: inherit;
    }
  }
  .btn {
    width: 76px;
    padding-left: 8px;
  }
}
</style>
src/views/hrControl/components/card3.vue
New file
@@ -0,0 +1,250 @@
<template>
  <div class="card flex-c">
    <div class="card-title">
      <div class="flex-r">
        <div class="i"></div>
        {{ title }}
      </div>
      <el-checkbox v-model="checked1" @change="changed"></el-checkbox>
    </div>
    <div class="card-content">
      <div class="row">
        实时:
        <div class="value">{{ value }}</div>
        <div class="btn"></div>
      </div>
      <div class="row">
        模拟:
        <el-select
          class="input"
          v-if="isSelect"
          :disabled="setFlag"
          v-model="num"
          size="mini"
        >
          <el-option
            v-for="(item, idx) in selectOptions"
            :key="'select_' + idx"
            :label="item.label"
            :value="item.value"
          >
          </el-option>
        </el-select>
        <el-input-number
          v-else
          class="input"
          size="mini"
          :disabled="setFlag"
          v-model="num"
          :step="1"
        ></el-input-number>
        <div class="btn">
          <gradient-btn
            :active="setFlag"
            size="xs"
            :disabled="!hasPermission"
            @click="confirm"
            >{{ setFlag ? btnText + "中" : btnText }}</gradient-btn
          >
        </div>
      </div>
    </div>
  </div>
</template>
<script>
import gradientBtn from "@/components/gradientBtn.vue";
import { updateStateHrStop } from "../js/apis";
export default {
  name: "",
  props: {
    option: {
      type: Object,
      required: true,
    },
    datas: {
      type: Object,
      required: true,
    },
    btnText: {
      type: String,
      default: "执行",
    },
    checked: {
      type: Boolean,
      required: true,
    },
  },
  computed: {
    title() {
      return this.option.label;
    },
    setFlag() {
      return !!this.datas[this.option.flag];
    },
    isSelect() {
      return !!this.option.option;
    },
    selectOptions() {
      if (this.isSelect) {
        return this.option.option
          .map((v, i) => ({ label: v, value: i }))
          .filter((v) => !!v.label);
      } else {
        return [];
      }
    },
    value() {
      let { datas, option } = this;
      if (option.option) {
        return this.setFlag
          ? option.option[datas[option.key1]]
          : option.option[datas[option.key0]];
      } else {
        return this.setFlag ? datas[option.key1] : datas[option.key0];
      }
    },
    hasPermission() {
      return this.$store.state.user.downloadFlag == 1;
    },
  },
  watch: {
    datas(n, o) {
      if (o.isEmpty && !n.isEmpty) {
        this.num = this.datas[this.option.key1];
      }
    },
    checked(n) {
      this.checked1 = n;
    },
  },
  data() {
    return {
      checked1: this.checked,
      // checked: false,
      num: 0,
    };
  },
  components: {
    gradientBtn,
  },
  methods: {
    changed() {
      this.$emit("update:checked", this.checked1);
    },
    confirm() {
      let title = "";
      let flag = 0;
      let num;
      if (this.setFlag) {
        title = "是否取消给定?";
        flag = 0;
      } else {
        title = "是否给定?";
        flag = 1;
        num = this.num;
      }
      this.$confirm(title, "提示", {
        type: "warning",
      })
        .then(() => {
          // console.log('调用结定接口', this.num, this.option.key1);
          let loading = this.$layer.loading();
          let params = { logList: [] };
          params[this.option.key1] = flag ? num : undefined;
          params[this.option.flag] = flag;
          // params["battIndex"] = 0;
          params["logList"].push({
            param: this.option.flag,
            paramCn: this.title,
            value: flag ? num : undefined,
            st: flag,
          });
          updateStateHrStop(params)
            .then((res) => {
              let { code, data, msg } = res.data;
              this.$layer.close(loading);
              this.$message(msg);
            })
            .catch((err) => {
              console.log(err);
              this.$layer.close(loading);
            });
        })
        .catch(() => {});
    },
  },
  mounted() {},
};
</script>
<style scoped lang="less">
.flex-r {
  display: flex;
  flex-direction: row;
}
.flex-c {
  display: flex;
  flex-direction: column;
}
.card {
  height: 110px;
  border: 1px solid #3e8d9d;
  border-radius: 4px;
  color: #fff;
  overflow: hidden;
  .card-title {
    background: #0c4d77;
    height: 30px;
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding-right: 6px;
  }
  .i {
    margin-left: 4px;
    margin-right: 6px;
    width: 20px;
    height: 20px;
    border-radius: 50%;
    background: #77edf6 url("../../../assets/images/gantan.png") 50% 50% / auto
      60% no-repeat;
  }
  .card-content {
    flex: 1;
    background: #011f39;
    display: flex;
    flex-direction: column;
    padding: 6px;
  }
  .value {
    flex: 1;
    background: #fff;
    color: #000;
    margin-left: 6px;
    margin-right: 6px;
    padding-left: 6px;
    height: 26px;
    line-height: 26px;
    border-radius: 6px;
  }
  .input {
    color: #000;
    flex: 1;
    margin-left: 6px;
    margin-right: 6px;
    :deep(.el-input__inner) {
      color: inherit;
    }
  }
  .btn {
    width: 60px;
  }
  .row {
    flex: 1;
    display: flex;
    align-items: center;
  }
}
</style>
src/views/hrControl/components/cardBatt.vue
@@ -38,12 +38,16 @@
<script>
import gradientBtn from "@/components/gradientBtn.vue";
import { updateMon } from "../js/apis";
import { updateMon, updateDataHrStop } from "../js/apis";
export default {
  name: "",
  props: {
    option: {
      type: Object,
      required: true,
    },
    type: {
      type: Number,
      required: true,
    },
    datas: {
@@ -126,37 +130,72 @@
        type: "warning",
      })
        .then(() => {
          // console.log('调用结定接口', this.num, this.option.key1);
          let loading = this.$layer.loading();
          let params = { logList: [] };
          let params2 = {};
          params2[this.option.key1] = flag ? num : undefined;
          params2[this.option.flag] = flag;
          params2["battIndex"] = 0;
          const monNum = this.option.monNum;
          params2["monNum"] = monNum;
          params["dataSetList"] = [params2];
          params["logList"].push({
            param: this.option.flag,
            paramCn: this.title,
            value: flag ? num : undefined,
            st: flag,
            monNum,
            battIndex: 0,
          });
          updateMon(params)
            .then((res) => {
              let { code, data, msg } = res.data;
              this.$layer.close(loading);
              this.$message(msg);
            })
            .catch((err) => {
              console.log(err);
              this.$layer.close(loading);
            });
          if (this.type < 4) {
            this.updateMon(flag, num);
          } else {
            this.updateDataHrStop(flag, num);
          }
        })
        .catch(() => {});
    },
    updateDataHrStop(flag, num) {
      let loading = this.$layer.loading();
      let params = { logList: [] };
      let params2 = {};
      params2[this.option.key1] = flag ? num : undefined;
      params2[this.option.flag] = flag;
      // params2["battIndex"] = 0;
      const monNum = this.option.monNum;
      params2["monNum"] = monNum;
      params["dataSetList"] = [params2];
      params["logList"].push({
        param: this.option.flag,
        paramCn: this.title,
        value: flag ? num : undefined,
        st: flag,
        monNum,
        // battIndex: 0,
      });
      updateDataHrStop(params)
        .then((res) => {
          let { code, data, msg } = res.data;
          this.$layer.close(loading);
          this.$message(msg);
        })
        .catch((err) => {
          console.log(err);
          this.$layer.close(loading);
        });
    },
    updateMon(flag, num) {
      let loading = this.$layer.loading();
      let params = { logList: [] };
      let params2 = {};
      params2[this.option.key1] = flag ? num : undefined;
      params2[this.option.flag] = flag;
      params2["battIndex"] = 0;
      const monNum = this.option.monNum;
      params2["monNum"] = monNum;
      params["dataSetList"] = [params2];
      params["logList"].push({
        param: this.option.flag,
        paramCn: this.title,
        value: flag ? num : undefined,
        st: flag,
        monNum,
        battIndex: 0,
      });
      updateMon(params)
        .then((res) => {
          let { code, data, msg } = res.data;
          this.$layer.close(loading);
          this.$message(msg);
        })
        .catch((err) => {
          console.log(err);
          this.$layer.close(loading);
        });
    },
  },
  mounted() {},
src/views/hrControl/index.vue
@@ -41,115 +41,65 @@
          </div>
        </panel>
        <panel class="panel mon" title="遥测量模拟(单体)">
          <div slot="tools" class="btn-grp">
            <el-radio-group
              v-model="battInfoType"
              class="radio-grp"
              size="mini"
          <div slot="leftTools" class="btn-grp">
            <gradient-btn
              size="xs"
              @click="selectAll('checkListMon', battInfoType)"
              >全选</gradient-btn
            >
              <el-radio-button :label="0">电压</el-radio-button>
              <el-radio-button :label="1">内阻</el-radio-button>
              <el-radio-button :label="2">温度</el-radio-button>
              <el-radio-button :label="3">剩余容量</el-radio-button>
              <el-radio-button :label="4">均衡电流</el-radio-button>
            </el-radio-group>
            <gradient-btn
              size="xs"
              @click="cancelSelectAll('checkListMon', battInfoType)"
              >取消全选</gradient-btn
            >
          </div>
          <div slot="tools" class="btn-grp">
            <gradient-btn
              size="xs"
              :disabled="
                !checkListMon[battInfoType].some((v) => v == true) ||
                !hasPermission
              "
              @click="batchMonSet(battInfoType, 1)"
              >批量给定</gradient-btn
            >
            <gradient-btn
              size="xs"
              :disabled="
                !checkListMon[battInfoType].some((v) => v == true) ||
                !hasPermission
              "
              @click="batchMonSet(battInfoType, 0)"
              >批量取消</gradient-btn
            >
          </div>
          <div class="content flex-c">
            <div class="banner" v-for="(item, idx) in 5" :key="'banner_' + idx" v-show="idx == battInfoType">
              <div class="btn-grp">
                <gradient-btn size="xs" @click="selectAll('checkListMon', idx)"
                  >全选</gradient-btn
                >
                <gradient-btn
                  size="xs"
                  @click="cancelSelectAll('checkListMon', idx)"
                  >取消全选</gradient-btn
                >
              </div>
              <div class="btn-grp">
                <gradient-btn
                  size="xs"
                  :disabled="
                    !checkListMon[idx].some((v) => v == true) || !hasPermission
                  "
                  @click="batchMonSet(idx, 1)"
                  >批量给定</gradient-btn
                >
                <gradient-btn
                  size="xs"
                  :disabled="
                    !checkListMon[idx].some((v) => v == true) || !hasPermission
                  "
                  @click="batchMonSet(idx, 0)"
                  >批量取消</gradient-btn
                >
              </div>
            <div class="banner">
              <el-radio-group
                v-model="battInfoType"
                class="radio-grp"
                size="mini"
              >
                <el-radio-button :label="0">电压</el-radio-button>
                <el-radio-button :label="1">内阻</el-radio-button>
                <el-radio-button :label="2">温度</el-radio-button>
                <el-radio-button :label="3">均衡电流</el-radio-button>
                <el-radio-button :label="4">终止剩余容量</el-radio-button>
                <el-radio-button :label="5">终止单体电压</el-radio-button>
                <el-radio-button :label="6">终止单体温度</el-radio-button>
              </el-radio-group>
            </div>
            <!-- <div class="banner" v-show="1 == battInfoType">
              <div class="btn-grp">
                <gradient-btn size="xs" @click="selectAll('checkListMon', 1)"
                  >全选</gradient-btn
                >
                <gradient-btn
                  size="xs"
                  @click="cancelSelectAll('checkListMon', 1)"
                  >取消全选</gradient-btn
                >
              </div>
              <div class="btn-grp">
                <gradient-btn
                  size="xs"
                  :disabled="
                    !checkListMon[1].some((v) => v == true) || !hasPermission
                  "
                  @click="batchMonSet(1, 1)"
                  >批量给定</gradient-btn
                >
                <gradient-btn
                  size="xs"
                  :disabled="
                    !checkListMon[1].some((v) => v == true) || !hasPermission
                  "
                  @click="batchMonSet(1, 0)"
                  >批量取消</gradient-btn
                >
              </div>
            </div>
            <div class="banner" v-show="2 == battInfoType">
              <div class="btn-grp">
                <gradient-btn size="xs" @click="selectAll('checkListMon', 2)"
                  >全选</gradient-btn
                >
                <gradient-btn
                  size="xs"
                  @click="cancelSelectAll('checkListMon', 2)"
                  >取消全选</gradient-btn
                >
              </div>
              <div class="btn-grp">
                <gradient-btn
                  size="xs"
                  :disabled="
                    !checkListMon[2].some((v) => v == true) || !hasPermission
                  "
                  @click="batchMonSet(2, 1)"
                  >批量给定</gradient-btn
                >
                <gradient-btn
                  size="xs"
                  :disabled="
                    !checkListMon[2].some((v) => v == true) || !hasPermission
                  "
                  @click="batchMonSet(2, 0)"
                  >批量取消</gradient-btn
                >
              </div>
            </div> -->
            <div class="grid1 scroller" v-for="(item, idx) in 5" :key="'grid_'+idx" v-show="idx == battInfoType">
            <div
              class="grid1 scroller"
              v-for="(item, idx) in 7"
              :key="'grid_' + idx"
              v-show="idx == battInfoType"
            >
              <yc-grid :count="monCount" :config="monProps[idx]">
                <template v-slot="{ data, index }">
                  <card-batt
                    :ref="'mon_type'+idx+'_' + index"
                    :ref="'mon_type' + idx + '_' + index"
                    :type="battInfoType"
                    :option="data[index]"
                    :checked.sync="checkListMon[idx][index]"
                    :datas="monData"
@@ -157,207 +107,265 @@
                </template>
              </yc-grid>
            </div>
            <!-- <div class="grid1 scroller" v-show="1 == battInfoType">
              <yc-grid :count="monCount" :config="monProps[1]">
                <template v-slot="{ data, index }">
                  <card-batt
                    :ref="'mon_type1_' + index"
                    :option="data[index]"
                    :checked.sync="checkListMon[1][index]"
                    :datas="monData"
                  ></card-batt>
                </template>
              </yc-grid>
            </div>
            <div class="grid1 scroller" v-show="2 == battInfoType">
              <yc-grid :count="monCount" :config="monProps[2]">
                <template v-slot="{ data, index }">
                  <card-batt
                    :ref="'mon_type2_' + index"
                    :option="data[index]"
                    :checked.sync="checkListMon[2][index]"
                    :datas="monData"
                  ></card-batt>
                </template>
              </yc-grid>
            </div> -->
          </div>
        </panel>
      </div>
      <panel class="panel right" title="遥控量设置">
        <div class="content">
          <el-row class="el_row" :gutter="20">
            <el-col class="el_col" :span="12">
              <div class="card3">
                <div class="card-title">核容装置放电</div>
                <div class="card-content">
                  <div class="item-row">
                    <div class="label">核容装置状态:</div>
                    <div class="value">{{ hrState }}</div>
                  </div>
                  <div class="item-row">
                    <div class="label">放电测试:</div>
                    <div class="btn-grp">
                      <gradient-btn
                        size="sm"
                        :disabled="!hasPermission || !canStart"
                        @click="setParam"
                        >开始放电</gradient-btn
                      >
                      <gradient-btn
                        active
                        size="sm"
                        :disabled="!hasPermission || !canStopDis"
                        @click="control(0)"
                        >停止放电</gradient-btn
                      >
      <div class="p-right flex-c">
        <panel class="panel top" title="遥控量设置">
          <div class="content">
            <el-row class="el_row" :gutter="20">
              <el-col class="el_col" :span="12">
                <div class="card3">
                  <div class="card-title">核容装置放电</div>
                  <div class="card-content">
                    <div class="item-row">
                      <div class="label">核容装置状态:</div>
                      <div class="value">{{ hrState }}</div>
                    </div>
                    <div class="item-row">
                      <div class="label">放电测试:</div>
                      <div class="btn-grp">
                        <gradient-btn
                          size="xs"
                          :disabled="!hasPermission || !canStart"
                          @click="setParam"
                          >开始放电</gradient-btn
                        >
                        <gradient-btn
                          active
                          size="xs"
                          :disabled="!hasPermission || !canStopDis"
                          @click="control(0)"
                          >停止放电</gradient-btn
                        >
                      </div>
                    </div>
                  </div>
                </div>
              </div>
            </el-col>
            <el-col class="el_col" :span="12">
              <div class="card3">
                <div class="card-title">核容装置内阻</div>
                <div class="card-content">
                  <div class="item-row">
                    <div class="label">核容装置状态:</div>
                    <div class="value">{{ hrState }}</div>
                  </div>
                  <div class="item-row">
                    <div class="label">内阻测试:</div>
                    <div class="btn-grp">
                      <gradient-btn
                        size="sm"
                        :disabled="!hasPermission || !canStart"
                        @click="control(1)"
                        >启动内阻测试</gradient-btn
                      >
                      <!-- <gradient-btn
                        active
                        size="sm"
                        :disabled="!hasPermission || !canStopRes"
                        @click="control(2)"
                        >停止内阻测试</gradient-btn
                      > -->
              </el-col>
              <el-col class="el_col" :span="12">
                <div class="card3">
                  <div class="card-title">核容装置内阻</div>
                  <div class="card-content">
                    <div class="item-row">
                      <div class="label">核容装置状态:</div>
                      <div class="value">{{ hrState }}</div>
                    </div>
                    <div class="item-row">
                      <div class="label">内阻测试:</div>
                      <div class="btn-grp">
                        <gradient-btn
                          size="xs"
                          :disabled="!hasPermission || !canStart"
                          @click="control(1)"
                          >启动内阻测试</gradient-btn
                        >
                        <!-- <gradient-btn
                          active
                          size="sm"
                          :disabled="!hasPermission || !canStopRes"
                          @click="control(2)"
                          >停止内阻测试</gradient-btn
                        > -->
                      </div>
                    </div>
                  </div>
                </div>
              </div>
            </el-col>
            <el-col class="el_col" :span="12">
              <div class="card3">
                <div class="card-title">核容装置充电</div>
                <div class="card-content">
                  <div class="item-row">
                    <div class="label">核容装置状态:</div>
                    <div class="value">{{ hrState }}</div>
                  </div>
                  <div class="item-row">
                    <div class="label">充电测试:</div>
                    <div class="btn-grp">
                      <gradient-btn
                        size="sm"
                        :disabled="!hasPermission || !canStart"
                        @click="control(3)"
                        >启动充电测试</gradient-btn
                      >
                      <gradient-btn
                        active
                        size="sm"
                        :disabled="!hasPermission || !canStopChar"
                        @click="control(4)"
                        >停止充电测试</gradient-btn
                      >
              </el-col>
              <el-col class="el_col" :span="12">
                <div class="card3">
                  <div class="card-title">核容装置充电</div>
                  <div class="card-content">
                    <div class="item-row">
                      <div class="label">核容装置状态:</div>
                      <div class="value">{{ hrState }}</div>
                    </div>
                    <div class="item-row">
                      <div class="label">充电测试:</div>
                      <div class="btn-grp">
                        <gradient-btn
                          size="xs"
                          :disabled="!hasPermission || !canStart"
                          @click="control(3)"
                          >启动充电测试</gradient-btn
                        >
                        <gradient-btn
                          active
                          size="xs"
                          :disabled="!hasPermission || !canStopChar"
                          @click="control(4)"
                          >停止充电测试</gradient-btn
                        >
                      </div>
                    </div>
                  </div>
                </div>
              </div>
            </el-col>
            <el-col class="el_col" :span="12">
              <div class="card3">
                <div class="card-title">核容装置重启</div>
                <div class="card-content">
                  <div class="item-row">
                    <div class="label">核容装置状态:</div>
                    <div class="value">{{ hrState }}</div>
                  </div>
                  <div class="item-row">
                    <div class="label">装置重启:</div>
                    <div class="btn-grp">
                      <gradient-btn
                        size="sm"
                        :disabled="!hasPermission || !canStart"
                        @click="control(5)"
                        >重启核容装置</gradient-btn
                      >
              </el-col>
              <el-col class="el_col" :span="12">
                <div class="card3">
                  <div class="card-title">核容装置重启</div>
                  <div class="card-content">
                    <div class="item-row">
                      <div class="label">核容装置状态:</div>
                      <div class="value">{{ hrState }}</div>
                    </div>
                    <div class="item-row">
                      <div class="label">装置重启:</div>
                      <div class="btn-grp">
                        <gradient-btn
                          size="xs"
                          :disabled="!hasPermission || !canStart"
                          @click="control(5)"
                          >重启核容装置</gradient-btn
                        >
                      </div>
                    </div>
                  </div>
                </div>
              </div>
            </el-col>
            <el-col class="el_col" :span="12">
              <div class="card3">
                <div class="card-title">核容停止原因模拟(正在开发中)</div>
                <div class="card-content">
                  <div class="item-row">
                    <div class="label">停止原因:</div>
                    <div class="value">
                      {{ stopReason[testStopTypeReal] || "未知" }}
              </el-col>
              <!-- <el-col class="el_col" :span="12">
                <div class="card3">
                  <div class="card-title">核容停止原因模拟(正在开发中)</div>
                  <div class="card-content">
                    <div class="item-row">
                      <div class="label">停止原因:</div>
                      <div class="value">
                        {{ stopReason[testStopTypeReal] || "未知" }}
                      </div>
                    </div>
                  </div>
                  <div class="item-row">
                    <div class="label">状态码:</div>
                    <div class="value">{{ testStopTypeReal }}</div>
                  </div>
                </div>
              </div>
            </el-col>
            <!-- <el-col class="el_col" :span="12">
              <div class="card3">
                <div class="card-title">核容装置IP配置</div>
                <div class="card-content">
                  <div class="item-row">
                    <div class="label">核容装置IP地址:</div>
                    <div class="value">192.168.10.112</div>
                  </div>
                  <div class="item-row">
                    <div class="label">核容装置IP网关:</div>
                    <div class="value">192.168.10.1</div>
                  </div>
                  <div class="item-row">
                    <div class="label">核容装置子网掩码:</div>
                    <div class="value">255.255.255.0</div>
                  </div>
                  <div class="item-row">
                    <div class="label">核容装置配置IP地址:</div>
                    <div class="value">192.168.10.112</div>
                  </div>
                  <div class="item-row">
                    <div class="label">核容装置配置IP网关:</div>
                    <div class="value">192.168.10.1</div>
                  </div>
                  <div class="item-row">
                    <div class="label">核容装置配置子网掩码:</div>
                    <div class="value">255.255.255.0</div>
                  </div>
                  <div class="item-row">
                    <div class="label">装置重启模拟:</div>
                    <div class="btn-grp">
                      <gradient-btn size="sm" :disabled="!hasPermission"
                        >暂时配置生效</gradient-btn
                      >
                      <gradient-btn active size="sm" :disabled="!hasPermission"
                        >永久配置生效</gradient-btn
                      >
                    <div class="item-row">
                      <div class="label">状态码:</div>
                      <div class="value">{{ testStopTypeReal }}</div>
                    </div>
                  </div>
                </div>
              </div>
            </el-col> -->
          </el-row>
        </div>
      </panel>
              </el-col> -->
              <!-- <el-col class="el_col" :span="12">
                <div class="card3">
                  <div class="card-title">核容装置IP配置</div>
                  <div class="card-content">
                    <div class="item-row">
                      <div class="label">核容装置IP地址:</div>
                      <div class="value">192.168.10.112</div>
                    </div>
                    <div class="item-row">
                      <div class="label">核容装置IP网关:</div>
                      <div class="value">192.168.10.1</div>
                    </div>
                    <div class="item-row">
                      <div class="label">核容装置子网掩码:</div>
                      <div class="value">255.255.255.0</div>
                    </div>
                    <div class="item-row">
                      <div class="label">核容装置配置IP地址:</div>
                      <div class="value">192.168.10.112</div>
                    </div>
                    <div class="item-row">
                      <div class="label">核容装置配置IP网关:</div>
                      <div class="value">192.168.10.1</div>
                    </div>
                    <div class="item-row">
                      <div class="label">核容装置配置子网掩码:</div>
                      <div class="value">255.255.255.0</div>
                    </div>
                    <div class="item-row">
                      <div class="label">装置重启模拟:</div>
                      <div class="btn-grp">
                        <gradient-btn size="sm" :disabled="!hasPermission"
                          >暂时配置生效</gradient-btn
                        >
                        <gradient-btn active size="sm" :disabled="!hasPermission"
                          >永久配置生效</gradient-btn
                        >
                      </div>
                    </div>
                  </div>
                </div>
              </el-col> -->
            </el-row>
          </div>
        </panel>
        <panel class="panel yx" title="遥信量模拟">
          <div slot="leftTools" class="btn-grp">
            <gradient-btn size="xs" @click="selectAll('checkList2')"
              >全选</gradient-btn
            >
            <gradient-btn size="xs" @click="cancelSelectAll('checkList2')"
              >取消全选</gradient-btn
            >
          </div>
          <div slot="tools" class="btn-grp">
            <gradient-btn
              size="xs"
              :disabled="!checkList2.some((v) => v == true) || !hasPermission"
              @click="batchYXSet(1)"
              >批量执行</gradient-btn
            >
            <gradient-btn
              size="xs"
              :disabled="!checkList2.some((v) => v == true) || !hasPermission"
              @click="batchYXSet(0)"
              >批量取消</gradient-btn
            >
          </div>
          <div class="content flex-c">
            <div class="grid1 scroller">
              <yc-grid :count="props3.length" :config="props3">
                <template v-slot="{ data, index }">
                  <card3
                    :ref="'group_yc_' + index"
                    :option="data[index]"
                    :checked.sync="checkList2[index]"
                    :datas="rtData"
                  ></card3>
                </template>
              </yc-grid>
            </div>
          </div>
        </panel>
        <panel class="panel alarm" title="告警模拟">
          <div slot="leftTools" class="btn-grp">
            <gradient-btn size="xs" @click="selectAll('checkListAlarm')"
              >全选</gradient-btn
            >
            <gradient-btn size="xs" @click="cancelSelectAll('checkListAlarm')"
              >取消全选</gradient-btn
            >
          </div>
          <div slot="tools" class="btn-grp">
            <gradient-btn
              size="xs"
              :disabled="
                !checkListAlarm.some((v) => v == true) || !hasPermission
              "
              @click="batchAlarmSet(1)"
              >批量执行</gradient-btn
            >
            <gradient-btn
              size="xs"
              :disabled="
                !checkListAlarm.some((v) => v == true) || !hasPermission
              "
              @click="batchAlarmSet(0)"
              >批量取消</gradient-btn
            >
          </div>
          <div class="content">
            <div class="grid1">
              <yc-grid :count="alarm.length" :config="alarm">
                <template v-slot="{ data, index }">
                  <card2
                    :ref="'alarm_' + index"
                    :option="data[index]"
                    :checked.sync="checkListAlarm[index]"
                    :datas="rsAlm"
                  ></card2>
                </template>
              </yc-grid>
            </div>
          </div>
        </panel>
      </div>
    </div>
    <el-dialog
      title="设置充放电参数"
@@ -368,7 +376,10 @@
      width="800px"
      center
    >
      <discharge-params :can-start="canStart"></discharge-params>
      <discharge-params
        v-if="paramVisible"
        :can-start="canStart"
      ></discharge-params>
    </el-dialog>
  </div>
</template>
@@ -379,17 +390,26 @@
import AlarmCard from "@/components/alarmCard.vue";
import gradientBtn from "@/components/gradientBtn.vue";
import card from "./components/card";
import card2 from "./components/card2";
import card3 from "./components/card3";
import cardBatt from "./components/cardBatt";
import IpCard from "./components/ipCard";
import dischargeParams from "./components/dischargeParams";
import props_const from "./js/const_props";
const { props1, props2, getPropList } = props_const;
const { props1, props2, props3, getPropList, alarm } = props_const;
import createWs from "@/assets/js/websocket/plus";
const WSMixin = createWs("ckRtAndSignalAndHr", "ckDevRsAndRtAlm");
import const_9100 from "./js/const_9100";
import { updateGroup, updateMon, control } from "./js/apis";
import {
  updateGroup,
  updateMon,
  control,
  setAlarm,
  updateDataHrStop,
  updateStateHrStop,
} from "./js/apis";
import changeBinaryBits from "@/assets/js/changeBinaryBits";
import setBitAtPositions from "@/assets/js/setBitAtPositions";
@@ -402,6 +422,8 @@
    AlarmCard,
    gradientBtn,
    card,
    card2,
    card3,
    cardBatt,
    IpCard,
    dischargeParams,
@@ -418,11 +440,18 @@
      rtData: {
        isEmpty: true,
      },
      rsAlm: {
        isEmpty: true,
      },
      props1,
      props2,
      checkListMon: [[], [], [], [], []],
      props3,
      alarm,
      checkListMon: [[], [], [], [], [], [], []],
      // checkList1_acdc: param_acdc.map(() => false),
      checkList1: props1.map(() => false),
      checkList2: props3.map(() => false),
      checkListAlarm: alarm.map(() => false),
      // checkList2_acdc: [],
      // checkList2_gp: [],
    };
@@ -488,7 +517,15 @@
          for (let i = 0, j = n; i < j; i++) {
            arr.push(false);
          }
          return [[...arr], [...arr], [...arr], [...arr], [...arr]];
          return [
            [...arr],
            [...arr],
            [...arr],
            [...arr],
            [...arr],
            [...arr],
            [...arr],
          ];
        })();
      }
    },
@@ -580,6 +617,20 @@
      this.monData = data4;
      this.testStopTypeReal = data3.testStopTypeReal;
    },
    onWSMessage2(res) {
      let {
        data: {
          rsAlmRes: {
            data2: [rsAlm],
          },
          rtAlmRes: {
            data2: [rtAlm],
          },
        },
      } = JSON.parse(res.data);
      // console.log(rsAlm, "=====data", rtAlm);
      this.rsAlm = rsAlm;
    },
    selectAll(list, idx) {
      if (idx == undefined) {
        this[list] = this[list].map(() => true);
@@ -642,35 +693,162 @@
        type: "warning",
      })
        .then(() => {
          let loading = this.$layer.loading();
          let params = { logList: [], dataSetList: [] };
          let checkList = this["checkListMon"][type];
          console.log(type, "xxx", type < 4);
          if (type < 4) {
            this.updateMon(type, setFlag);
          } else {
            this.updateDataHrStop(type, setFlag);
          }
        })
        .catch(() => {});
    },
    updateMon(type, setFlag) {
      let loading = this.$layer.loading();
      let params = { logList: [], dataSetList: [] };
      let checkList = this["checkListMon"][type];
      checkList
        .map((v, i) => ({ i, v }))
        .filter((v) => v.v)
        .forEach((v) => {
          let refName = `mon_type${type}_` + v.i;
          let $el = this.$refs[refName][0];
          let params2 = {};
          params2[$el.option.key1] = setFlag ? $el.num : undefined;
          params2[$el.option.flag] = setFlag ? 1 : 0;
          params2["battIndex"] = 0;
          params2["monNum"] = $el.option.monNum;
          params["dataSetList"].push(params2);
          params["logList"].push({
            param: $el.option.flag,
            paramCn: $el.title,
            value: setFlag ? $el.num : undefined,
            st: setFlag ? 1 : 0,
            monNum: $el.option.monNum,
            battIndex: 0,
          });
        });
      updateMon(params)
        .then((res) => {
          let { code, data, msg } = res.data;
          this.$layer.close(loading);
          this.$message(msg);
        })
        .catch((err) => {
          console.log(err);
          this.$layer.close(loading);
        });
    },
    updateDataHrStop(type, setFlag) {
      let loading = this.$layer.loading();
      let params = { logList: [], dataSetList: [] };
      let checkList = this["checkListMon"][type];
      checkList
        .map((v, i) => ({ i, v }))
        .filter((v) => v.v)
        .forEach((v) => {
          let refName = `mon_type${type}_` + v.i;
          let $el = this.$refs[refName][0];
          let params2 = {};
          params2[$el.option.key1] = setFlag ? $el.num : undefined;
          params2[$el.option.flag] = setFlag ? 1 : 0;
          // params2["battIndex"] = 0;
          params2["monNum"] = $el.option.monNum;
          params["dataSetList"].push(params2);
          params["logList"].push({
            param: $el.option.flag,
            paramCn: $el.title,
            value: setFlag ? $el.num : undefined,
            st: setFlag ? 1 : 0,
            monNum: $el.option.monNum,
            // battIndex: 0,
          });
        });
      updateDataHrStop(params)
        .then((res) => {
          let { code, data, msg } = res.data;
          this.$layer.close(loading);
          this.$message(msg);
        })
        .catch((err) => {
          console.log(err);
          this.$layer.close(loading);
        });
    },
    batchYXSet(setFlag) {
      let title = setFlag ? "确认批量给定?" : "确认批量取消给定?";
      this.$confirm(title, "提示", {
        type: "warning",
      })
        .then(() => {
          let loading = this.$layer.loading();
          let params = { logList: [] };
          let checkList = this.checkList2;
          checkList
            .map((v, i) => ({ i, v }))
            .filter((v) => v.v)
            .forEach((v) => {
              let refName = `mon_type${type}_` + v.i;
              let refName = "group_yc_" + v.i;
              let $el = this.$refs[refName];
              let params2 = {};
              params2[$el.option.key1] = setFlag ? $el.num : undefined;
              params2[$el.option.flag] = setFlag ? 1 : 0;
              params2["battIndex"] = 0;
              params2["monNum"] = $el.option.monNum;
              params["dataSetList"].push(params2);
              console.log($el);
              // params["battIndex"] = 0;
              params[$el.option.key1] = setFlag ? $el.num : undefined;
              params[$el.option.flag] = setFlag ? 1 : 0;
              params["logList"].push({
                param: $el.option.flag,
                paramCn: $el.title,
                value: setFlag ? $el.num : undefined,
                st: setFlag ? 1 : 0,
                monNum: $el.option.monNum,
                battIndex: 0,
              });
            });
          updateMon(params)
          updateStateHrStop(params)
            .then((res) => {
              let { code, data, msg } = res.data;
              this.$layer.close(loading);
              this.$message(msg);
            })
            .catch((err) => {
              console.log(err);
              this.$layer.close(loading);
            });
        })
        .catch(() => {});
    },
    batchAlarmSet(setFlag) {
      let title = setFlag ? "确认批量执行?" : "确认批量取消执行?";
      this.$confirm(title, "提示", {
        type: "warning",
      })
        .then(() => {
          let loading = this.$layer.loading();
          let params = { logList: [], rsAlmSet: {} };
          let checkList = this["checkListAlarm"];
          let arr = [];
          checkList
            .map((v, i) => ({ i, v }))
            .filter((v) => v.v)
            .forEach((v) => {
              let refName = "alarm_" + v.i;
              let $el = this.$refs[refName];
              arr.push({ $el });
            });
          arr.forEach((v) => {
            params.rsAlmSet[v.$el.option.key1] = setFlag ? 1 : undefined;
            params.rsAlmSet[v.$el.option.flag] = setFlag ? 1 : 0;
            params["logList"].push({
              param: v.$el.option.flag,
              paramCn: v.$el.title,
              fake: setFlag ? 1 : undefined,
              st: setFlag ? 1 : 0,
            });
          });
          setAlarm(params)
            .then((res) => {
              let { code, data, msg } = res.data;
              this.$layer.close(loading);
@@ -700,19 +878,33 @@
  color: #fff;
  // height: 100%;
  // flex: 1;
  &.right {
    margin-left: 10px;
  &.top {
    // margin-left: 10px;
    // flex: 1.24;
    flex: 1.1;
    // flex: 1;
    height: 300px;
    .content {
      height: 100%;
      padding: 10px 30px;
      padding: 8px 30px;
      position: relative;
      display: flex;
      flex-direction: column;
      justify-content: space-between;
    }
  }
  &.alarm {
    margin-top: 8px;
    height: 180px;
  }
  &.yx {
    margin-top: 8px;
    flex: 1;
  }
}
.p-right {
  flex: 1.1;
  margin-left: 10px;
}
.p-left {
  flex: 1;
@@ -758,7 +950,7 @@
    background: #011f39;
    display: flex;
    flex-direction: column;
    padding: 6px;
    padding: 2px 6px;
    .item-row {
      display: flex;
@@ -785,7 +977,8 @@
.banner {
  display: flex;
  justify-content: space-between;
  margin: -10px -10px 0 -10px;
  // margin: -10px -10px 0 -10px;
  margin-bottom: 10px;
}
.grid1 {
  flex: 1;
@@ -794,6 +987,6 @@
  overflow-y: auto;
}
.el_col:nth-child(n + 3) {
  margin-top: 20px;
  margin-top: 8px;
}
</style>
src/views/hrControl/js/apis.js
@@ -60,3 +60,40 @@
};
/**
 * 模拟告警
 * @returns
 */
export const setAlarm = (data) => {
  return axios({
    method: "POST",
    url: "CkpowerdevBattRsalarmSet/setDevAlmHrStop",
    data
  });
};
/**
 * 核容终止时设置单体数据
 * @returns
 */
export const updateDataHrStop = (data) => {
  return axios({
    method: "POST",
    url: "ckPowerDevBattRtStateSet/updateDataHrStop",
    data
  });
};
/**
 * 核容终止时设置组端  遥信量
 * @returns
 */
export const updateStateHrStop = (data) => {
  return axios({
    method: "POST",
    url: "ckPowerDevBattRtStateSet/updateStateHrStop",
    data
  });
};
src/views/hrControl/js/const_props.js
@@ -1,3 +1,6 @@
import const_9100 from "./const_9100";
const { stopReason } = const_9100;
// 交直流
const props1 = [
  {
@@ -17,7 +20,7 @@
    key0: "currDirReal",
    key1: "currDirFake",
    flag: "currDirSt",
    option: ['充电', '放电']
    option: ["充电", "放电"],
  },
  {
    label: "电流",
@@ -58,16 +61,127 @@
    flag: "monTmpSt",
  },
  {
    label: "单体N剩余容量",
    label: "单体N均衡电流",
    key0: "monJhCurrReal",
    key1: "monJhCurrFake",
    flag: "monJhCurrSt",
  },
  {
    label: "单体N终止剩余容量",
    key0: "monRestCapReal",
    key1: "monRestCapFake",
    flag: "monRestCapSt",
  },
  {
    label: "单体N均衡电流",
    key0: "monJhCurrReal",
    key1: "monJhCurrFake",
    flag: "monJhCurrSt",
    label: "单体N终止电压",
    key0: "testMonVolReal",
    key1: "testMonVolFake",
    flag: "testMonVolSt",
  },
  {
    label: "单体N终止温度",
    key0: "testMonTmpReal",
    key1: "testMonTmpFake",
    flag: "testMonTmpSt",
  },
];
const alarm = [
  {
    label: "常闭接触器K1告警",
    key0: "k1AlmReal",
    key1: "k1AlmFake",
    flag: "k1AlmSt",
  },
  {
    label: "通讯告警",
    key0: "devCommerrReal",
    key1: "devCommerrFake",
    flag: "devCommerrSt",
  },
  {
    label: "二极管D1告警",
    key0: "d1AlmReal",
    key1: "d1AlmFake",
    flag: "d1AlmSt",
  },
];
const props3 = [
  {
    label: "设备工作状态",
    key0: "devWorkStateReal",
    key1: "devWorkStateFake",
    flag: "devWorkStateSt",
    option: [
      "在线浮充",
      "预充电(限流充电)",
      "核容测试",
      "停电放电",
      "内阻测试",
      "K1/D1 测试",
    ],
  },
  {
    label: "核容终止原因",
    key0: "testStopTypeReal",
    key1: "testStopTypeFake",
    option: stopReason,
    flag: "testStopTypeSt",
  },
  {
    label: "终止在线电压",
    key0: "testOnlineVolReal",
    key1: "testOnlineVolFake",
    flag: "testOnlineVolSt",
  },
  {
    label: "终止组端电压",
    key0: "testGroupVolReal",
    key1: "testGroupVolFake",
    flag: "testGroupVolSt",
  },
  {
    label: "终止时已放电时间",
    key0: "testTimeLongReal",
    key1: "testTimeLongFake",
    flag: "testTimeLongSt",
  },
  {
    label: "终止时核容电流",
    key0: "testOverCurrReal",
    key1: "testOverCurrFake",
    flag: "testOverCurrSt",
  },
  {
    label: "终止时剩余容量",
    key0: "testOverRestCapReal",
    key1: "testOverRestCapFake",
    flag: "testOverRestCapSt",
  },
  {
    label: "K1触点电阻值",
    key0: "k1PointResReal",
    key1: "k1PointResFake",
    flag: "k1PointResSt",
  },
  {
    label: "K1触点测试电流",
    key0: "k1PointCurrReal",
    key1: "k1PointCurrFake",
    flag: "k1PointCurrSt",
  },
  {
    label: "D1导通压降",
    key0: "d1CondVolDpReal",
    key1: "d1CondVolDpFake",
    flag: "d1CondVolDpSt",
  },
  {
    label: "D1导通测试电流",
    key0: "d1CondTestCurrReal",
    key1: "d1CondTestCurrFake",
    flag: "d1CondTestCurrSt",
  },
];
@@ -79,11 +193,11 @@
    for (let i = 0; i < count; i++) {
      let idx = i + 1;
      sub.push({
        label: label.replace('N', idx),
        label: label.replace("N", idx),
        key0,
        key1,
        flag,
        monNum: idx
        monNum: idx,
      });
    }
    list.push(sub);
@@ -94,5 +208,7 @@
export default {
  props1,
  props2,
  props3,
  alarm,
  getPropList,
};
src/views/hrTestRecord/index.vue
@@ -1,114 +1,235 @@
<template>
  <div class="p-main flex-c">
    <panel class="panel p-content">
      <div class="panel-content flex-c">
        <div class="search">
          <div class="s-item">
            <div class="label">操作类型</div>
            <div class="value">
              <el-select
                v-model="cmdType"
                class="dark"
                size="mini"
                @change="getList"
                filterable
                placeholder="请选择"
              >
                <el-option label="全部" value=""></el-option>
                <el-option
                  v-for="(item, idx) in opInfo"
                  :key="'level_' + idx"
                  :label="item.label"
                  :value="item.value"
    <el-radio-group v-model="acTab" size="mini">
      <el-radio-button label="YC">遥测量</el-radio-button>
      <el-radio-button label="YX">遥信量</el-radio-button>
    </el-radio-group>
    <div class="p-container">
      <transition-group name="slide">
        <div class="page-content flex-r" key="yc" v-show="acTab == 'YC'">
          <panel class="panel p-content">
            <div class="panel-content flex-c">
              <div class="search">
                <div class="s-item">
                  <div class="label">操作类型</div>
                  <div class="value">
                    <el-select
                      v-model="cmdType"
                      class="dark"
                      size="mini"
                      @change="getYCList"
                      filterable
                      placeholder="请选择"
                    >
                      <el-option label="全部" value=""></el-option>
                      <el-option
                        v-for="(item, idx) in opInfo"
                        :key="'level_' + idx"
                        :label="item.label"
                        :value="item.value"
                      >
                      </el-option>
                    </el-select>
                  </div>
                </div>
                <div class="s-item">
                  <div class="label">测试日期</div>
                  <div class="value">
                    <el-date-picker
                      v-model="date1_1"
                      size="mini"
                      class="time_box dark"
                      type="date"
                      placeholder="选择日期"
                      @change="getYCList"
                      value-format="yyyy-MM-dd"
                    ></el-date-picker
                    >-
                    <el-date-picker
                      v-model="date1_2"
                      size="mini"
                      class="time_box dark"
                      type="date"
                      placeholder="选择日期"
                      @change="getYCList"
                      value-format="yyyy-MM-dd"
                    ></el-date-picker>
                  </div>
                </div>
                <div class="s-item">
                  <gradient-btn size="sm" @click="getYCList">查询</gradient-btn>
                </div>
              </div>
              <div class="table-wrap">
                <el-table
                  id="batteryrTimequeryTable"
                  stripe
                  size="small"
                  :data="table1.datas"
                  height="100%"
                  class="table-dark"
                  tooltip-effect="light"
                >
                </el-option>
              </el-select>
                  <el-table-column
                    label="序号"
                    type="index"
                    width="80"
                  ></el-table-column>
                  <el-table-column
                    v-for="header in table1.headers"
                    :key="header.prop"
                    :prop="header.prop"
                    :label="header.label"
                    :width="header.width"
                    :min-width="header.minWidth"
                    show-overflow-tooltip
                    align="center"
                  ></el-table-column>
                  <!-- <el-table-column
                    prop="cztime"
                    fixed="right"
                    width="240px"
                    align="center"
                    label="操作"
                  >
                    <template slot-scope="scope">
                      <el-button
                        class="yellow"
                        size="mini"
                        @click="details(scope.row)"
                        >详情</el-button
                      >
                    </template>
                  </el-table-column> -->
                </el-table>
              </div>
              <!-- 底部分页 -->
              <el-pagination
                class="pages center dark"
                :current-page="pageNum1"
                @size-change="handleSizeChange1"
                @current-change="handleCurrentChange1"
                :page-sizes="[10, 20, 30, 50, 100]"
                :page-size="pageSize1"
                layout="total, sizes, prev, pager, next, jumper"
                :total="total1"
              ></el-pagination>
            </div>
          </div>
          <div class="s-item">
            <div class="label">测试日期</div>
            <div class="value">
              <el-date-picker
                v-model="date1"
                size="mini"
                class="time_box dark"
                type="date"
                placeholder="选择日期"
                @change="getList"
                value-format="yyyy-MM-dd"
              ></el-date-picker
              >-
              <el-date-picker
                v-model="date2"
                size="mini"
                class="time_box dark"
                type="date"
                placeholder="选择日期"
                @change="getList"
                value-format="yyyy-MM-dd"
              ></el-date-picker>
            </div>
          </div>
          <div class="s-item">
            <gradient-btn size="sm" @click="getList">查询</gradient-btn>
          </div>
          </panel>
        </div>
        <div class="table-wrap">
          <el-table
            id="batteryrTimequeryTable"
            stripe
            size="small"
            :data="table.datas"
            height="100%"
            class="table-dark"
            tooltip-effect="light"
          >
            <el-table-column
              label="序号"
              type="index"
              width="80"
            ></el-table-column>
            <el-table-column
              v-for="header in table.headers"
              :key="header.prop"
              :prop="header.prop"
              :label="header.label"
              :width="header.width"
              :min-width="header.minWidth"
              show-overflow-tooltip
              align="center"
            ></el-table-column>
            <!-- <el-table-column
              prop="cztime"
              fixed="right"
              width="240px"
              align="center"
              label="操作"
            >
              <template slot-scope="scope">
                <el-button
                  class="yellow"
                  size="mini"
                  @click="details(scope.row)"
                  >详情</el-button
        <div class="page-content flex-r" key="yc" v-show="acTab == 'YX'">
          <panel class="panel p-content">
            <div class="panel-content flex-c">
              <div class="search">
                <!-- <div class="s-item">
                  <div class="label">操作类型</div>
                  <div class="value">
                    <el-select
                      v-model="cmdType"
                      class="dark"
                      size="mini"
                      @change="getYXList"
                      filterable
                      placeholder="请选择"
                    >
                      <el-option label="全部" value=""></el-option>
                      <el-option
                        v-for="(item, idx) in opInfo"
                        :key="'level_' + idx"
                        :label="item.label"
                        :value="item.value"
                      >
                      </el-option>
                    </el-select>
                  </div>
                </div> -->
                <div class="s-item">
                  <div class="label">测试日期</div>
                  <div class="value">
                    <el-date-picker
                      v-model="date2_1"
                      size="mini"
                      class="time_box dark"
                      type="date"
                      placeholder="选择日期"
                      @change="getYXList"
                      value-format="yyyy-MM-dd"
                    ></el-date-picker
                    >-
                    <el-date-picker
                      v-model="date2_2"
                      size="mini"
                      class="time_box dark"
                      type="date"
                      placeholder="选择日期"
                      @change="getYXList"
                      value-format="yyyy-MM-dd"
                    ></el-date-picker>
                  </div>
                </div>
                <div class="s-item">
                  <gradient-btn size="sm" @click="getYXList">查询</gradient-btn>
                </div>
              </div>
              <div class="table-wrap">
                <el-table
                  id="batteryrTimequeryTable"
                  stripe
                  size="small"
                  :data="table2.datas"
                  height="100%"
                  class="table-dark"
                  tooltip-effect="light"
                >
              </template>
            </el-table-column> -->
          </el-table>
                  <el-table-column
                    label="序号"
                    type="index"
                    width="80"
                  ></el-table-column>
                  <el-table-column
                    v-for="header in table2.headers"
                    :key="header.prop"
                    :prop="header.prop"
                    :label="header.label"
                    :width="header.width"
                    :min-width="header.minWidth"
                    show-overflow-tooltip
                    align="center"
                  ></el-table-column>
                  <!-- <el-table-column
                    prop="cztime"
                    fixed="right"
                    width="240px"
                    align="center"
                    label="操作"
                  >
                    <template slot-scope="scope">
                      <el-button
                        class="yellow"
                        size="mini"
                        @click="details(scope.row)"
                        >详情</el-button
                      >
                    </template>
                  </el-table-column> -->
                </el-table>
              </div>
              <!-- 底部分页 -->
              <el-pagination
                class="pages center dark"
                :current-page="pageNum2"
                @size-change="handleSizeChange2"
                @current-change="handleCurrentChange2"
                :page-sizes="[10, 20, 30, 50, 100]"
                :page-size="pageSize2"
                layout="total, sizes, prev, pager, next, jumper"
                :total="total2"
              ></el-pagination>
            </div>
          </panel>
        </div>
        <!-- 底部分页 -->
        <el-pagination
          class="pages center dark"
          :current-page="pageNum"
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
          :page-sizes="[10, 20, 30, 50, 100]"
          :page-size="pageSize"
          layout="total, sizes, prev, pager, next, jumper"
          :total="total"
        ></el-pagination>
      </div>
    </panel>
      </transition-group>
    </div>
  </div>
</template>
@@ -116,7 +237,7 @@
import Panel from "@/components/panel.vue";
import gradientBtn from "@/components/gradientBtn.vue";
import { getBattSetLog, getOpInfo } from "./js/apis";
import { getBattSetLog, getOpInfo, getHrStopAlmLog } from "./js/apis";
export default {
  name: "hrTestRecord",
@@ -126,14 +247,20 @@
  },
  data() {
    return {
      pageNum: 1,
      pageSize: 10,
      date1: "",
      date2: "",
      acTab: "YC",
      pageNum1: 1,
      pageSize1: 10,
      pageNum2: 1,
      pageSize2: 10,
      date1_1: "",
      date1_2: "",
      date2_1: "",
      date2_2: "",
      cmdType: "",
      opInfo: [],
      total: 0,
      table: {
      total1: 0,
      total2: 0,
      table1: {
        headers: [
          // {
          //   prop: "devName",
@@ -151,8 +278,48 @@
            minWidth: 180,
          },
          {
            prop: "value",
            prop: "value1",
            label: "设置值",
            minWidth: 180,
          },
          {
            prop: "createTime",
            label: "测控时间",
            width: 180,
          },
          // {
          //   prop: "almStartTime",
          //   label: "测控次数",
          //   width: 180,
          // },
          // {
          //   prop: "almConfirmedTime",
          //   label: "最后一次测控时间",
          //   width: 180,
          // },
        ],
        datas: [],
      },
      table2: {
        headers: [
          // {
          //   prop: "devName",
          //   label: "设备名称",
          //   minWidth: 180,
          // },
          {
            prop: "cmdName",
            label: "操作类型",
            width: 180,
          },
          {
            prop: "paramCn",
            label: "参数名称",
            minWidth: 180,
          },
          {
            prop: "stStr",
            label: "动作",
            minWidth: 180,
          },
          {
@@ -179,19 +346,55 @@
    // details() {
    //   this.$router.push("/data-record/power-details");
    // },
    getList() {
    getYXList() {
      let params = {
        pageNum: this.pageNum,
        pageSize: this.pageSize,
        cmdType: this.cmdType,
        createTime: this.date1
          ? this.date1 + " 00:00:00"
        pageNum: this.pageNum2,
        pageSize: this.pageSize2,
        startTime: this.date2_1
          ? this.date2_1 + " 00:00:00"
          : "2023-01-01 00:00:00",
        createTime1: this.date2
          ? this.date2 + " 23:59:59"
        endTime: this.date2_2
          ? this.date2_2 + " 23:59:59"
          : new Date().format("yyyy-MM-dd hh:mm:ss"),
      };
      console.log("=====9=", params, JSON.stringify(params));
      // console.log("=====9=", params, JSON.stringify(params));
      // this.SOCKET1.send(JSON.stringify(params));
      getHrStopAlmLog(params)
        .then((res) => {
          let {
            code,
            data,
            data2: { list, total },
          } = res.data;
          let list1 = [];
          let total1 = 0;
          if (code && data) {
            list1 = list.map((v) => {
              v.stStr = v.st ? "执行" : "取消执行";
              return v;
            });
            total1 = total;
          }
          this.table2.datas = list1;
          this.total2 = total1;
        })
        .catch((err) => {
          console.log(err);
        });
    },
    getYCList() {
      let params = {
        pageNum: this.pageNum1,
        pageSize: this.pageSize1,
        cmdType: this.cmdType,
        createTime: this.date1_1
          ? this.date1_1 + " 00:00:00"
          : "2023-01-01 00:00:00",
        createTime1: this.date1_2
          ? this.date1_2 + " 23:59:59"
          : new Date().format("yyyy-MM-dd hh:mm:ss"),
      };
      // console.log("=====9=", params, JSON.stringify(params));
      // this.SOCKET1.send(JSON.stringify(params));
      getBattSetLog(params)
        .then((res) => {
@@ -204,14 +407,16 @@
          let total1 = 0;
          if (code && data) {
            list1 = list.map((v) => {
              v.value = v.value || '--';
              v.paramCn = v.paramCn || '--';
              v.value1 = v.valueName
                ? `${v.valueName} [${v.value}]`
                : v.value || "--";
              v.paramCn = v.paramCn || "--";
              return v;
            });
            total1 = total;
          }
          this.table.datas = list1;
          this.total = total1;
          this.table1.datas = list1;
          this.total1 = total1;
        })
        .catch((err) => {
          console.log(err);
@@ -228,7 +433,7 @@
              value: v,
            }));
          }
          console.log(list,'list');
          console.log(list, "list");
          this.opInfo = list;
        })
        .catch((err) => {
@@ -248,25 +453,52 @@
        });
    },
    // 展示数据数量
    handleSizeChange(val) {
      this.pageSize = val;
      this.getList();
    handleSizeChange1(val) {
      this.pageSize1 = val;
      this.getYCList();
    },
    // 翻页
    handleCurrentChange(val) {
      this.pageNum = val;
      this.getList();
    handleCurrentChange1(val) {
      this.pageNum1 = val;
      this.getYCList();
    },
    // 展示数据数量
    handleSizeChange2(val) {
      this.pageSize2 = val;
      this.getYXList();
    },
    // 翻页
    handleCurrentChange2(val) {
      this.pageNum2 = val;
      this.getYXList();
    },
  },
  mounted() {
    this.getOpInfo();
    this.getList();
    this.getYCList();
    this.getYXList();
  },
};
</script>
<style scoped lang="less">
.slide-enter-active,
.slide-leave-active {
  transition: all 0.3s;
}
.slide-enter {
  transform: translateX(100%);
}
.slide-leave-to {
  transform: translateX(-100%);
}
.slide-enter-to {
  transform: translateX(0);
}
.p-main {
  height: 100%;
  .btn-grp {
@@ -327,6 +559,21 @@
      }
    }
  }
  .p-container {
    flex: 1;
    overflow: hidden;
    position: relative;
  }
  .page-content {
    height: 100%;
    & ~ .page-content {
      position: absolute;
      left: 0;
      top: 0;
      right: 0;
      bottom: 0;
    }
  }
  .p-content {
    flex: 1;
    margin-top: 4px;
src/views/hrTestRecord/js/apis.js
@@ -2,7 +2,7 @@
/**
 * 核容测试记录
 * 核容测试记录 遥测量
 * @returns
 */
export const getBattSetLog = (data) => {
@@ -24,3 +24,15 @@
  });
};
/**
 * 查询遥信量日志
 * @returns
 */
export const getHrStopAlmLog = (data) => {
  return axios({
    method: "POST",
    url: "ckpowerdevBattRsalarmSetLog/getHrStopAlmLog",
    data,
  });
};
src/views/realTime/index.vue
@@ -205,8 +205,8 @@
                        <el-radio-button :label="0">电压</el-radio-button>
                        <el-radio-button :label="1">内阻</el-radio-button>
                        <el-radio-button :label="2">温度</el-radio-button>
                        <el-radio-button :label="3">剩余容量</el-radio-button>
                        <el-radio-button :label="4">均衡电流</el-radio-button>
                        <el-radio-button :label="3">均衡电流</el-radio-button>
                        <!-- <el-radio-button :label="3">剩余容量</el-radio-button> -->
                      </el-radio-group>
                    </div>
                    <div class="batt-contain">
@@ -517,7 +517,10 @@
      cachedViews: (state) => state.tagsView.cachedViews,
    }),
    battInfoTypeStr() {
      return ["电压", "内阻", "温度", "剩余容量", "均衡电流"][
      // return ["电压", "内阻", "温度", "剩余容量", "均衡电流"][
      //   this.battInfoType
      // ];
      return ["电压", "内阻", "温度", "均衡电流"][
        this.battInfoType
      ];
    },
@@ -545,9 +548,9 @@
          monTmpReal,
          monTmpFake,
          monTmpSt,
          monRestCapReal,
          monRestCapFake,
          monRestCapSt,
          // monRestCapReal,
          // monRestCapFake,
          // monRestCapSt,
          monJhCurrReal,
          monJhCurrFake,
          monJhCurrSt,
@@ -555,10 +558,10 @@
        let vol = monVolSt ? monVolFake : monVolReal;
        let res = monResSt ? monResFake : monResReal;
        let tmp = monTmpSt ? monTmpFake : monTmpReal;
        let cap = monRestCapSt ? monRestCapFake : monRestCapReal;
        // let cap = monRestCapSt ? monRestCapFake : monRestCapReal;
        let curr = monJhCurrSt ? monJhCurrFake : monJhCurrReal;
        return [vol + "V", res + "Ω", tmp + "℃", cap + "AH", curr + "A"];
        // return [vol + "V", res + "Ω", tmp + "℃"];
        // return [vol + "V", res + "Ω", tmp + "℃", cap + "AH", curr + "A"];
        return [vol + "V", res + "Ω", tmp + "℃", curr + "A"];
      });
    },
  },