Ver código fonte

新增 爱迪智农管式墒情设备对接

zhaiyifei 1 ano atrás
pai
commit
4118f4ad66

+ 203 - 0
src/main/java/com/yunfeiyun/agmp/iots/device/serviceImp/AdznGssqService.java

@@ -0,0 +1,203 @@
+package com.yunfeiyun.agmp.iots.device.serviceImp;
+
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.yunfeiyun.agmp.common.utils.DateUtils;
+import com.yunfeiyun.agmp.common.utils.StringUtils;
+import com.yunfeiyun.agmp.common.utils.spring.SpringUtils;
+import com.yunfeiyun.agmp.iot.common.constant.devicetype.ServiceNameConst;
+import com.yunfeiyun.agmp.iot.common.domain.IotAdznGssqdata;
+import com.yunfeiyun.agmp.iot.common.domain.IotDevice;
+import com.yunfeiyun.agmp.iot.common.enums.EnumAdznGssqElement;
+import com.yunfeiyun.agmp.iot.common.enums.IotDeviceStatusTypeEnum;
+import com.yunfeiyun.agmp.iot.common.service.MongoService;
+import com.yunfeiyun.agmp.iots.common.annotate.HttpCore;
+import com.yunfeiyun.agmp.iots.core.http.HttpClient;
+import com.yunfeiyun.agmp.iots.service.IIotDeviceService;
+import com.yunfeiyun.agmp.iots.service.IotDeviceAddressService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+@Slf4j
+@Service
+@HttpCore(serviceName = ServiceNameConst.SERVICE_ADZN_GSSQ)
+public class AdznGssqService extends HttpClient {
+
+//    @Autowired
+//    private MongoService mongoService;
+//
+//    @Autowired
+//    private IIotDeviceService iotDeviceService;
+
+
+    public JSONObject requestPost(String url, Map<String, Object> payload) {
+        JSONObject configJson = getClientConfig();
+        log.info("【爱迪智农管式墒情配置】:{}", configJson);
+        String baseurl = configJson.getString("baseurl");
+        String userID = configJson.getString("userID");
+        if(StringUtils.isEmpty(baseurl) && StringUtils.isEmpty(userID)) {
+            log.info("【爱迪智农管式墒情】:{} \n {}", "未配置相关参数!", configJson);
+        }
+
+        String sendUrl = baseurl + url;
+        payload.put("userID", userID);
+
+        String response = HttpUtil.createPost(sendUrl).form(payload).execute().body();
+        log.info("【爱迪智农管式墒情】:{} {} \n {}", payload, "请求结果:", response);
+        return JSONObject.parseObject(response);
+    }
+
+    public JSONArray getDevList(){
+        String url = "/getDevList";
+        Map<String, Object> payload = new HashMap<>();
+        JSONObject jsonObject = requestPost(url, payload);
+        JSONArray devListArray = jsonObject.getJSONArray("devList");
+        JSONArray devList = new JSONArray();
+        if(devListArray != null && !devListArray.isEmpty()){
+            devList = devListArray;
+        }
+        return devList;
+    }
+
+    public JSONObject getDevLastData(String devCode){
+        String url = "/getDevLastData";
+        Map<String, Object> payload = new HashMap<>();
+        payload.put("devID", devCode);
+        JSONObject jsonObject = requestPost(url, payload);
+        JSONArray devLastDataArray = jsonObject.getJSONArray("devLastData");
+        JSONObject devLastData = null;
+        if(devLastDataArray != null && !devLastDataArray.isEmpty()){
+            devLastData = devLastDataArray.getJSONObject(0);
+        }
+        return devLastData;
+    }
+
+    public List<IotAdznGssqdata> parseDevListData(IotDevice iotDevice){
+        List<IotAdznGssqdata> iotAdznGssqdataList = new ArrayList<>();
+        String devCode = iotDevice.getDevCode();
+        JSONObject devLastData = getDevLastData(devCode);
+        if(devLastData == null){
+            return iotAdznGssqdataList;
+        }
+
+        String time = devLastData.getString("TIME");
+        Date timeDate = DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS, time);
+        String[] keys = {"DataATM", "DataAT", "DataATS", "DataTEMPStr", "DataSWCStr"};
+        int ekey = 1;
+        for(String key : keys){
+            EnumAdznGssqElement adznGssqElement = EnumAdznGssqElement.findEnumByeName(key);
+            if(adznGssqElement == null){
+                continue;
+            }
+
+            if("DataTEMPStr".equals(key) || "DataSWCStr".equals(key)) {
+                String[] temp = devLastData.getString(key).split(",");
+                for (String value : temp) {
+                    String eKey = "e" + ekey;
+                    IotAdznGssqdata iotAdznGssqdata = new IotAdznGssqdata();
+                    iotAdznGssqdata.setDevBid(iotDevice.getDevBid());
+                    iotAdznGssqdata.setDevBid(iotDevice.getDevBid());
+                    iotAdznGssqdata.setTime(timeDate);
+                    iotAdznGssqdata.setENum(adznGssqElement.geteNum());
+                    iotAdznGssqdata.setEName(adznGssqElement.geteName());
+                    iotAdznGssqdata.setEValue(value);
+                    iotAdznGssqdata.setEKey(eKey);
+
+                    iotAdznGssqdataList.add(iotAdznGssqdata);
+
+                    ekey += 1;
+                }
+            }else{
+                String eKey = "e" + ekey;
+                String value = devLastData.getString(key);
+                IotAdznGssqdata iotAdznGssqdata = new IotAdznGssqdata();
+                iotAdznGssqdata.setDevBid(iotDevice.getDevBid());
+                iotAdznGssqdata.setTime(timeDate);
+                iotAdznGssqdata.setENum(adznGssqElement.geteNum());
+                iotAdznGssqdata.setEName(adznGssqElement.geteName());
+                iotAdznGssqdata.setEValue(value);
+                iotAdznGssqdata.setEKey(eKey);
+
+                iotAdznGssqdataList.add(iotAdznGssqdata);
+
+                ekey += 1;
+            }
+        }
+        return iotAdznGssqdataList;
+    }
+
+
+    /**
+     * 同步设备数据
+     * @param iotDeviceList
+     */
+    public void syncDeviceData(List<IotDevice> iotDeviceList){
+        JSONArray devArray = getDevList();
+        if(devArray == null || devArray.isEmpty()){
+            return;
+        }
+        Map<String, Object> devMap = new HashMap<>();
+        for(int i = 0; i < devArray.size(); i++){
+            JSONObject dev = devArray.getJSONObject(i);
+            String devCode = dev.getString("devID");
+            devMap.put(devCode, dev);
+        }
+        IotDeviceAddressService iotDeviceAddressService = SpringUtils.getBean(IotDeviceAddressService.class);
+        List<IotAdznGssqdata> iotAdznGssqdataList = new ArrayList<>();
+        List<IotDevice> updateList = new ArrayList<>();
+        for(IotDevice iotDevice : iotDeviceList){
+            List<IotAdznGssqdata> childList = parseDevListData(iotDevice);
+
+            log.info("【爱迪智农管式墒情】解析数据:{} \n {}", iotDevice, childList);
+
+            if(childList != null && !childList.isEmpty()){
+                IotAdznGssqdata iotAdznGssqdata = childList.get(0);
+                Date updateTime = iotAdznGssqdata.getTime();
+                String devUpdateddate = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, updateTime);
+                String oldUpdateddate = iotDevice.getDevUpdateddate();
+                if(StringUtils.isNotEmpty(oldUpdateddate) && DateUtils.compareDateStr(devUpdateddate, oldUpdateddate)){
+                    continue;
+                }
+                iotAdznGssqdataList.addAll(childList);
+
+                JSONObject devInfo = (JSONObject)devMap.get(iotDevice.getDevCode());
+                String devLng = devInfo.getString("LNG");
+                String devLat = devInfo.getString("LAT");
+
+                IotDevice updateDevice = new IotDevice();
+                //如果存在经纬度
+                if(StringUtils.isNotEmpty(devLng) && StringUtils.isNotEmpty(devLat)){
+                    // 自动的可以更新数据库   0 手动
+                    if (!Objects.equals(iotDevice.getDevPositionstatus(), "0")) {
+                        iotDeviceAddressService.setDeviceAddress(updateDevice, devLng, devLat);
+                    }
+                }
+
+                updateDevice.setDevBid(iotDevice.getDevBid());
+                updateDevice.setDevUpdateddate(devUpdateddate);
+                updateDevice.setDevStatus(IotDeviceStatusTypeEnum.ONLINE.getCode());
+                updateList.add(updateDevice);
+            }
+        }
+        if(!iotAdznGssqdataList.isEmpty()){
+            MongoService mongoService = SpringUtils.getBean(MongoService.class);
+            mongoService.insertList(IotAdznGssqdata.class, iotAdznGssqdataList);
+        }
+        if(!updateList.isEmpty()){
+            SpringUtils.getBean(IIotDeviceService.class).updateIotDeviceBatch(updateList);
+        }
+    }
+
+    /**
+     * 同步设备数据
+     * @param iotDevice
+     */
+    public void syncDeviceData(IotDevice iotDevice){
+        List<IotDevice> iotDeviceList = new ArrayList<>();
+        iotDeviceList.add(iotDevice);
+        syncDeviceData(iotDeviceList);
+    }
+}

+ 47 - 49
src/main/java/com/yunfeiyun/agmp/iots/service/impl/WarnService.java

@@ -18,7 +18,6 @@ import com.yunfeiyun.agmp.common.utils.StringUtils;
 import com.yunfeiyun.agmp.common.utils.uuid.Uuids;
 import com.yunfeiyun.agmp.common.web.system.mapper.SysUserMapper;
 import com.yunfeiyun.agmp.common.web.system.service.ISysConfigService;
-import com.yunfeiyun.agmp.iot.common.constant.device.adzngssq.AdzngssqUtil;
 import com.yunfeiyun.agmp.iot.common.constant.device.xmzn.XmznUtil;
 import com.yunfeiyun.agmp.iot.common.constant.devicetype.IotDeviceDictConst;
 import com.yunfeiyun.agmp.iot.common.domain.*;
@@ -40,7 +39,6 @@ import com.yunfeiyun.agmp.iots.service.IIotPestService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
@@ -1425,7 +1423,7 @@ public class WarnService {
 
                             if(IotDeviceDictConst.TYPE_ADZN_GSSQ.equals(findDevice.getDevtypeBid()) ){
                                 //管式墒情,需要处理 分层数据
-                                dataitenName = AdzngssqUtil.getFactorDisplayname(factor.getCode(),item.getDiParam1(),factorList);
+//                                dataitenName = AdzngssqUtil.getFactorDisplayname(factor.getCode(),item.getDiParam1(),factorList);
                             }else if(IotDeviceDictConst.TYPE_YF_SQZ.equals(findDevice.getDevtypeBid()) ){
                                 dataitenName = XmznUtil.getFactorDisplayname(factor.getCode(),item.getDiParam1(),factorList);
                             }
@@ -1536,22 +1534,22 @@ public class WarnService {
      */
     private String getTrssData(String devBid, String dataitemCode){
 
-        XphEnumFactor findFactor = XphEnumFactor.fromCommonCode(dataitemCode);
-
-        if(findFactor==null){
-            log.error(TAG+"无此数据要素{}",dataitemCode);
-            return "-99.99";
-        }
-
-
-        Map<String, Object> params = new HashMap<>();
-        params.put("devBid", devBid);
-        params.put("eNum", findFactor.getCode());
-
-        IotXphTrshCldata data = (IotXphTrshCldata)mongoService.findOne(IotXphTrshCldata.class,params,"time","desc");
-        if(data!=null){
-            return data.eValue;
-        }
+//        XphEnumFactor findFactor = XphEnumFactor.fromCommonCode(dataitemCode);
+//
+//        if(findFactor==null){
+//            log.error(TAG+"无此数据要素{}",dataitemCode);
+//            return "-99.99";
+//        }
+//
+//
+//        Map<String, Object> params = new HashMap<>();
+//        params.put("devBid", devBid);
+//        params.put("eNum", findFactor.getCode());
+//
+//        IotXphTrshCldata data = (IotXphTrshCldata)mongoService.findOne(IotXphTrshCldata.class,params,"time","desc");
+//        if(data!=null){
+//            return data.eValue;
+//        }
 
 
         return "-99.99";
@@ -1565,22 +1563,22 @@ public class WarnService {
      */
     private String getWshjData(String devBid, String dataitemCode){
 
-        XphEnumFactor findFactor = XphEnumFactor.fromCommonCode(dataitemCode);
-
-        if(findFactor==null){
-            log.error(TAG+"无此数据要素{}",dataitemCode);
-            return "-99.99";
-        }
-
-
-        Map<String, Object> params = new HashMap<>();
-        params.put("devBid", devBid);
-        params.put("eNum", findFactor.getCode());
-
-        IotXphWshjJcdata data = (IotXphWshjJcdata)mongoService.findOne(IotXphWshjJcdata.class,params,"time","desc");
-        if(data!=null){
-            return data.eValue;
-        }
+//        XphEnumFactor findFactor = XphEnumFactor.fromCommonCode(dataitemCode);
+//
+//        if(findFactor==null){
+//            log.error(TAG+"无此数据要素{}",dataitemCode);
+//            return "-99.99";
+//        }
+//
+//
+//        Map<String, Object> params = new HashMap<>();
+//        params.put("devBid", devBid);
+//        params.put("eNum", findFactor.getCode());
+//
+//        IotXphWshjJcdata data = (IotXphWshjJcdata)mongoService.findOne(IotXphWshjJcdata.class,params,"time","desc");
+//        if(data!=null){
+//            return data.eValue;
+//        }
 
 
         return "-99.99";
@@ -1636,17 +1634,17 @@ public class WarnService {
 
 
 
-        AdzngssqEnumFactor findFactor = AdzngssqEnumFactor.fromCommonCode(dataitemCode);
-
-        if(findFactor==null){
-            log.error("无此数据要素{}",dataitemCode);
-            return "-99.99";
-        }
+//        AdzngssqEnumFactor findFactor = AdzngssqEnumFactor.fromCommonCode(dataitemCode);
+//
+//        if(findFactor==null){
+//            log.error("无此数据要素{}",dataitemCode);
+//            return "-99.99";
+//        }
 
 
-        Map<String, Object> params = new HashMap<>();
-        params.put("devBid", devBid);
-        params.put("code", findFactor.getCode());
+//        Map<String, Object> params = new HashMap<>();
+//        params.put("devBid", devBid);
+//        params.put("code", findFactor.getCode());
 
         if(!StringUtils.isEmpty(address)){
             //管式墒情的土壤温湿度需要携带分层信息
@@ -1658,15 +1656,15 @@ public class WarnService {
                 log.error("获取参数 采集深度 时出错!");
                 return "-99.99";
             }
-            params.put("address", addressInt);
+//            params.put("address", addressInt);
         }
 
 
 
-        IotAdzngssqdata data = (IotAdzngssqdata)mongoService.findOne(IotAdzngssqdata.class,params,"time","desc");
-        if(data!=null){
-            return data.value;
-        }
+//        IotAdzngssqdata data = (IotAdzngssqdata)mongoService.findOne(IotAdzngssqdata.class,params,"time","desc");
+//        if(data!=null){
+//            return data.value;
+//        }
 
 
         return "-99.99";

+ 52 - 0
src/main/java/com/yunfeiyun/agmp/iots/task/AdznGssqScheduler.java

@@ -0,0 +1,52 @@
+package com.yunfeiyun.agmp.iots.task;
+
+import com.yunfeiyun.agmp.iot.common.constant.devicetype.IotDeviceDictConst;
+import com.yunfeiyun.agmp.iot.common.domain.IotDevice;
+import com.yunfeiyun.agmp.iot.common.enums.ybq.YbqTypeConst;
+import com.yunfeiyun.agmp.iots.core.manager.HttpManager;
+import com.yunfeiyun.agmp.iots.device.serviceImp.AdznGssqService;
+import com.yunfeiyun.agmp.iots.service.IIotDeviceService;
+import com.yunfeiyun.agmp.iots.service.IIotDevicelasteddataService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * 爱迪智农管式墒情数据同步调度
+ *
+ * @author zhangn
+ * @see YbqTypeConst
+ */
+@Slf4j
+@Component
+public class AdznGssqScheduler {
+
+    @Autowired
+    private HttpManager httpManager;
+
+    @Autowired
+    private IIotDeviceService iIotDeviceService;
+
+    @Autowired
+    private IIotDevicelasteddataService iIotDevicelasteddataService;
+
+    // 每30分钟同步一次数据
+//    @PostConstruct
+
+//    @Scheduled(cron = "0/30 * * * * ?")
+    @Scheduled(cron = "10 0/20 * * * ?")
+    public void syncDeviceData() {
+        log.info("===============爱迪智农管式墒情数据同步任务开始执行=================");
+        List<String> devTypeBidList = Collections.singletonList(IotDeviceDictConst.TYPE_ADZN_GSSQ);
+        List<IotDevice> iotDeviceList = iIotDeviceService.selectIotDeviceByDevtypeBidList(devTypeBidList);
+        for(IotDevice iotDevice : iotDeviceList){
+            AdznGssqService httpClient = ((AdznGssqService) httpManager.getHttpClientByDevice(iotDevice));
+            httpClient.syncDeviceData(iotDevice);
+        }
+        log.info("===============爱迪智农管式墒情数据同步任务执行结束=================");
+    }
+}