Selaa lähdekoodia

新增对象信息bug修复,iot实时数据查询接口开发

linhuili 3 vuotta sitten
vanhempi
commit
de3ea0aa51

+ 14 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/basic/constant/IotUrlConstant.java

@@ -0,0 +1,14 @@
+package com.persagy.dmp.rwd.basic.constant;
+
+/**
+ * iot请求常量
+ * @author:linhuili
+ * @date:2021/8/12
+ */
+public class IotUrlConstant {
+
+    /**
+     * 查询实时数据
+     */
+    public static String QUERY_CUCCRENT_DATA = "/presentreportbatch_post";
+}

+ 24 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/basic/utils/MeterUtils.java

@@ -0,0 +1,24 @@
+package com.persagy.dmp.rwd.basic.utils;
+
+/**
+ * 表号功能号校验工具类
+ * @author:linhuili
+ * @date:2021/8/12
+ */
+public class MeterUtils {
+
+	/**
+	 * 表号功能号格式匹配
+	 * @param infoCodeValue
+	 * @return
+	 */
+	public static boolean matchFormat(String infoCodeValue){
+		// 判断信息点的值是不是表号-功能号格式
+		// 包含中划线且中划线不在开头结尾
+		int idx = infoCodeValue.indexOf("-");
+		if (idx < 1 || idx == infoCodeValue.length() - 1) {
+			return false;
+		}
+		return true;
+	}
+}

+ 7 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/define/service/IObjectTypeService.java

@@ -71,4 +71,11 @@ public interface IObjectTypeService {
      * @param idList 主键
      */
     void delete(List<String> idList);
+
+
+    /**
+     * 查询对象类型Map
+     * @return <code, name>
+     */
+    Map<String, String> queryObjTypeMap();
 }

+ 10 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/define/service/impl/ObjectTypeServiceImpl.java

@@ -67,6 +67,16 @@ public class ObjectTypeServiceImpl implements IObjectTypeService {
     }
 
     @Override
+    @Cacheable(key = "targetClass + methodName")
+    public Map<String, String> queryObjTypeMap() {
+        LambdaQueryWrapper<ObjectTypeDefine> wrapper = new LambdaQueryWrapper<>();
+        wrapper.select(ObjectTypeDefine::getId, ObjectTypeDefine::getCode, ObjectTypeDefine::getObjType);
+        wrapper.eq(ObjectTypeDefine::getValid, ValidEnum.TRUE.getType());
+        List<ObjectTypeDefine> voList = queryByCondition(wrapper);
+        return CollUtil.fieldValueAsMap(voList, "code", "objType");
+    }
+
+    @Override
     public Page queryByProjectAndApp(Page page, String projectId, String appId) {
         // TODO 分页查询使用ES
         QueryWrapper<ObjectTypeDefine> wrapper = new QueryWrapper<>();

+ 2 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/entity/ObjectDigital.java

@@ -31,6 +31,8 @@ public class ObjectDigital extends AuditableEntity {
     private String objType;
     /** 类型编码 */
     private String classCode;
+    /** 集团编码 */
+    private String groupCode;
     /** 组标识 */
     private Integer grouping;
     /** 边类型编码 */

+ 17 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/impl/ObjectDigitalServiceImpl.java

@@ -11,6 +11,7 @@ import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.JsonNodeFactory;
 import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.dmp.common.context.AppContext;
 import com.persagy.dmp.rwd.basic.constant.DigitalMessageConstant;
 import com.persagy.dmp.rwd.basic.utils.DigitalCommonUtils;
 import com.persagy.dmp.rwd.basic.utils.DigitalMessageHelper;
@@ -18,6 +19,7 @@ import com.persagy.dmp.rwd.define.service.IObjectInfoService;
 import com.persagy.dmp.common.constant.ValidEnum;
 import com.persagy.dmp.common.model.entity.BaseEntity;
 import com.persagy.dmp.define.entity.ObjectInfoDefine;
+import com.persagy.dmp.rwd.define.service.IObjectTypeService;
 import com.persagy.dmp.rwd.digital.dao.ObjectDigitalMapper;
 import com.persagy.dmp.rwd.digital.entity.ObjectDigital;
 import com.persagy.dmp.rwd.digital.service.IObjectDigitalService;
@@ -45,6 +47,8 @@ public class ObjectDigitalServiceImpl implements IObjectDigitalService {
     private DigitalMessageHelper messageSender;
     @Autowired
     private IObjectInfoService infoService;
+    @Autowired
+    private IObjectTypeService typeService;
 
     @Override
     public ObjectDigital load(String id) {
@@ -67,9 +71,17 @@ public class ObjectDigitalServiceImpl implements IObjectDigitalService {
             return null;
         }
         validateOnSave(voList, false);
+        //获取对象类型
+        Map<String, String> typeMap = typeService.queryObjTypeMap();
         voList.forEach(vo -> {
             // 生成ID
             vo.setId(DigitalCommonUtils.fetchObjectId(vo.getProjectId(), vo.getObjType()));
+            //设置项目id
+            vo.setProjectId(AppContext.getContext().getProjectId());
+            //设置集团编码
+            vo.setGroupCode(AppContext.getContext().getGroupCode());
+            //设置对象类型-objType
+            vo.setObjType(typeMap.get(vo.getClassCode()));
             // 新增
             dao.insert(vo);
             // 新增后消息
@@ -291,4 +303,9 @@ public class ObjectDigitalServiceImpl implements IObjectDigitalService {
             messageSender.sendMessage(DigitalMessageConstant.OPERATE_AFTER_DELETE, null, dbVO, false);
         });
     }
+
+    private void getDefaultValue(List<ObjectDigital> voList){
+
+    }
+
 }

+ 14 - 3
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/iot/controller/IotController.java

@@ -1,6 +1,4 @@
 package com.persagy.dmp.rwd.iot.controller;
-
-
 import com.persagy.dmp.common.constant.CommonConstant;
 import com.persagy.dmp.common.model.response.CommonResult;
 import com.persagy.dmp.common.utils.ParamCheckUtil;
@@ -13,6 +11,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -27,11 +26,23 @@ public class IotController {
 	@Autowired
 	private CurrentDataService currentDataService;
 
+	/**
+	 * 查询对象绑点信息点的实时数据
+	 * @param param
+	 * @return
+	 * @throws Exception
+	 */
 	@PostMapping("/data/current")
-	public CommonResult<List<CurrentDataModel>> current(@RequestBody List<CurrentDataModel> param) {
+	@Deprecated
+	public CommonResult<List<CurrentDataModel>> current(@RequestBody List<CurrentDataModel> param) throws Exception {
 		//基础参数校验
 		ParamCheckUtil.checkParam(CommonConstant.QUERY_GROUPCODE,CommonConstant.QUERY_PROJECTID);
+		//查询实时数据
 		List<CurrentDataModel> currentData = currentDataService.getCurrentData(param);
+		if(currentData == null || currentData.size()<=0){
+			return ResultHelper.multi(new ArrayList<>(),0);
+		}
 		return ResultHelper.multi(currentData,currentData.size());
 	}
+
 }

+ 2 - 2
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/iot/service/CurrentDataService.java

@@ -8,9 +8,9 @@ import java.util.List;
 public interface CurrentDataService {
 
     /**
-     * 查询实时数据
+     * 查询对象绑点信息点的实时数据
      * @param param
      * @return
      */
-    List<CurrentDataModel> getCurrentData(List<CurrentDataModel> param);
+    List<CurrentDataModel> getCurrentData(List<CurrentDataModel> param) throws Exception;
 }

+ 117 - 10
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/iot/service/impl/CurrentDataServiceImpl.java

@@ -1,11 +1,30 @@
 package com.persagy.dmp.rwd.iot.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.dmp.basic.model.QueryCriteria;
+import com.persagy.dmp.basic.utils.QueryCriteriaHelper;
 import com.persagy.dmp.common.context.AppContext;
+import com.persagy.dmp.common.exception.BusinessException;
+import com.persagy.dmp.mybatis.utils.ConditionUtil;
+import com.persagy.dmp.rwd.basic.constant.IotUrlConstant;
+import com.persagy.dmp.rwd.basic.utils.MeterUtils;
+import com.persagy.dmp.rwd.digital.entity.ObjectDigital;
+import com.persagy.dmp.rwd.digital.service.IObjectDigitalService;
 import com.persagy.dmp.rwd.iot.model.CurrentDataModel;
 import com.persagy.dmp.rwd.iot.service.CurrentDataService;
 import lombok.Getter;
 import lombok.Setter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
 
 import java.util.*;
 
@@ -17,21 +36,24 @@ import java.util.*;
 @Service
 public class CurrentDataServiceImpl implements CurrentDataService {
 
+    @Autowired
+    private IObjectDigitalService objectDigitalService;
+
+    //@Value("${persagy.iot.data.server}")
+    @Value("http://develop.persagy.com/iot-collect")
+    protected String iotDataServer;
+
     /**
-     * 查询实时数据
+     * 查询对象绑点信息点的实时数据
      * @param param
      * @return
      */
     @Override
-    public List<CurrentDataModel> getCurrentData(List<CurrentDataModel> param) {
+    public List<CurrentDataModel> getCurrentData(List<CurrentDataModel> param) throws Exception{
         if(param == null || param.size()<=0){
             return new ArrayList<>();
         }
-
-        String groupCode = AppContext.getContext().getGroupCode();
-        String projectId = AppContext.getContext().getProjectId();
-
-        //查询对象绑点信息点的实时数据
+        //表号功能号校验
         List<PointParam> parameters = new LinkedList<>();
         for (CurrentDataModel model : param) {
             if (model.getObjectId() == null) {
@@ -43,11 +65,80 @@ public class CurrentDataServiceImpl implements CurrentDataService {
                 model.setError("信息点编码不可为空");
                 continue;
             }
-
-            //表号功能号校验
-           // String infoCodeValue = getInfoCodeValue(groupCode, projectId, model.getObjectId(), infoCode);
+            //校验表号功能号是否存在
+            String infoCodeValue = getInfoCodeValue(model.getObjectId(), infoCode);
+            if(StringUtils.isEmpty(infoCodeValue)){
+                model.setError("value of infoCode[" + model.getObjectId() + ":" + infoCode + "] is null");
+                continue;
+            }
+            // 判断信息点的值是不是表号-功能号格式
+            model.setInfoValue(infoCodeValue);
+            if (!MeterUtils.matchFormat(infoCodeValue)) {
+                model.setError("value of infoCode[" + model.getObjectId() + ":" + infoCode + "][ " + infoCodeValue + "] 不是正确的表号功能号");
+                continue;
+            }
             parameters.add(new PointParam(model.getMeter(), model.getFunction()));
         }
+        if (parameters.size() == 0) {
+            return null;
+        }
+
+        //查询实时数据
+        String url = iotDataServer + IotUrlConstant.QUERY_CUCCRENT_DATA;
+        Map<String, Object> requestBody = new HashMap<>();
+        requestBody.put("building", AppContext.getContext().getProjectId().substring(2));
+        requestBody.put("points", parameters);
+        String response = HttpUtil.post(url,requestBody);
+        JSONArray result = fetchResult(response);
+
+        //绑定表号功能号
+        for (Object object : result) {
+            JSONObject item = (JSONObject) object;
+            String meter = item.getString("meter");
+            String funcid = item.getString("funcid");
+            for (CurrentDataModel model : param) {
+                if (meter.equals(model.getMeter()) && funcid.equals(model.getFunction())) {
+                    model.setData(item.get("data"));
+                    model.setTime(item.getString("receivetime"));
+                }
+            }
+        }
+        return param;
+    }
+
+    /**
+     * 查询信息点值
+     * @param objectId
+     * @param infoCode
+     * @return
+     * @throws Exception
+     */
+    private String getInfoCodeValue(String objectId,String infoCode) throws Exception {
+        //查询条件封装
+        QueryCriteria queryCriteria = new QueryCriteria();
+        ObjectNode criteria = JsonNodeFactory.instance.objectNode();
+        criteria.put("id",objectId);
+        criteria.put("valid",1);
+        queryCriteria.setCriteria(criteria);
+
+        //查询object对象
+        QueryWrapper<ObjectDigital> wrapper = new QueryWrapper<>();
+        // 添加所属项目条件
+        ConditionUtil.ensureProjectCriteria(wrapper);
+        // 转换查询条件
+        QueryCriteriaHelper.toWrapper(wrapper,queryCriteria);
+        List<ObjectDigital> data = objectDigitalService.queryByCondition(wrapper);
+
+        if(data == null || data.size()<=0){
+            return null;
+        }
+        if("classCode".equals(infoCode)){
+            return data.get(0).getClassCode();
+        }
+        ObjectNode jsonNodes = data.get(0).getInfos();
+        if(jsonNodes.has(infoCode)){
+            return jsonNodes.get(infoCode).toString();
+        }
         return null;
     }
 
@@ -65,4 +156,20 @@ public class CurrentDataServiceImpl implements CurrentDataService {
             this.funcid = function;
         }
     }
+
+    /**
+      * 提取结果
+     * @param response
+     * @return
+     */
+   private JSONArray fetchResult(String response) {
+        JSONObject responseObject = JSONObject.parseObject(response);
+        // 如果结果不成功,抛出失败结果
+        if(!StrUtil.equals("success", responseObject.getString("result"))) {
+            throw new BusinessException(responseObject.getString("message"));
+        }
+        JSONArray datas = responseObject.getJSONArray("data");
+        return CollUtil.isEmpty(datas) ? null : datas;
+    }
+
 }