Преглед изворни кода

refactor(CacheCenter):缓存方法优化
fix(Equipment):设备表单字段为null时修改失败

HMY пре 9 месеци
родитељ
комит
bba3e3833e

+ 1 - 1
admin/src/main/java/com/dcs/hnyz/cache/CacheCenter.java

@@ -24,7 +24,7 @@ public class CacheCenter {
      * key: 小设备编码
      * value: 小设备对应的寄存器code列表
      */
-    public static final Map<String, List<String>> deviceToRegistersMap = new ConcurrentHashMap<>();
+    public static Map<String, List<String>> deviceToRegistersMap = new ConcurrentHashMap<>();
 
     /**
      * key: 寄存器code

+ 5 - 3
admin/src/main/java/com/dcs/hnyz/cache/builder/DeviceToRegistersMapBuilder.java

@@ -8,6 +8,7 @@ import com.dcs.hnyz.service.IEquipmentService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -28,18 +29,19 @@ public class DeviceToRegistersMapBuilder {
      * 构建并返回缓存
      */
     public Map<String, List<String>> build() {
-        CacheCenter.deviceToRegistersMap.clear();
         List<Equipment> equipmentList = equipmentService.selectEquipmentList(null);
+        Map<String, List<String>> deviceCodeToRegisterCodesMap = new HashMap<>();
         for (Equipment equipment : equipmentList) {
             if (!DeviceTypeEnum.TANK.getCode().equals(equipment.getEquipmentType())) {
                 //设备标识
                 String equipmentCode =equipment.getCode();
                 //设备下所有寄存器code集合
                 List<String> codes = equipmentParamService.getCodesByParentId(equipment.getEquipmentId());
-                CacheCenter.deviceToRegistersMap.put(equipmentCode, codes);
+                deviceCodeToRegisterCodesMap.put(equipmentCode, codes);
             }
         }
+        CacheCenter.deviceToRegistersMap= deviceCodeToRegisterCodesMap;
 //        log.info("设备code-->寄存器codeList映射关系缓存{}",CacheCenter.deviceToRegistersMap);
-        return CacheCenter.deviceToRegistersMap;
+        return deviceCodeToRegisterCodesMap;
     }
 }

+ 17 - 12
admin/src/main/java/com/dcs/hnyz/cache/builder/RegisterCodeMapBuilder.java

@@ -8,9 +8,11 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * RegisterCodeMapBuilder
@@ -27,28 +29,31 @@ public class RegisterCodeMapBuilder {
     @Autowired
     private IEquipmentParamService equipmentParamService;
     // 缓存存储
-    private final Map<Integer, String> registerCodeMap = new HashMap<>();
+    private Map<Long, String> registerCodeMap = new HashMap<>();
 
 
     /**
      * 构建并返回缓存
      */
-    public Map<Integer, String> build() {
-        registerCodeMap.clear();
+    public Map<Long, String> build() {
+        // 查询所有设备
         List<Equipment> equipmentList = equipmentService.selectEquipmentList(null);
-        for (Equipment equipment : equipmentList) {
-            if (!DeviceTypeEnum.TANK.getCode().equals(equipment.getEquipmentType())) {
-                String code = equipmentParamService.getCodeByParentId(equipment.getEquipmentId());
-                if (code != null) {
-                    registerCodeMap.put(Math.toIntExact(equipment.getEquipmentId()), code);
-                }
-            }
+
+        // 只取非 TANK 类型设备 ID
+        List<Long> validEquipmentIds = equipmentList.stream()
+                .filter(e -> !DeviceTypeEnum.TANK.getCode().equals(e.getEquipmentType()))
+                .map(Equipment::getEquipmentId)
+                .collect(Collectors.toList());
+
+        if (validEquipmentIds.isEmpty()) {
+            registerCodeMap = Collections.emptyMap();
+        }else {//  批量查询所有设备对应的 code
+            registerCodeMap = equipmentParamService.getCodeMapByParentIds(validEquipmentIds);
         }
-//        log.info("registerCodeMap 构建完成,缓存数量:{}", registerCodeMap.size());
         return registerCodeMap;
     }
 
-    public Map<Integer, String> getRegisterCodeMap() {
+    public Map<Long, String> getRegisterCodeMap() {
         return registerCodeMap;
     }
 

+ 3 - 3
admin/src/main/java/com/dcs/hnyz/domain/Equipment.java

@@ -1,8 +1,6 @@
 package com.dcs.hnyz.domain;
 
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableLogic;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -55,11 +53,13 @@ public class Equipment extends BaseEntity
     /** 对应plc的id */
     @Excel(name = "对应plc的id")
     @ApiModelProperty(value = "对应plc的id")
+    @TableField(updateStrategy = FieldStrategy.ALWAYS)
     private Long plcId;
 
     /** 通讯协议id */
     @Excel(name = "通讯协议id")
     @ApiModelProperty(value = "通讯协议id")
+    @TableField(updateStrategy = FieldStrategy.ALWAYS)
     private Long protocolId;
 
     /** 状态 0-启用,1-禁用*/

+ 7 - 0
admin/src/main/java/com/dcs/hnyz/service/IEquipmentParamService.java

@@ -98,4 +98,11 @@ public interface IEquipmentParamService
      * @return
      */
     Map<String,Object> getRegisterQuantity();
+
+    /**
+     * 批量查询所有设备对应的 code
+     * @param validEquipmentIds
+     * @return
+     */
+    Map<Long, String> getCodeMapByParentIds(List<Long> validEquipmentIds);
 }

+ 1 - 1
admin/src/main/java/com/dcs/hnyz/service/impl/ActionConfigServiceImpl.java

@@ -169,7 +169,7 @@ public class ActionConfigServiceImpl implements IActionConfigService {
      * @return 是否满足条件
      */
     public boolean evaluate(Condition condition,
-                            Map<Integer, String> deviceMap,
+                            Map<Long, String> deviceMap,
                             Map<String, EquipmentParamFormVO> plcData) {
         if (condition instanceof ConditionGroup) {//判断是否为组合条件
             ConditionGroup group = (ConditionGroup) condition;

+ 8 - 0
admin/src/main/java/com/dcs/hnyz/service/impl/EquipmentExtensionServiceImpl.java

@@ -62,6 +62,10 @@ public class EquipmentExtensionServiceImpl implements IEquipmentExtensionService
      */
     @Override
     public int insertEquipmentExtension(EquipmentExtension equipmentExtension) {
+        //设备id为空时不校验(单模型)
+        if(equipmentExtension.getEquipmentId() == null){
+            return equipmentExtensionMapper.insert(equipmentExtension);
+        }
         //新增数据时的校验
         Equipment e = new Equipment();
         e.setEquipmentId(equipmentExtension.getEquipmentId());
@@ -88,6 +92,10 @@ public class EquipmentExtensionServiceImpl implements IEquipmentExtensionService
      */
     @Override
     public int updateEquipmentExtension(EquipmentExtension equipmentExtension) {
+        //设备id为空时不校验
+        if(equipmentExtension.getEquipmentId() == null){
+            return equipmentExtensionMapper.updateById(equipmentExtension);
+        }
         //修改数据时的校验
         Equipment e = new Equipment();
         e.setEquipmentId(equipmentExtension.getEquipmentId());

+ 23 - 7
admin/src/main/java/com/dcs/hnyz/service/impl/EquipmentParamServiceImpl.java

@@ -138,7 +138,7 @@ public class EquipmentParamServiceImpl implements IEquipmentParamService {
     // TODO 根据设备id获取对应的主数据所在寄存器的唯一code(暂时只处理了传感器和阀门相关)
     @Override
     public String getCodeByParentId(Long parentId) {
-        if(parentId == null) {
+        if (parentId == null) {
             log.warn("parentId is null");
             return null;
         }
@@ -178,7 +178,7 @@ public class EquipmentParamServiceImpl implements IEquipmentParamService {
 
     @Override
     public Integer getSetCodeByParentId(Long parentId) {
-        if(parentId == null) {
+        if (parentId == null) {
             log.warn("parentId is null");
             return null;
         }
@@ -280,7 +280,7 @@ public class EquipmentParamServiceImpl implements IEquipmentParamService {
         LambdaQueryWrapper<EquipmentParam> wrapper = new LambdaQueryWrapper<>();
         wrapper.in(EquipmentParam::getDataType, dataTypes);
         wrapper.in(EquipmentParam::getParamType, RegisterTypeEnum.MASTER_DATA.getCode(), RegisterTypeEnum.SLAVE_DATA.getCode());
-        wrapper.eq(EquipmentParam::getStatus,GeneralStatus.ENABLE.getCode());
+        wrapper.eq(EquipmentParam::getStatus, GeneralStatus.ENABLE.getCode());
         return equipmentParamMapper.selectList(wrapper);
     }
 
@@ -288,17 +288,33 @@ public class EquipmentParamServiceImpl implements IEquipmentParamService {
     public Map<String, Object> getRegisterQuantity() {
         Map<String, Object> map = new HashMap<>();
         //查询目前传感器数量
-        int sensorNum_now= Math.toIntExact(equipmentParamMapper.selectCount(null));
-        map.put("value",sensorNum_now);
+        int sensorNum_now = Math.toIntExact(equipmentParamMapper.selectCount(null));
+        map.put("value", sensorNum_now);
         //昨日传感器数量
         LocalDate today = LocalDate.now();
         LocalDateTime startOfDay = today.atStartOfDay();
-        LambdaQueryWrapper<EquipmentParam> w=new LambdaQueryWrapper<>();
+        LambdaQueryWrapper<EquipmentParam> w = new LambdaQueryWrapper<>();
         w.lt(EquipmentParam::getCreateTime, startOfDay);
         int sensorNum_yesterday = Math.toIntExact(equipmentParamMapper.selectCount(w));
         //今日传感器数量变化
-        map.put("trend",sensorNum_now-sensorNum_yesterday);
+        map.put("trend", sensorNum_now - sensorNum_yesterday);
         return map;
     }
 
+    @Override
+    public Map<Long, String> getCodeMapByParentIds(List<Long> validEquipmentIds) {
+        if (CollectionUtils.isEmpty(validEquipmentIds)) {
+            return Collections.emptyMap();
+        }
+        Map<Long, String> result = new HashMap<>();
+        for (Long id : validEquipmentIds) {
+            String code = getCodeByParentId(id);
+            if (code != null) {
+                result.put(id, code);
+            }
+        }
+        return result;
+    }
+
+
 }

+ 11 - 0
common/src/main/java/com/dcs/common/handler/MyMetaObjectHandler.java

@@ -8,6 +8,8 @@ import org.springframework.stereotype.Component;
 
 import java.time.LocalDateTime;
 import java.util.Date;
+import java.util.Objects;
+import java.util.function.Supplier;
 
 /**
  * MyMetaObjectHandler
@@ -46,4 +48,13 @@ public class MyMetaObjectHandler implements MetaObjectHandler {
         this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
         this.strictUpdateFill(metaObject, "updateBy", String.class, username);
     }
+
+    @Override
+    public MetaObjectHandler strictFillStrategy(MetaObject metaObject, String fieldName, Supplier<?> fieldVal) {
+            Object obj = fieldVal.get();
+            if (Objects.nonNull(obj)) {
+                metaObject.setValue(fieldName, obj);
+            }
+        return this;
+    }
 }

+ 3 - 6
ui/src/views/dcsForm2/equipment/index.vue

@@ -106,7 +106,7 @@
           <el-input v-model="form.code" placeholder="请输入标识码" />
         </el-form-item>
         <el-form-item label="设备种类" prop="equipmentType">
-          <el-select v-model="form.equipmentType" placeholder="请选择设备种类">
+          <el-select v-model="form.equipmentType" placeholder="请选择设备种类" clearable>
             <el-option v-for="dict in equipment_type" :key="dict.value" :label="dict.label"
               :value="dict.value"></el-option>
           </el-select>
@@ -124,7 +124,7 @@
           </el-select>
         </el-form-item>
         <el-form-item label="通讯协议" prop="protocolId">
-          <el-select v-model="form.protocolId" placeholder="请选择通讯协议">
+          <el-select v-model="form.protocolId" placeholder="请选择通讯协议" clearable>
             <el-option v-for="dict in commProtocolOptions" :key="dict.protocolId" :label="dict.protocolName"
               :value="dict.protocolId"></el-option>
           </el-select>
@@ -241,9 +241,6 @@ const data = reactive({
     equipmentType: [
       { required: true, message: "请选择设备类型", trigger: "blur" }
     ],
-    plcId: [
-      { required: true, message: "请输入对应plc的id", trigger: "blur" },
-    ]
   }
 });
 
@@ -391,7 +388,7 @@ function toDetail(code) {
   console.log(code)
   router.push({
     path: '/index',
-    query: { code } 
+    query: { code }
   })
 }