he wei
2024-11-08 106374208e6e7265db3c00ddfa948c39b7c252ea
U 修改批量操作
6个文件已修改
324 ■■■■ 已修改文件
src/hooks/useElement.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/login/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/test/devCard.vue 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/test/paramContent.vue 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/test/testBatch.vue 190 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/test/ytjRtInfo.vue 82 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/hooks/useElement.js
@@ -7,6 +7,7 @@
    ElMessageBox.confirm(title, "系统提示", {
      confirmButtonText: "确定",
      type: "warning",
      showCancelButton: false,
      center: true,
    })
      .then(() => {
src/views/login/index.vue
@@ -79,7 +79,7 @@
          setId(res.data2.uid);
          setName(res.data2.uname);
          // TODO 密码要加密 取出后再解密
          // 是否记住密码
          if (remember.value) {
            add();
          } else {
src/views/test/devCard.vue
@@ -3,6 +3,10 @@
import { ref, computed } from "vue";
import formatSeconds from "@/assets/js/tools/formatSeconds";
import toFixed from "@/assets/js/tools/toFixed.js";
import const_digits from "@/assets/js/const/const_digits";
const { VOL, GROUPVOL, CURR_YT, CURR_JH } = const_digits;
const props = defineProps({
  devIdcode: {
    type: [String, Number],
@@ -17,20 +21,25 @@
  info: {
    type: Object,
    required: true,
  }
  },
});
const testStates = computed(() => {
  if (1 == props.devType) {
    return ["--", "放电测试", "充电测试"][props.info.state?.testType];
    if (props.info.state.testPause) {
      return "暂停中";
    } else if (props.info.state.isTesting) {
      return ["--", "放电测试", "充电测试"][props.info.state?.testType];
    } else {
      return "--";
    }
  } else {
    let states = ["充电", "放电", "均衡"];
    let [res1, res2] = [0, 1].map((v) =>
      props.info.state
        ? states[props.info.state[v].workMode] || "--"
        : "--"
    );
    return `组1:${res1}, 组2: ${res2}`;
    // let states = ["充电", "放电", "均衡"];
    // let [res1, res2] = [0, 1].map((v) =>
    //   props.info.state ? states[props.info.state[v].workMode] || "--" : "--"
    // );
    let [res1, res2] = [0, 1].map((v) => props.info.state[v].moduleStatus);
  return `组1:${res1}, 组2: ${res2}`;
  }
});
</script>
@@ -59,11 +68,11 @@
        <div class="info">
          <template v-if="1 == props.devType">
            <div class="item">
              {{ info.state.storageVoltage }}V
              {{ toFixed(info.state.storageVoltage, GROUPVOL) }}V
              <div class="link"></div>
            </div>
            <div class="item">
             {{ info.state.testCurrent }}A
              {{ toFixed(info.state.testCurrent, CURR_YT) }}A
              <div class="link"></div>
            </div>
            <div class="item">
@@ -104,7 +113,9 @@
        {{ onLine ? "在线" : "离线" }}
      </div>
      <div class="wrap" v-else>
        <div class="workstate">{{ info.state.isTesting ? testStates : '--' }}</div>
        <div class="workstate">
          {{ testStates }}
        </div>
        <icon-arrow-right class="icon"></icon-arrow-right>
      </div>
    </div>
src/views/test/paramContent.vue
@@ -392,13 +392,13 @@
        }
      });
      if (code && data && successList.length) {
        console.log(
          "failList",
          failList,
          "successList",
          successList,
          "============="
        );
        // console.log(
        //   "failList",
        //   failList,
        //   "successList",
        //   successList,
        //   "============="
        // );
        list.successList = successList;
        $message.success("操作成功");
        if (failList.length) {
src/views/test/testBatch.vue
@@ -7,7 +7,12 @@
import { useRoute, useRouter } from "vue-router";
import battCountContent from "./battCountContent.vue";
import { cancelContPl, controllerActmParam, stopA200ParamPl, pauseA200ParamPl } from "./api.js";
import {
  cancelContPl,
  controllerActmParam,
  stopA200ParamPl,
  pauseA200ParamPl,
} from "./api.js";
import useElement from "@/hooks/useElement.js";
const { $alert, $loading, $message, $confirm } = useElement();
@@ -38,6 +43,80 @@
    2: getItem(2),
  };
});
// TODO  均衡仪有几组  取选中列表中第一台在线的设备的数据
const onlyOneGroup = computed(() => {
  if (
    selectData.value[2].length == 0 ||
    !selectData.value[2].filter((v) => v.devOnline == 1).length
  ) {
    return true;
  }
  return (
    selectData.value[2].filter((v) => v.devOnline == 1)[0].state[0]
      .batteryCount == 1
  );
});
// 一体机 按钮可用控制 公共方法
function computeYT(someFn) {
  return computed(() => {
    let _type = devType.value;
    if (
      1 != _type ||
      !selectData.value[1].filter((v) => v.devOnline == 1).length
    ) {
      return false;
    } else {
      return selectData.value[1]
        .filter((v) => v.devOnline == 1)
        .some(someFn);
    }
  });
}
// 一体机 按钮可用控制 启动
const canStartYT = computeYT((v) => v.state.isTesting == 0);
// 一体机 按钮可用控制 暂停
const canPauseYT = computeYT((v) => v.state.isTesting == 1 && v.state.testPause == 0);
// 一体机 按钮可用控制 继续
const canContinueYT = computeYT((v) => v.state.testPause == 1);
// 一体机 按钮可用控制 停止
const canStopYT = computeYT((v) => v.state.isTesting == 1);
// 均衡仪 按钮可用控制 公共方法
function computeJH(someFn) {
  return computed(() => {
    let _type = devType.value;
    if (
      2 != _type ||
      !selectData.value[2].filter((v) => v.devOnline == 1).length
    ) {
      return false;
    } else {
      return selectData.value[2]
        .filter((v) => v.devOnline == 1)
        .some(someFn);
    }
  });
}
// 均衡仪 按钮可用控制 启动组1
const canStartJH1 = computeJH((v) => v.state[0].isTesting == 0);
// 均衡仪 按钮可用控制 启动组2
const canStartJH2 = computeJH((v) => v.state[1].isTesting == 0);
// 均衡仪 按钮可用控制 暂停组1
const canPauseJH1 = computeJH((v) => v.state[0].isTesting == 1 && v.state[0].isTestPause == 0);
// 均衡仪 按钮可用控制 暂停组2
const canPauseJH2 = computeJH((v) => v.state[1].isTesting == 1 && v.state[1].isTestPause == 0);
// 均衡仪 按钮可用控制 继续组1
const canContinueJH1 = computeJH((v) => v.state[0].isTestPause == 1);
// 均衡仪 按钮可用控制 继续组2
const canContinueJH2 = computeJH((v) => v.state[1].isTestPause == 1);
// 均衡仪 按钮可用控制 停止组1
const canStopJH1 = computeJH((v) => v.state[0].isTesting == 1);
// 均衡仪 按钮可用控制 停止组2
const canStopJH2 = computeJH((v) => v.state[1].isTesting == 1);
watch(devList, (val, old) => {
  // console.log("val ch", val, old, "=============");
  if ((val[1].length || val[2].length) && !(old[1].length || old[2].length)) {
@@ -152,7 +231,7 @@
}
const devs = computed(() => {
  return selectData.value[devType.value];
  return selectData.value[devType.value].filter((v) => v.devOnline == 1);
});
function goDetails(dev) {
@@ -173,7 +252,9 @@
}
function stopTest(groupIdx) {
  let devIds = devs.value.map((v) => v.devId);
  let devIds = devs.value
    .filter((v) => v.devOnline == 1 && v.state.isTesting == 1)
    .map((v) => v.devId);
  let loading = $loading();
  stopA200ParamPl(devIds)
    .then((res) => {
@@ -235,7 +316,14 @@
}
function pauseYtj(type) {
  let devIds = devs.value.map((v) => v.devId);
  let devIds = devs.value;
  if (type == 1) {
    devIds = devIds.filter(
      (v) => v.devOnline == 1 && v.state.isTesting == 1 && v.state.testPause == 0
    ).map((v) => v.devId);
  } else {
    devIds = devIds.filter((v) => v.devOnline == 1 && v.state.testPause == 1).map((v) => v.devId);
  }
  let loading = $loading();
  pauseA200ParamPl(devIds, type)
    .then((res) => {
@@ -271,7 +359,10 @@
    });
}
onMounted(() => {});
onMounted(() => {
  // $alert("请确认参与批量测试的设备与电池适合批量测试");
  $alert("请确认参与批量测试设备的测试参数与电池规格匹配");
});
onActivated(() => {
  if ($route.query.devType) {
    devType.value = $route.query.devType * 1;
@@ -352,20 +443,28 @@
          >
          <el-button
            size="small"
            :disabled="!selectData[devType].length"
            :disabled="!canStartYT"
            class="btn-start"
            @click="test"
            >启动测试</el-button
          >
          <el-button size="small" class="btn-start" @click="pauseYtj(1)"
          <el-button
            size="small"
            class="btn-start"
            @click="pauseYtj(1)"
            :disabled="!canPauseYT"
            >暂停测试</el-button
          >
          <el-button size="small" class="btn-start" @click="pauseYtj(2)"
          <el-button
            size="small"
            class="btn-start"
            @click="pauseYtj(2)"
            :disabled="!canContinueYT"
            >继续测试</el-button
          >
          <el-button
            size="small"
            :disabled="!selectData[devType].length"
            :disabled="!canStopYT"
            class="btn-start"
            @click="stopTest"
            >停止测试</el-button
@@ -375,6 +474,9 @@
          <el-button
            size="small"
            class="btn-start btn-grp1"
            :disabled="
              !selectData[devType].filter((v) => v.devOnline == 1).length
            "
            @click="setBattCount"
            >设置组数</el-button
          >
@@ -389,74 +491,65 @@
          <el-dropdown
            class="control-group grp1"
            type="primary"
            :disabled="!selectData[devType].length"
            trigger="click"
          >
            组1控制
            <template #dropdown>
              <el-dropdown-menu>
                <el-dropdown-item @click="test(0)">启动组1</el-dropdown-item>
                <el-dropdown-item @click="controlTest(0, 2)"
                <el-dropdown-item @click="test(0)" :disabled="!canStartJH1"
                  >启动组1</el-dropdown-item
                >
                <el-dropdown-item
                  @click="controlTest(0, 2)"
                  :disabled="!canPauseJH1"
                  >暂停组1</el-dropdown-item
                >
                <el-dropdown-item @click="controlTest(0, 3)"
                <el-dropdown-item
                  @click="controlTest(0, 3)"
                  :disabled="!canContinueJH1"
                  >继续组1</el-dropdown-item
                >
                <el-dropdown-item @click="controlTest(0, 4)"
                <el-dropdown-item
                  @click="controlTest(0, 4)"
                  :disabled="!canStopJH1"
                  >停止组1</el-dropdown-item
                >
              </el-dropdown-menu>
            </template>
          </el-dropdown>
          <!-- <el-button
            size="small"
            :disabled="!selectData[devType].length"
            class="btn-start btn-grp1"
            @click="test(0)"
            >启动组1</el-button
          >
          <el-button
            size="small"
            :disabled="!selectData[devType].length"
            class="btn-start btn-grp1"
            @click="test(0)"
            >暂停组1</el-button
          > -->
          <!-- 组2控制 -->
          <el-dropdown
            class="control-group grp2"
            type="primary"
            :disabled="!selectData[devType].length"
            v-if="!onlyOneGroup"
            trigger="click"
          >
            组2控制
            <template #dropdown>
              <el-dropdown-menu>
                <el-dropdown-item @click="test(1)">启动组2</el-dropdown-item>
                <el-dropdown-item @click="controlTest(1, 2)"
                <el-dropdown-item @click="test(1)" :disabled="!canStartJH2"
                  >启动组2</el-dropdown-item
                >
                <el-dropdown-item
                  @click="controlTest(1, 2)"
                  :disabled="!canPauseJH2"
                  >暂停组2</el-dropdown-item
                >
                <el-dropdown-item @click="controlTest(1, 3)"
                <el-dropdown-item
                  @click="controlTest(1, 3)"
                  :disabled="!canContinueJH2"
                  >继续组2</el-dropdown-item
                >
                <el-dropdown-item @click="controlTest(1, 4)"
                <el-dropdown-item
                  @click="controlTest(1, 4)"
                  :disabled="!canStopJH2"
                  >停止组2</el-dropdown-item
                >
              </el-dropdown-menu>
            </template>
          </el-dropdown>
          <!-- <el-button
            size="small"
            :disabled="!selectData[devType].length"
            class="btn-start btn-grp2"
            @click="test(1)"
            >启动组2</el-button
          >
          <el-button
            size="small"
            :disabled="!selectData[devType].length"
            class="btn-start btn-grp2"
            @click="test(1)"
            >停止组2</el-button
          > -->
        </template>
      </template>
      <div class="card-content">
@@ -711,7 +804,7 @@
    &.grp1 {
      margin-left: 8px;
    }
    cursor: pointer;
    // cursor: pointer;
    & > :deep(span) {
      color: #000;
      display: inline-block;
@@ -724,6 +817,11 @@
        background: rgb(0, 231, 112);
      }
    }
    &.is-disabled {
      & > :deep(span) {
        background: #ccc;
      }
    }
  }
}
</style>
src/views/test/ytjRtInfo.vue
@@ -1,5 +1,5 @@
<script setup>
import { ref, computed, watch, onMounted } from "vue";
import { ref, computed, watch, onMounted, onActivated } from "vue";
import ycCard from "@/components/ycCard.vue";
import useWebSocket from "@/hooks/useWebSocket.js";
import bar from "@/components/echarts/bar2.vue";
@@ -41,7 +41,6 @@
    return { monStates: [], devStates: {}, eventList: [] };
  }
});
const logList = computed(() => {
  let _list = rtDatas.value.eventList;
@@ -86,6 +85,13 @@
  battVolChart.value?.updateChart(mons, vols);
}
onActivated(() => {
  let reg = /^1/;
  if (reg.test(props.devId)) {
    sendData(JSON.stringify({ devId: props.devId, devType: 1 }));
  }
});
onMounted(() => {
  // sendData(JSON.stringify({ devId: props.devId, devType: 1 }));
});
@@ -110,14 +116,35 @@
      <transition-group :duration="300" name="slide-left">
        <div class="tab-content test-content" v-if="infoTab == 0">
          <div class="state" v-if="rtDatas.devStates.isTesting">
            <div :class="['item', { active: rtDatas.devStates.isTesting && 2 == rtDatas.devStates.testType }]">
            <div
              :class="[
                'item',
                {
                  active:
                    rtDatas.devStates.isTesting &&
                    2 == rtDatas.devStates.testType,
                },
              ]"
            >
              充电测试
            </div>
            <div :class="['item', { active: rtDatas.devStates.isTesting && 1 == rtDatas.devStates.testType }]">
            <div
              :class="[
                'item',
                {
                  active:
                    rtDatas.devStates.isTesting &&
                    1 == rtDatas.devStates.testType,
                },
              ]"
            >
              放电测试
            </div>
          </div>
          <div class="stop-reason" v-else><span class="label">停止原因:</span>{{ rtDatas.devStates.stopReason }}</div>
          <div class="stop-reason" v-else>
            <span class="label">停止原因:</span
            >{{ rtDatas.devStates.stopReason }}
          </div>
          <div class="content">
            <div class="item item1">
              <div class="label">Umax</div>
@@ -132,8 +159,12 @@
              </div>
            </div>
            <div class="item">
              <div class="label"><el-icon><icon-avg class="avg-icon" /></el-icon>U</div>
              <div class="value">{{ toFixed(rtDatas.devStates.avgMonVol, VOL) }}V</div>
              <div class="label">
                <el-icon><icon-avg class="avg-icon" /></el-icon>U
              </div>
              <div class="value">
                {{ toFixed(rtDatas.devStates.avgMonVol, VOL) }}V
              </div>
            </div>
            <div class="item-big">
              {{ toFixed(rtDatas.devStates.storageVoltage, GROUPVOL) }}
@@ -157,9 +188,7 @@
              </div>
            </div>
            <div class="border border-center">
              <div class="i label">
                电芯压差
              </div>
              <div class="i label">电芯压差</div>
              <div class="value">
                {{ rtDatas.devStates.diffBatteryVoltage }} mV
              </div>
@@ -197,7 +226,9 @@
              </div>
            </div>
            <div class="item">
              <div class="label"><el-icon><icon-avg class="avg-icon" /></el-icon>T</div>
              <div class="label">
                <el-icon><icon-avg class="avg-icon" /></el-icon>T
              </div>
              <div class="value">{{ rtDatas.devStates.avgMonTmp }}℃</div>
            </div>
          </div>
@@ -214,7 +245,9 @@
              {{ toFixed(rtDatas.devStates.minBatteryVoltage, VOL) }}V
            </div>
            <div class="label">平均值</div>
            <div class="value">{{ toFixed(rtDatas.devStates.avgMonVol, VOL) }}V</div>
            <div class="value">
              {{ toFixed(rtDatas.devStates.avgMonVol, VOL) }}V
            </div>
          </div>
          <div class="list-wrap posR">
            <div class="pos-full scroll">
@@ -251,7 +284,9 @@
              {{ toFixed(rtDatas.devStates.minBatteryVoltage, VOL) }}V
            </div>
            <div class="label">平均值</div>
            <div class="value">{{ toFixed(rtDatas.devStates.avgMonVol, VOL) }}V</div>
            <div class="value">
              {{ toFixed(rtDatas.devStates.avgMonVol, VOL) }}V
            </div>
          </div>
          <div class="chart-wrap">
            <bar ref="battVolChart" unit="V"></bar>
@@ -349,10 +384,10 @@
        text-align: center;
        background: #02a7f0;
        &.max {
          background: #438D29;
          background: #438d29;
        }
        &.min {
          background: #DBD608;
          background: #dbd608;
        }
      }
    }
@@ -386,10 +421,10 @@
        text-align: center;
        background: #02a7f0;
        &.max {
          background: #438D29;
          background: #438d29;
        }
        &.min {
          background: #DBD608;
          background: #dbd608;
        }
      }
    }
@@ -421,10 +456,10 @@
            padding: 2px 10px;
            border-radius: 6px;
            &.max {
              background: #438D29;
              background: #438d29;
            }
            &.min {
              background: #DBD608;
              background: #dbd608;
            }
          }
        }
@@ -638,7 +673,12 @@
/* 使用@keyframes定义动画 */
@keyframes colorChange {
  0%, 100% { color: red; }  /* 开始和结束时的颜色 */
  50% { color: #0ff; }      /* 中间状态的颜色 */
  0%,
  100% {
    color: red;
  } /* 开始和结束时的颜色 */
  50% {
    color: #0ff;
  } /* 中间状态的颜色 */
}
</style>