feat(空调控制): 实现空调控制功能并优化 SVG 数据加载- 新增 AirCondConstants 类,定义空调控制常量
- 修改 AirConditionerServiceImpl,使用常量替代硬编码值
- 更新 MQTT 消息发送逻辑,使用常量定义主题
- 优化 SVG 数据加载和处理逻辑,改进标签值更新方式
- 调整域名地址配置,支持生产环境 API
已添加1个文件
已修改4个文件
84 ■■■■ 文件已修改
zhitan-admin/src/main/resources/application.yml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zhitan-airconditioner/src/main/java/com/zhitan/airconditioner/common/AirCondConstants.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zhitan-airconditioner/src/main/java/com/zhitan/airconditioner/service/impl/AirConditionerServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zhitan-vue/src/views/svg/components/configure.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zhitan-vue/src/views/svg/components/configureView.vue 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zhitan-admin/src/main/resources/application.yml
@@ -12,7 +12,8 @@
  # éªŒè¯ç ç±»åž‹ math æ•°å­—计算 char å­—符验证
  captchaType: math
  # åŸŸååœ°å€
  domainName: http://127.0.0.1:8088
  # domainName: http://127.0.0.1:8088
  domainName: http://192.168.0.24:8888/prod-api
# å¼€å‘环境配置
server:
zhitan-airconditioner/src/main/java/com/zhitan/airconditioner/common/AirCondConstants.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
package com.zhitan.airconditioner.common;
public class AirCondConstants {
    public static final String COOL_OPEN = "0";
    public static final String HOT_OPEN = "1";
    public static final String OFF = "2";
    public static final String SEND_COMMAND_TOPIC = "lanbao/nygl/sevice/kt1/down";
}
zhitan-airconditioner/src/main/java/com/zhitan/airconditioner/service/impl/AirConditionerServiceImpl.java
@@ -4,6 +4,7 @@
import java.util.List;
import com.alibaba.fastjson2.JSONObject;
import com.zhitan.airconditioner.common.AirCondConstants;
import com.zhitan.airconditioner.domain.AirConditioner;
import com.zhitan.airconditioner.domain.AirConditionerLog;
import com.zhitan.airconditioner.mapper.AirConditionerLogMapper;
@@ -12,6 +13,8 @@
import com.zhitan.common.utils.DateUtils;
import com.zhitan.common.utils.SecurityUtils;
import com.zhitan.framework.mqtt.MqttClientUtil;
import com.zhitan.realtimedata.domain.TagValue;
import com.zhitan.realtimedata.service.RealtimeDatabaseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -31,6 +34,9 @@
    
    @Autowired
    private MqttClientUtil mqttClientUtil;
    @Autowired
    private RealtimeDatabaseService realtimeDatabaseService;
    /**
     * æŸ¥è¯¢ç©ºè°ƒæŽ§åˆ¶å™¨åˆ—表
@@ -176,19 +182,18 @@
            JSONObject jsonObject = JSONObject.parseObject(msg);
            JSONObject rwProt = jsonObject.getJSONObject("rw_prot");
            rwProt.put("id", airConditioner.getControllerId());
            if ("0".equals(mode)) {
            if (AirCondConstants.COOL_OPEN.equals(mode)) {
                rwProt.getJSONArray("w_data").getJSONObject(0).put("value", "1");
            } else if ("1".equals(mode)) {
            } else if (AirCondConstants.HOT_OPEN.equals(mode)) {
                rwProt.getJSONArray("w_data").getJSONObject(1).put("value", "1");
            } else if ("2".equals(mode)) {
            } else if (AirCondConstants.OFF.equals(mode)) {
                rwProt.getJSONArray("w_data").getJSONObject(2).put("value", "1");
            }
            // æž„建MQTT消息
            String topic = "lanbao/nygl/sevice/kt1/down";
            String message = jsonObject.toJSONString();
            
            // å‘送MQTT消息
            mqttClientUtil.sendMessage(topic, message, 2);
            mqttClientUtil.sendMessage(AirCondConstants.SEND_COMMAND_TOPIC, message, 2);
            
            // è®°å½•操作日志
            AirConditionerLog log = new AirConditionerLog();
zhitan-vue/src/views/svg/components/configure.vue
@@ -104,17 +104,19 @@
  /* ç›‘听xhr对象 */
  xhr.addEventListener("load", () => {
    svgHtml.value = xhr.responseText
    let values = xhr.responseXML.getElementsByTagName("text")
    let values = xhr.responseXML.getElementsByTagName("g")
    let tagTemps = []
    for (let i = 0; i < values.length; i++) {
      if (values[i].getAttribute("id") != undefined)
      let tag_id = values[i].getAttribute("id");
      // tag_id不为空并且以EV开关
      if (tag_id != undefined && tag_id.startsWith("EV")) {
        tagTemps.push({
          param: values[i].textContent,
          param: values[i].id.split("_")[0],
          tag: "",
          tagType: "COLLECT",
        })
    }
    console.log(tags.value.length, tagTemps.length)
    }
    if (tags.value.length === 0 || tags.value.length != tagTemps.length) {
      tags.value = []
      tags.value = tagTemps
zhitan-vue/src/views/svg/components/configureView.vue
@@ -45,10 +45,12 @@
}
function refresh() {
  //console.log("refresh", tagCodes.value)
  if (tagCodes.value.length === 0) {
    return
  }
  getLiveData(tagCodes.value).then((response) => {
   // console.log("tagCodes:::", tagCodes.value)
    if (response.code === 200) {
      if (response.data) {
        response.data.forEach((tagValue) => {
@@ -58,20 +60,39 @@
          } else {
            value = "0"
          }
       //   console.log("tagValue::",tagValue)
          let el = document.getElementById(tagValue.tagCode)
          if (el) {
            el.textContent = value
            // åˆ¤æ–­tagValue.tagCode是不是以old或seven或out开头
            if (tagValue.tagCode.startsWith("old") || tagValue.tagCode.startsWith("seven") || tagValue.tagCode.startsWith("out")) {
              // èŽ·å– el下的g标签下的text标签,赋值为value
              let svgTextElement = el.querySelector("g").querySelector("text");
              console.log("svgTextElement::",svgTextElement)
              svgTextElement.textContent = value;
            }else {
              if (parseFloat(value) > 0) {
                el.setAttribute("fill", "rgb(0,234,136)")
              }else {
                el.setAttribute("fill", "rgb(255,82,96)")
              }
            }
           // console.log("el::",el)
            // å°†el的fill属性设置为23
          }
        })
        //这块是单独加的 ç”¨æ¥å¤„理 æ²¡æœ‰æŒ‡æ ‡æˆ–者指标没有结果的 éƒ½è®¾ç½®0
        let allText = document.getElementsByTagName("text")
        for (let i = 0; i < allText.length; i++) {
          // console.log(i + "textContent=" + allText[i].textContent);
          if (allText[i].textContent == null || allText[i].textContent == "") {
            allText[i].textContent = "0"
          }
        }
        // let allText = document.getElementsByTagName("g")
        // for (let i = 0; i < allText.length; i++) {
        //   // console.log(i + "textContent=" + allText[i].textContent);
        //   if (allText[i].textContent == null || allText[i].textContent == "") {
        //     allText[i].textContent = "0"
        //   }
        // }
      }
    }
  })
@@ -101,12 +122,13 @@
  xhr.addEventListener("load", () => {
    const resXML = xhr.responseXML
    let svgDom = resXML.documentElement.cloneNode(true)
    let values = svgDom.getElementsByTagName("text")
    let values = svgDom.getElementsByTagName("g")
    for (let i = 0; i < values.length; i++) {
      let tag = tags.value.filter((f) => f.param === values[i].textContent)
      let tag_id = values[i].getAttribute("id");
      let tag = tags.value.filter((f) => f.param === values[i].id.split("_")[0])
      if (tag && tag.length > 0) {
        let tagCode = tag[0].tag
        values[i].textContent = ""
        if (tagCode) {
          values[i].setAttribute("id", tagCode)
          tagCodes.value.push(tagCode)