From d0526b4e46b7c2569708a4eb20d58a3df5548908 Mon Sep 17 00:00:00 2001 From: George Date: Sat, 13 Dec 2025 19:33:12 +0800 Subject: [PATCH] =?UTF-8?q?20251213:=E6=95=B0=E6=8D=AE=E4=B8=AD=E5=BF=83-?= =?UTF-8?q?=E5=8E=86=E5=8F=B2=E8=AE=B0=E5=BD=95-=E8=AE=BE=E5=A4=87-?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E5=8E=86=E5=8F=B2=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iot/data/aspect/DeviceDebugLogAspect.java | 45 ++++++- .../datacenter/DataCenterController.java | 116 +++++++++++++++++- vue/.env.development | 2 +- vue/.env.production | 2 +- vue/.env.staging | 2 +- vue/package.json | 2 +- vue/src/lang/en-US/lg.json | 2 +- vue/src/lang/zh-CN/lg.json | 14 +-- vue/src/layout/components/Sidebar/Logo.vue | 2 +- vue/src/views/bigScreen/home.vue | 2 +- vue/src/views/dataCenter/history.vue | 5 +- vue/src/views/index.vue | 6 +- .../views/iot/device/instruction-parsing.vue | 107 ++++++++++++---- vue/src/views/iot/device/running-status.vue | 65 ++++++++-- vue/src/views/login.vue | 2 +- vue/src/views/oauthLogin/index.vue | 4 +- vue/src/views/oauthLogin/sso.vue | 4 +- vue/vue.config.js | 2 +- 18 files changed, 315 insertions(+), 69 deletions(-) diff --git a/fastbee-iot-data/src/main/java/com/fastbee/iot/data/aspect/DeviceDebugLogAspect.java b/fastbee-iot-data/src/main/java/com/fastbee/iot/data/aspect/DeviceDebugLogAspect.java index 21241ccf..339a9c76 100644 --- a/fastbee-iot-data/src/main/java/com/fastbee/iot/data/aspect/DeviceDebugLogAspect.java +++ b/fastbee-iot-data/src/main/java/com/fastbee/iot/data/aspect/DeviceDebugLogAspect.java @@ -158,11 +158,23 @@ public class DeviceDebugLogAspect { if (msg instanceof byte[]) { sourceData = ByteBufUtil.hexDump((byte[]) msg); } else { - sourceData = msg.toString(); + String msgStr = msg.toString(); + // 如果dataType是ascii,需要将ASCII字符串转换为HEX格式用于显示 + if ("ascii".equalsIgnoreCase(deviceMessage.getDataType())) { + // ASCII字符串转HEX + sourceData = asciiToHex(msgStr); + } else { + // 其他情况直接使用原字符串(可能是HEX格式) + sourceData = msgStr; + } } } } catch (Exception ex) { log.warn("处理原始数据失败: {}", ex.getMessage()); + // 如果转换失败,至少保存原始字符串 + if (deviceMessage.getMessage() != null) { + sourceData = deviceMessage.getMessage().toString(); + } } String errorMsg = e.getMessage(); @@ -395,6 +407,37 @@ public class DeviceDebugLogAspect { } } + /** + * 将ASCII字符串转换为HEX字符串 + * @param asciiStr ASCII字符串 + * @return HEX字符串(大写,每两个字符一组,用空格分隔) + */ + private String asciiToHex(String asciiStr) { + if (StringUtils.isEmpty(asciiStr)) { + return ""; + } + try { + StringBuilder hex = new StringBuilder(); + for (int i = 0; i < asciiStr.length(); i++) { + char c = asciiStr.charAt(i); + String hexByte = Integer.toHexString(c & 0xFF).toUpperCase(); + if (hexByte.length() == 1) { + hex.append("0"); + } + hex.append(hexByte); + // 每两个字节之间加一个空格,便于阅读 + if (i < asciiStr.length() - 1) { + hex.append(" "); + } + } + return hex.toString(); + } catch (Exception e) { + log.warn("ASCII转HEX失败: {}, ASCII字符串: {}", e.getMessage(), + StringUtils.isNotEmpty(asciiStr) ? StringUtils.substring(asciiStr, 0, 50) : ""); + return ""; + } + } + /** * 将16进制字符串转换为ASCII字符串 * @param hexStr 16进制字符串(可能包含空格) diff --git a/fastbee-open-api/src/main/java/com/fastbee/controller/datacenter/DataCenterController.java b/fastbee-open-api/src/main/java/com/fastbee/controller/datacenter/DataCenterController.java index f3964b4d..8c2d5005 100644 --- a/fastbee-open-api/src/main/java/com/fastbee/controller/datacenter/DataCenterController.java +++ b/fastbee-open-api/src/main/java/com/fastbee/controller/datacenter/DataCenterController.java @@ -159,8 +159,9 @@ public class DataCenterController { return; } - // 获取变量名称映射(identifier -> modelName) + // 获取变量名称映射(identifier -> modelName)和数据类型映射(identifier -> datatype) Map identifierNameMap = new LinkedHashMap<>(); + Map identifierTypeMap = new LinkedHashMap<>(); // 存储identifier到数据类型的映射 List headerList = new ArrayList<>(); if (deviceHistoryParam.getIdentifierList() != null && !deviceHistoryParam.getIdentifierList().isEmpty()) { @@ -169,7 +170,7 @@ public class DataCenterController { .map(DeviceHistoryParam.IdentifierVO::getIdentifier) .collect(Collectors.toList()); - // 查询物模型获取中文名称 + // 查询物模型获取中文名称和数据类型 if (deviceHistoryParam.getDeviceId() != null) { List thingsModelList = deviceService.listThingsModel(deviceHistoryParam.getDeviceId()); Map thingsModelMap = thingsModelList.stream() @@ -180,6 +181,12 @@ public class DataCenterController { String headerName = thingsModel != null && StringUtils.isNotEmpty(thingsModel.getModelName()) ? thingsModel.getModelName() : identifier; identifierNameMap.put(identifier, headerName); + // 获取数据类型 + String dataType = "string"; // 默认字符串类型 + if (thingsModel != null && thingsModel.getDatatype() != null && StringUtils.isNotEmpty(thingsModel.getDatatype().getType())) { + dataType = thingsModel.getDatatype().getType(); + } + identifierTypeMap.put(identifier, dataType); headerList.add(headerName); } } else { @@ -187,6 +194,7 @@ public class DataCenterController { headerList.addAll(identifierList); for (String identifier : identifierList) { identifierNameMap.put(identifier, identifier); + identifierTypeMap.put(identifier, "string"); // 默认字符串类型 } } } else if (!dataList.isEmpty()) { @@ -204,7 +212,7 @@ public class DataCenterController { } } - // 查询物模型获取中文名称 + // 查询物模型获取中文名称和数据类型 if (deviceHistoryParam.getDeviceId() != null) { List thingsModelList = deviceService.listThingsModel(deviceHistoryParam.getDeviceId()); Map thingsModelMap = thingsModelList.stream() @@ -215,6 +223,12 @@ public class DataCenterController { String headerName = thingsModel != null && StringUtils.isNotEmpty(thingsModel.getModelName()) ? thingsModel.getModelName() : identifier; identifierNameMap.put(identifier, headerName); + // 获取数据类型 + String dataType = "string"; // 默认字符串类型 + if (thingsModel != null && thingsModel.getDatatype() != null && StringUtils.isNotEmpty(thingsModel.getDatatype().getType())) { + dataType = thingsModel.getDatatype().getType(); + } + identifierTypeMap.put(identifier, dataType); headerList.add(headerName); } } else { @@ -222,6 +236,7 @@ public class DataCenterController { headerList.addAll(identifierSet); for (String identifier : identifierSet) { identifierNameMap.put(identifier, identifier); + identifierTypeMap.put(identifier, "string"); // 默认字符串类型 } } } @@ -246,11 +261,19 @@ public class DataCenterController { } } - // 按照identifierNameMap的顺序添加数据 + // 按照identifierNameMap的顺序添加数据,并根据数据类型转换 for (Map.Entry entry : identifierNameMap.entrySet()) { String identifier = entry.getKey(); Object value = valueMap.get(identifier); - rowData.add(value != null ? value : ""); + + // 根据数据类型转换值 + if (value != null) { + String dataType = identifierTypeMap.getOrDefault(identifier, "string"); + Object convertedValue = convertValueByType(value, dataType); + rowData.add(convertedValue); + } else { + rowData.add(""); + } } } exportDataList.add(rowData); @@ -280,4 +303,87 @@ public class DataCenterController { excelWriter.finish(); } + /** + * 根据数据类型转换值 + * @param value 原始值 + * @param dataType 数据类型(integer、decimal、string、bool、enum等) + * @return 转换后的值 + */ + private Object convertValueByType(Object value, String dataType) { + if (value == null) { + return ""; + } + + try { + switch (dataType) { + case "integer": + // 整数类型:转换为Integer + if (value instanceof Number) { + return ((Number) value).intValue(); + } else if (value instanceof String) { + String str = ((String) value).trim(); + if (str.isEmpty()) { + return ""; + } + // 尝试解析为整数 + try { + // 如果是小数,先转double再转int + if (str.contains(".")) { + return (int) Double.parseDouble(str); + } + return Integer.parseInt(str); + } catch (NumberFormatException e) { + // 如果无法解析,返回原值 + return value; + } + } + return value; + + case "decimal": + // 小数类型:转换为Double + if (value instanceof Number) { + return ((Number) value).doubleValue(); + } else if (value instanceof String) { + String str = ((String) value).trim(); + if (str.isEmpty()) { + return ""; + } + try { + return Double.parseDouble(str); + } catch (NumberFormatException e) { + // 如果无法解析,返回原值 + return value; + } + } + return value; + + case "bool": + // 布尔类型:转换为Boolean或字符串 + if (value instanceof Boolean) { + return value; + } else if (value instanceof Number) { + return ((Number) value).intValue() != 0; + } else if (value instanceof String) { + String str = ((String) value).trim().toLowerCase(); + if ("true".equals(str) || "1".equals(str) || "yes".equals(str)) { + return true; + } else if ("false".equals(str) || "0".equals(str) || "no".equals(str)) { + return false; + } + return value; + } + return value; + + case "string": + case "enum": + default: + // 字符串类型和其他类型:保持原样或转为字符串 + return value.toString(); + } + } catch (Exception e) { + // 转换失败时返回原值 + return value; + } + } + } diff --git a/vue/.env.development b/vue/.env.development index 07e51791..8b200d5d 100644 --- a/vue/.env.development +++ b/vue/.env.development @@ -1,6 +1,6 @@ # 开发环境配置 # 页面标题 -VUE_APP_TITLE = FastBee物联网平台 +VUE_APP_TITLE = 岩安测控数据平台 # 开发服务器端口 port = 80 diff --git a/vue/.env.production b/vue/.env.production index 72ff29ec..0b930a19 100644 --- a/vue/.env.production +++ b/vue/.env.production @@ -1,5 +1,5 @@ # 页面标题 -VUE_APP_TITLE = FastBee物联网系统 +VUE_APP_TITLE = 岩安测控数据平台 # 生产环境配置 ENV = 'production' diff --git a/vue/.env.staging b/vue/.env.staging index 9ed16276..81ba9127 100644 --- a/vue/.env.staging +++ b/vue/.env.staging @@ -1,5 +1,5 @@ # 页面标题 -VUE_APP_TITLE = FastBee物联网系统 +VUE_APP_TITLE = 岩安测控数据平台 NODE_ENV = production diff --git a/vue/package.json b/vue/package.json index 82898162..ad40bf14 100644 --- a/vue/package.json +++ b/vue/package.json @@ -1,7 +1,7 @@ { "name": "fastbee", "version": "3.8.5", - "description": "FastBee物联网平台", + "description": "岩安测控数据平台", "author": "kerwincui", "license": "AGPL3.0", "scripts": { diff --git a/vue/src/lang/en-US/lg.json b/vue/src/lang/en-US/lg.json index 94994ed0..a2d7fefc 100644 --- a/vue/src/lang/en-US/lg.json +++ b/vue/src/lang/en-US/lg.json @@ -112,7 +112,7 @@ "home.disk": "System disk usage rate", "home.diskStatus": "Disk status G", "home.available": "available", - "views.index.394840-0": "FastBee IoT Platform", + "views.index.394840-0": "YAN AN CE KONG IoT Platform", "views.index.394840-1": "The open source version adopts the AGPL-3.0 license agreement, and commercial use requires authorization", "views.index.394840-2": "Open source version:", "views.index.394840-3": "Can be used for personal learning and use, non-commercial purposes", diff --git a/vue/src/lang/zh-CN/lg.json b/vue/src/lang/zh-CN/lg.json index cbb05f37..c8b1fe40 100644 --- a/vue/src/lang/zh-CN/lg.json +++ b/vue/src/lang/zh-CN/lg.json @@ -36,11 +36,11 @@ "login.989807-34": "微信登录", "login.989807-35": "注册账号", "login.989807-36": "注册绑定账号", - "login.989807-37": "蜂信物联", - "login.989807-38": "FastBee开源物联网平台,简单易用,更适合中小企业和个人学习使用的物联网平台。", - "login.989807-39": "FastBee系统采用国内流行度最高的技术栈,帮助更多的企业实现设备联网控制和监测。", + "login.989807-37": "岩安测控数据平台", + "login.989807-38": "岩安测控数据平台,简单易用,更适合中小企业和个人学习使用的物联网平台。", + "login.989807-39": "岩安测控数据平台采用国内流行度最高的技术栈,帮助更多的企业实现设备联网控制和监测。", "register.974236-0": "账号注册", - "register.974236-1": "蜂信物联", + "register.974236-1": "岩安测控", "register.974236-2": "手机号码", "register.974236-3": "确认密码", "register.974236-4": "注 册", @@ -50,7 +50,7 @@ "register.974236-8": "查看文档", "register.974236-9": "账号登录", "register.974236-10": "绑定中...", - "register.974236-11": "FastBee开源物联网平台,简单易用,更适合中小企业和个人学习使用的物联网平台。", + "register.974236-11": "岩安测控数据平台,简单易用,更适合中小企业和个人学习使用的物联网平台。", "register.974236-12": "两次输入的密码不一致", "register.974236-13": "用户账号长度必须介于 2 和 20 之间", "register.974236-14": "请输入您的手机号码", @@ -112,7 +112,7 @@ "home.disk": "系统盘使用率", "home.diskStatus": "磁盘状态 G", "home.available": "可用", - "views.index.394840-0": "FastBee物联网平台", + "views.index.394840-0": "岩安测控数据平台", "views.index.394840-1": "开源版本采用AGPL-3.0许可协议,商用需要获得授权", "views.index.394840-2": "开源版本:", "views.index.394840-3": "可用于个人学习和使用,非商业用途", @@ -127,7 +127,7 @@ "views.index.394840-12": "系统源码", "views.index.394840-13": "Gitee源码", "views.index.394840-14": "Github源码", - "views.index.394840-15": "蜂信物联", + "views.index.394840-15": "岩安测控", "views.index.394840-16": "登录用户数量", "views.index.394840-17": "项目文档", "tagsView.refresh": "刷新", diff --git a/vue/src/layout/components/Sidebar/Logo.vue b/vue/src/layout/components/Sidebar/Logo.vue index 9bdda47f..da633aad 100644 --- a/vue/src/layout/components/Sidebar/Logo.vue +++ b/vue/src/layout/components/Sidebar/Logo.vue @@ -35,7 +35,7 @@ export default { }, data() { return { - title: 'FastBee', + title: '岩安测控', logo: logoImg, }; }, diff --git a/vue/src/views/bigScreen/home.vue b/vue/src/views/bigScreen/home.vue index 46dd3d8a..fcbe9993 100644 --- a/vue/src/views/bigScreen/home.vue +++ b/vue/src/views/bigScreen/home.vue @@ -10,7 +10,7 @@
- FastBee物联网平台 + 岩安测控数据平台
diff --git a/vue/src/views/dataCenter/history.vue b/vue/src/views/dataCenter/history.vue index 48e56d26..518c18c8 100644 --- a/vue/src/views/dataCenter/history.vue +++ b/vue/src/views/dataCenter/history.vue @@ -583,8 +583,9 @@ export default { return; } } - // 有效的Excel文件,直接下载 - const fileName = `设备历史数据_${moment().format('YYYYMMDDHHmmss')}.xlsx`; + // 有效的Excel文件,直接下载 - 使用设备编号作为文件名 + const deviceSerialNumber = devices.serialNumber || '设备数据'; + const fileName = `${deviceSerialNumber}_${moment().format('YYYYMMDDHHmmss')}.xlsx`; saveAs(res, fileName); this.$message.success('导出成功'); } else { diff --git a/vue/src/views/index.vue b/vue/src/views/index.vue index 9569a3b4..bc3d9de6 100644 --- a/vue/src/views/index.vue +++ b/vue/src/views/index.vue @@ -882,11 +882,11 @@ export default { } return res; }; - option = { + option = { title: { text: this.$t('home.onlineDevice') + this.deviceList.filter((x) => x.status == 3).length + ')', - subtext: 'Fastbee open source iot platform', - sublink: 'https://iot.fastbee.cn', + subtext: '岩安测控数据平台', + sublink: 'https://iot.fastbee.cn', // todo 替换为延安测控的官网 target: '_blank', textStyle: { color: '#333', diff --git a/vue/src/views/iot/device/instruction-parsing.vue b/vue/src/views/iot/device/instruction-parsing.vue index 3c308f7c..4fccc8e1 100644 --- a/vue/src/views/iot/device/instruction-parsing.vue +++ b/vue/src/views/iot/device/instruction-parsing.vue @@ -5,13 +5,13 @@
{{ $t('device.instruction-parsing.830424-0') }} {{ device.serialNumber }} - + {{ format }} - {{ item }} + {{ item }}
@@ -31,16 +31,19 @@
- -
+ +
HEX: {{ item.value }}
- -
+
ASCII:
{{ item.valueAscii }}
+
+ JSON: +
{{ formatJsonValue(item.value, item.valueAscii) }}
+
@@ -63,10 +66,11 @@
- + + {{ $t('device.instruction-parsing.830424-14') }} @@ -411,7 +415,7 @@ export default { //选中的格式 format: 'Hex', //格式列表 - formatList: ['Hex', 'JSON', 'Plaintext'], + formatList: ['Hex', 'JSON', 'ASCII'], //数据列表 logList: [], //发送的命令 @@ -499,6 +503,68 @@ export default { }; }, methods: { + /**处理updateData事件 */ + handleUpdateData(params) { + const { serialNumber, productId, data } = params; + if (serialNumber == this.device.serialNumber) { + this.logList.push({ + //0是下发,1是回复,2是上报 + type: 2, + time: formatDate(new Date()), + value: data.sources, // HEX格式 + valueAscii: data.sourcesAscii || '', // ASCII格式 + loading: false, + analysis: false, + //解析的数据数组 + analysisList: data.message, + }); + } + }, + /**处理格式切换 */ + handleFormatChange(command) { + this.format = command; + }, + /**格式化JSON值 */ + formatJsonValue(hexValue, asciiValue) { + // 优先尝试从ASCII值解析JSON + if (asciiValue) { + try { + const json = JSON.parse(asciiValue); + return JSON.stringify(json, null, 2); + } catch (e) { + // ASCII不是JSON,继续尝试HEX + } + } + // 尝试从HEX值解析JSON + if (hexValue) { + try { + // 先尝试直接解析 + const json = JSON.parse(hexValue); + return JSON.stringify(json, null, 2); + } catch (e) { + // 如果不是JSON字符串,尝试将HEX转为字符串再解析 + try { + const hexStr = hexValue.replace(/\s+/g, ''); + let jsonStr = ''; + for (let i = 0; i < hexStr.length; i += 2) { + const hexByte = hexStr.substr(i, 2); + const charCode = parseInt(hexByte, 16); + if (charCode >= 32 && charCode <= 126) { + jsonStr += String.fromCharCode(charCode); + } + } + if (jsonStr) { + const json = JSON.parse(jsonStr); + return JSON.stringify(json, null, 2); + } + } catch (e2) { + // 转换失败 + } + } + } + // 如果都不是JSON,返回提示信息 + return '数据不是有效的JSON格式'; + }, /**打开编辑框 */ openEdit() { this.resetCreateForm(); @@ -847,24 +913,14 @@ export default { }, mounted() { this.resetCreateForm(); - this.$busEvent.$on('updateData', (params) => { - const { serialNumber, productId, data } = params; - if (serialNumber == this.device.serialNumber) { - this.logList.push({ - //0是下发,1是回复,2是上报 - type: 2, - time: formatDate(new Date()), - value: data.sources, // HEX格式 - valueAscii: data.sourcesAscii || '', // ASCII格式 - loading: false, - analysis: false, - //解析的数据数组 - analysisList: data.message, - }); - } - }); + // 先移除旧的监听器,避免重复绑定 + this.$busEvent.$off('updateData', this.handleUpdateData); + // 绑定新的监听器 + this.$busEvent.$on('updateData', this.handleUpdateData); }, beforeDestroy() { + // 移除所有事件监听器 + this.$busEvent.$off('updateData', this.handleUpdateData); this.$busEvent.$off('updateMqttMessage'); }, }; @@ -1076,7 +1132,8 @@ $right-btn-color: #1890ff; font-family: 'Courier New', monospace; } - .ascii-value { + .ascii-value, + .json-value { margin: 0; padding: 8px; background-color: #f5f7fa; diff --git a/vue/src/views/iot/device/running-status.vue b/vue/src/views/iot/device/running-status.vue index d20a5ab3..e2c66d82 100644 --- a/vue/src/views/iot/device/running-status.vue +++ b/vue/src/views/iot/device/running-status.vue @@ -643,7 +643,7 @@ export default { // 对象类型 for (let n = 0; n < this.deviceInfo.thingsModels[k].datatype.params.length; n++) { if (this.deviceInfo.thingsModels[k].datatype.params[n].id == data[j].id) { - this.deviceInfo.thingsModels[k].datatype.params[n].shadow = msg.value; + this.deviceInfo.thingsModels[k].datatype.params[n].shadow = data[j].value; isComplete = true; break; } @@ -656,7 +656,7 @@ export default { for (let n = 0; n < this.deviceInfo.thingsModels[k].datatype.arrayParams.length; n++) { for (let m = 0; m < this.deviceInfo.thingsModels[k].datatype.arrayParams[n].length; m++) { if (this.deviceInfo.thingsModels[k].datatype.arrayParams[n][m].id == data[j].id) { - this.deviceInfo.thingsModels[k].datatype.arrayParams[n][m].shadow = msg.value; + this.deviceInfo.thingsModels[k].datatype.arrayParams[n][m].shadow = data[j].value; isComplete = true; break; } @@ -672,7 +672,7 @@ export default { let index = n > 9 ? String(n) : '0' + k; let prefix = 'array_' + index + '_'; if (this.deviceInfo.thingsModels[k].datatype.arrayParams[n][m].id == prefix + data[j].id) { - this.deviceInfo.thingsModels[k].datatype.arrayParams[n][m].shadow = msg.value; + this.deviceInfo.thingsModels[k].datatype.arrayParams[n][m].shadow = data[j].value; } } } @@ -681,7 +681,7 @@ export default { // 整数、小数和字符串类型数组 for (let n = 0; n < this.deviceInfo.thingsModels[k].datatype.arrayModel.length; n++) { if (this.deviceInfo.thingsModels[k].datatype.arrayModel[n].id == data[j].id) { - this.deviceInfo.thingsModels[k].datatype.arrayModel[n].shadow = msg.value; + this.deviceInfo.thingsModels[k].datatype.arrayModel[n].shadow = data[j].value; break; } } @@ -693,24 +693,43 @@ export default { if (this.deviceInfo.chartList[k].id.indexOf('array_') == 0) { // 数组类型匹配,例如:array_00_gateway_temperature if (this.deviceInfo.chartList[k].id == data[j].id) { - // let shadows = msg[j].value.split(","); - this.deviceInfo.chartList[k].shadow = msg.value; + this.deviceInfo.chartList[k].shadow = data[j].value; // 更新图表 for (let m = 0; m < this.monitorChart.length; m++) { if (data[j].id == this.monitorChart[m].data.id) { - let data = [ + // 更新数据对象 + this.monitorChart[m].data.value = data[j].value; + + // 确保数值是数字类型 + const numValue = Number(data[j].value) || 0; + + // 构建图表数据 + const chartData = [ { - value: msg.value, + value: numValue, name: this.monitorChart[m].data.name, }, ]; + + // 更新图表配置,包括detail部分 this.monitorChart[m].chart.setOption({ series: [ { - data: data, + data: chartData, + detail: { + formatter: '{value}' + ' ' + (this.deviceInfo.chartList[k].datatype.unit || ''), + }, }, ], + }, false); // false表示不合并,完全替换 + + // 强制刷新图表 + this.$nextTick(() => { + if (this.monitorChart[m] && this.monitorChart[m].chart) { + this.monitorChart[m].chart.resize(); + } }); + break; } } @@ -718,23 +737,43 @@ export default { } else { // 普通类型匹配 if (this.deviceInfo.chartList[k].id == data[j].id) { - this.deviceInfo.chartList[k].shadow = msg.value; + this.deviceInfo.chartList[k].shadow = data[j].value; // 更新图表 for (let m = 0; m < this.monitorChart.length; m++) { if (data[j].id == this.monitorChart[m].data.id) { - let data = [ + // 更新数据对象 + this.monitorChart[m].data.value = data[j].value; + + // 确保数值是数字类型 + const numValue = Number(data[j].value) || 0; + + // 构建图表数据 + const chartData = [ { - value: msg.value, + value: numValue, name: this.monitorChart[m].data.name, }, ]; + + // 更新图表配置,包括detail部分 this.monitorChart[m].chart.setOption({ series: [ { - data: data, + data: chartData, + detail: { + formatter: '{value}' + ' ' + (this.deviceInfo.chartList[k].datatype.unit || ''), + }, }, ], + }, false); // false表示不合并,完全替换 + + // 强制刷新图表 + this.$nextTick(() => { + if (this.monitorChart[m] && this.monitorChart[m].chart) { + this.monitorChart[m].chart.resize(); + } }); + break; } } diff --git a/vue/src/views/login.vue b/vue/src/views/login.vue index 5c6a16d8..0e008ce1 100644 --- a/vue/src/views/login.vue +++ b/vue/src/views/login.vue @@ -154,7 +154,7 @@
logo -

FastBee

+

岩安测控

{{ $t('login.989807-39') }}

logo diff --git a/vue/src/views/oauthLogin/index.vue b/vue/src/views/oauthLogin/index.vue index 3195885d..2d9ef3bf 100644 --- a/vue/src/views/oauthLogin/index.vue +++ b/vue/src/views/oauthLogin/index.vue @@ -7,10 +7,10 @@
logo
-
FastBee
+
岩安测控
- 开源物联网平台
+ 岩安测控数据平台
diff --git a/vue/src/views/oauthLogin/sso.vue b/vue/src/views/oauthLogin/sso.vue index a0611fe0..75a02838 100644 --- a/vue/src/views/oauthLogin/sso.vue +++ b/vue/src/views/oauthLogin/sso.vue @@ -9,10 +9,10 @@
logo
-
FastBee
+
岩安测控
- 开源物联网平台
+ 岩安测控数据平台
diff --git a/vue/vue.config.js b/vue/vue.config.js index 28def615..c78d9ba0 100644 --- a/vue/vue.config.js +++ b/vue/vue.config.js @@ -8,7 +8,7 @@ function resolve(dir) { const CompressionPlugin = require('compression-webpack-plugin'); const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin'); -const name = process.env.VUE_APP_TITLE || 'FastBee物联网平台'; // 网页标题 +const name = process.env.VUE_APP_TITLE || '岩安测控数据平台'; // 网页标题 const port = process.env.port || process.env.npm_config_port || 80; // 端口