From bfd41b30fd6f5a1485b42da05c3d1758a3b22e4b Mon Sep 17 00:00:00 2001 From: kale Date: Sat, 17 Jun 2023 23:10:32 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E9=92=88=E5=AF=B9=E4=BC=A0=E6=84=9F?= =?UTF-8?q?=E5=99=A8=E5=88=A0=E9=99=A4=E5=92=8C=E5=AF=BC=E5=85=A5=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E8=BF=9B=E8=A1=8C=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iot/IotSensorInfoController.java | 1 + .../impl/IotSensorInfoServiceImpl.java | 26 ++++++++++++++++-- .../webapp/file/excel/传感器导入模板.xlsx | Bin 16241 -> 16376 bytes 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/lp/controller/iot/IotSensorInfoController.java b/src/main/java/com/lp/controller/iot/IotSensorInfoController.java index ca6427e..b230850 100644 --- a/src/main/java/com/lp/controller/iot/IotSensorInfoController.java +++ b/src/main/java/com/lp/controller/iot/IotSensorInfoController.java @@ -426,6 +426,7 @@ public class IotSensorInfoController extends BaseController { obj.setMtime(new Date()); resultMap = service.update("IotSensorInfo.update", obj) ; if(isOk(resultMap)){ + obj = ProCacheUtil.getCache(CacheName.SENSORINFO, obj.getId().toString(), obj); IotNodeInfoBO nodeDt = ProCacheUtil.getCache(CacheName.NODEINFO, obj.getNode_id().toString()); String port_id = (ObjectUtil.isNotEmpty(nodeDt) && nodeDt.getIot_protocal_category().equalsIgnoreCase("ProtocalXRxasn")) ? "" : "-"+obj.getPort_id(); diff --git a/src/main/java/com/lp/service/impl/IotSensorInfoServiceImpl.java b/src/main/java/com/lp/service/impl/IotSensorInfoServiceImpl.java index 04e290a..6d56754 100644 --- a/src/main/java/com/lp/service/impl/IotSensorInfoServiceImpl.java +++ b/src/main/java/com/lp/service/impl/IotSensorInfoServiceImpl.java @@ -193,6 +193,10 @@ public class IotSensorInfoServiceImpl extends BaseServiceImpl implements IotSens String[] fields = {"name","measure_unit_type","iot_sensor_type","devide_code","sensor_device_id","port_id","seq","sdata_degree","formula_up","formula_down","data_type","param_names","sdata","param_config","infos","store_strage"}; List list = ExcelUtil.getExcelInfo(file, IotImportSensorInfoBO.class, 0, 16, fields, 2) ; // 不能重复,并且不能已存在,先判断,然后在开始添加,文件内设备不重复,文件外不能跟已有重复 + List measure_unit_types = ProCacheUtil.getCache(CacheName.DICTIONARY_RELATION, "20", new ProDictionaryInfoBO()).getSub(); + List iot_sensor_types = ProCacheUtil.getCache(CacheName.DICTIONARY_RELATION, "24", new ProDictionaryInfoBO()).getSub(); + List store_strages = ProCacheUtil.getCache(CacheName.DICTIONARY_RELATION, "270", new ProDictionaryInfoBO()).getSub(); + for(IotImportSensorInfoBO obj : list){ if(!obj.validate()){ putStatusCode(resultMap, 10000); @@ -214,12 +218,28 @@ public class IotSensorInfoServiceImpl extends BaseServiceImpl implements IotSens putStatusMsg(resultMap, "传感器:["+obj.getSensor_device_id()+port_id+"]已经存在") ; return resultMap ; } + + if(obj.getData_type().equals("数据属性")){ + if(measure_unit_types.stream().noneMatch(v -> v.getName().equals(obj.getMeasure_unit_type()))){ + putStatusCode(resultMap, 10000); + putStatusMsg(resultMap, "传感器:["+obj.getSensor_device_id()+port_id+"]是数据属性,但是其单位未在数据字典中配置,请联系管理员") ; + return resultMap ; + } + if(iot_sensor_types.stream().noneMatch(v -> v.getName().equals(obj.getIot_sensor_type()))){ + putStatusCode(resultMap, 10000); + putStatusMsg(resultMap, "传感器:["+obj.getSensor_device_id()+port_id+"]是数据属性,但是其传感点类型未在数据字典中配置,请联系管理员") ; + return resultMap ; + } + + } + if(store_strages.stream().noneMatch(v -> v.getName().equals(obj.getStore_strage()))){ + putStatusCode(resultMap, 10000); + putStatusMsg(resultMap, "传感器:["+obj.getSensor_device_id()+port_id+"]是数据属性,但是其储存策略未在数据字典中配置,请联系管理员") ; + return resultMap ; + } } Set sensorSet = new HashSet<>(); - List measure_unit_types = ProCacheUtil.getCache(CacheName.DICTIONARY_RELATION, "20", new ProDictionaryInfoBO()).getSub(); - List iot_sensor_types = ProCacheUtil.getCache(CacheName.DICTIONARY_RELATION, "24", new ProDictionaryInfoBO()).getSub(); - List store_strages = ProCacheUtil.getCache(CacheName.DICTIONARY_RELATION, "270", new ProDictionaryInfoBO()).getSub(); for(IotImportSensorInfoBO obj : list){ String port_id = isXRxasn ? "" : "-" + obj.getPort_id(); if(!sensorSet.contains(obj.getSensor_device_id() + port_id)){ diff --git a/src/main/webapp/file/excel/传感器导入模板.xlsx b/src/main/webapp/file/excel/传感器导入模板.xlsx index caf09826c74e659bc01afd71b6fd9a401521ede8..3514247c9929903be0141f84f11f8b883e20a65b 100644 GIT binary patch delta 5304 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 b6ac{Vj{!*hzjXlFV(=+BR!lm{|NQ