src/hooks/useElement.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/login/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/test/devCard.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/test/paramContent.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/test/testBatch.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/test/ytjRtInfo.vue | ●●●●● 补丁 | 查看 | 原始文档 | 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,19 +21,24 @@ info: { type: Object, required: true, } }, }); const testStates = computed(() => { if (1 == props.devType) { if (props.info.state.testPause) { return "暂停中"; } else if (props.info.state.isTesting) { return ["--", "放电测试", "充电测试"][props.info.state?.testType]; } else { let states = ["充电", "放电", "均衡"]; let [res1, res2] = [0, 1].map((v) => props.info.state ? states[props.info.state[v].workMode] || "--" : "--" ); return "--"; } } else { // 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}`; } }); @@ -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>