增加向风控上传设备数据代码
diff --git a/build.gradle b/build.gradle
index bed1563..ff98f78 100644
--- a/build.gradle
+++ b/build.gradle
@@ -88,7 +88,7 @@
     implementation 'net.javacrumbs.shedlock:shedlock-spring:2.5.0'
     implementation 'net.javacrumbs.shedlock:shedlock-provider-redis-spring:2.5.0'
     implementation files('libs/ojdbc6.jar')
-
+    implementation 'com.alibaba:fastjson:1.2.60'
     annotationProcessor 'org.projectlombok:lombok:1.18.8'
     compileOnly 'org.projectlombok:lombok:1.18.8'
     annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/Constants.java b/src/main/java/com/supwisdom/dlpay/framework/util/Constants.java
index 148138c..a8c7a22 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/Constants.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/Constants.java
@@ -12,4 +12,9 @@
   public static final String REDISKEY_SHORTURL = "shorturl_";
   public static final String WECHAT_AGENT = "micromessenger";
   public static final String WECHAT_MINIPROGRAM = "miniprogram";
+
+  public final static String DEVICE_STATUS_NORMAL = "1";
+  public final static String DEVICE_STATUS_CLOSED = "2";
+  public final static String MONITOR_SUBAPP_WATER = "water";
+  public final static int MONITOR_SUCCESS_CODE = 200;
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/WaterBudinessConstants.java b/src/main/java/com/supwisdom/dlpay/framework/util/WaterBudinessConstants.java
index 009e288..0d83771 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/WaterBudinessConstants.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/WaterBudinessConstants.java
@@ -10,4 +10,6 @@
     public final static String WATER_SECRET = "water_secret";
     public final static String WATER_DTLCREDIT_MAXCOUNT = "water_dtlcredit_maxcount"; // 单笔流水每日最大入账次数
     public final static String WATER_DTLCREDIT_INTERVALHOUR = "water_dtlcredit_intervalhour"; // 单笔流水入账间隔小时数
+    public final static String WATER_MONITOR_URL = "water_monitor_url"; // 设备监控程序地址
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/util/RestTemplateConfig.java b/src/main/java/com/supwisdom/dlpay/util/RestTemplateConfig.java
new file mode 100644
index 0000000..297fc17
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/util/RestTemplateConfig.java
@@ -0,0 +1,18 @@
+package com.supwisdom.dlpay.util;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.client.SimpleClientHttpRequestFactory;
+import org.springframework.web.client.RestTemplate;
+
+@Configuration
+public class RestTemplateConfig {
+
+  @Bean
+  public RestTemplate restTemplate() {
+    SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
+    factory.setConnectTimeout(15000);
+    factory.setReadTimeout(5000);
+    return new RestTemplate(factory);
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/water/bean/MonitorResult.java b/src/main/java/com/supwisdom/dlpay/water/bean/MonitorResult.java
new file mode 100644
index 0000000..4d0a627
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/water/bean/MonitorResult.java
@@ -0,0 +1,22 @@
+package com.supwisdom.dlpay.water.bean;
+
+public class MonitorResult {
+  private int code;
+  private String msg;
+
+  public int getCode() {
+    return code;
+  }
+
+  public void setCode(int code) {
+    this.code = code;
+  }
+
+  public String getMsg() {
+    return msg;
+  }
+
+  public void setMsg(String msg) {
+    this.msg = msg;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/water/service/impl/DeviceServiceImpl.java b/src/main/java/com/supwisdom/dlpay/water/service/impl/DeviceServiceImpl.java
index e41dfae..12d3d56 100644
--- a/src/main/java/com/supwisdom/dlpay/water/service/impl/DeviceServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/water/service/impl/DeviceServiceImpl.java
@@ -1,28 +1,34 @@
 package com.supwisdom.dlpay.water.service.impl;
 
-import com.supwisdom.dlpay.exception.TransactionProcessException;
+import com.alibaba.fastjson.JSON;
 import com.supwisdom.dlpay.framework.dao.DictionaryDao;
 import com.supwisdom.dlpay.framework.domain.TDictionary;
+import com.supwisdom.dlpay.framework.service.BusinessparaService;
 import com.supwisdom.dlpay.framework.util.*;
 import com.supwisdom.dlpay.framework.util.Dictionary;
 import com.supwisdom.dlpay.water.DeviceLineCheckParam;
 import com.supwisdom.dlpay.water.DeviceLoginParam;
+import com.supwisdom.dlpay.water.bean.DeviceSearchBean;
+import com.supwisdom.dlpay.water.bean.MonitorResult;
 import com.supwisdom.dlpay.water.dao.AreaDao;
 import com.supwisdom.dlpay.water.dao.DeviceDao;
 import com.supwisdom.dlpay.water.dao.DeviceFeeConfigDao;
 import com.supwisdom.dlpay.water.dao.FeeConfigDao;
 import com.supwisdom.dlpay.water.domain.*;
 import com.supwisdom.dlpay.water.service.DeviceService;
-import com.supwisdom.dlpay.water.bean.DeviceSearchBean;
 import org.hibernate.query.internal.NativeQueryImpl;
 import org.hibernate.transform.Transformers;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.domain.Specification;
+import org.springframework.http.*;
 import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
 
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
@@ -33,6 +39,7 @@
 
 @Service
 public class DeviceServiceImpl implements DeviceService {
+    private Logger logger = LoggerFactory.getLogger(DeviceServiceImpl.class);
 
     @Autowired
     private DeviceDao deviceDao;
@@ -49,6 +56,12 @@
     @Autowired
     private DictionaryDao dictionaryDao;
 
+    @Autowired
+    private RestTemplate restTemplate;
+
+    @Autowired
+    private BusinessparaService businessparaService;
+
     @PersistenceContext
     private EntityManager entityManager;
 
@@ -107,6 +120,13 @@
             device.setAreano(region.getAreano());
             device.setDeviceStatus("normal");
             deviceDao.save(device);
+
+            // 上传设备数据
+            MonitorResult monitorResult = deviceRegister(region, device,Constants.DEVICE_STATUS_NORMAL);
+            if (Constants.MONITOR_SUCCESS_CODE != monitorResult.getCode()) {
+                logger.error(monitorResult.getMsg());
+                throw new RuntimeException("设备数据上传失败:" + monitorResult.getMsg());
+            }
             return true;
         }
         return false;
@@ -161,6 +181,16 @@
         if (device != null) {
             device.setDeviceStatus("closed");
             deviceDao.save(device);
+            Optional<TArea> optional = areaDao.findByAvailableAndAreano(1, device.getAreano());
+            if (!optional.isPresent()) {
+                throw new RuntimeException("设备所属区域未找到");
+            }
+            TArea area = optional.get();
+            MonitorResult monitorResult = deviceRegister(area, device,Constants.DEVICE_STATUS_CLOSED);
+            if (Constants.MONITOR_SUCCESS_CODE != monitorResult.getCode()) {
+                logger.error(monitorResult.getMsg());
+                throw new RuntimeException("设备数据上传失败:" + monitorResult.getMsg());
+            }
             return true;
         }
         return false;
@@ -217,6 +247,23 @@
             device.setSoftVer(param.getHwVer());
             deviceDao.save(device);
             Map<String, String> deviceParam = getParaMapByDeviceno(param.getDeviceno());
+            Optional<TArea> optional = areaDao.findByAvailableAndAreano(1, device.getAreano());
+            if (!optional.isPresent()) {
+                result.put("flag", false);
+                result.put("errorMsg", "设备区域未找到");
+                return result;
+            }
+            TArea area = optional.get();
+
+            //向监控程序上传设备信息
+            MonitorResult monitorResult = deviceRegister(area, device,Constants.DEVICE_STATUS_NORMAL);
+            if (Constants.MONITOR_SUCCESS_CODE != monitorResult.getCode()) {
+                logger.error(monitorResult.getMsg());
+                result.put("flag", false);
+                result.put("errorMsg", "设备信息上传失败:" + monitorResult.getMsg());
+                return result;
+            }
+
             result.put("flag", true);
             result.put(WaterDeviceParam.devOfflineMaxHour, deviceParam.get(WaterDeviceParam.devOfflineMaxHour));
             result.put(WaterDeviceParam.pulseInHML, deviceParam.get(WaterDeviceParam.pulseInHML));
@@ -227,13 +274,59 @@
         return result;
     }
 
+    private MonitorResult deviceRegister(TArea area, TDevice device,String status) {
+        HashMap<String, String> data = new HashMap<>(8);
+
+        data.put("areaname", area.getAreaName());
+        data.put("status", status);
+        data.put("devicename", device.getDevicename());
+        data.put("devphyid", device.getDeviceno());
+        data.put("devverno", device.getSoftVer());
+        data.put("source", Constants.MONITOR_SUBAPP_WATER);
+        String url = businessparaService.findByParakey(WaterBudinessConstants.WATER_MONITOR_URL).getParaval();
+        String response = httpPost(url + "register", JSON.toJSONString(data));
+        return JSON.parseObject(response, MonitorResult.class);
+    }
+
+    private MonitorResult deviceHeartBeat(TDevice device) {
+        HashMap<String, String> data = new HashMap<>(4);
+        data.put("devphyid", device.getDeviceno());
+        data.put("source", Constants.MONITOR_SUBAPP_WATER);
+        String url = businessparaService.findByParakey(WaterBudinessConstants.WATER_MONITOR_URL).getParaval();
+        String response = httpPost(url + "beat", JSON.toJSONString(data));
+        return JSON.parseObject(response, MonitorResult.class);
+    }
+
+    private String httpPost(String url,String json){
+        HttpHeaders headers = new HttpHeaders();
+        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
+        headers.setContentType(type);
+        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
+        HttpEntity<String> formEntity = new HttpEntity<>(json, headers);
+        ResponseEntity<String> postEntity = restTemplate.postForEntity(url, formEntity, String.class);
+        if (postEntity.getStatusCode().equals(HttpStatus.OK) && postEntity.hasBody()) {
+            return postEntity.getBody();
+        } else {
+            throw new RuntimeException("上传设备数据请求异常");
+        }
+    }
+
     @Override
     public TDevice lineCheck(DeviceLineCheckParam param) {
         TDevice device = deviceDao.findByDeviceno(param.getDeviceno());
         if (device != null) {
+            if ("closed".equals(device.getDeviceStatus())) {
+                throw new RuntimeException("设备已注销");
+            }
             String deviceLineCheck = param.getTermdate() + param.getTermtime();
             device.setDeviceLineCheck(deviceLineCheck);
             deviceDao.save(device);
+            //向监控程序上传设备数据
+            MonitorResult monitorResult = deviceHeartBeat(device);
+            if (Constants.MONITOR_SUCCESS_CODE != monitorResult.getCode()) {
+                logger.error(monitorResult.getMsg());
+                throw new RuntimeException("设备数据上传失败:" + monitorResult.getMsg());
+            }
             return device;
         }
         return null;
diff --git a/src/main/kotlin/com/supwisdom/dlpay/water/controller/api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/water/controller/api_controller.kt
index e13fdd0..4d940f9 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/water/controller/api_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/water/controller/api_controller.kt
@@ -1,6 +1,5 @@
 package com.supwisdom.dlpay.water.controller
 
-import com.supwisdom.dlpay.api.bean.JsonResult
 import com.supwisdom.dlpay.api.bean.QueryCardParam
 import com.supwisdom.dlpay.api.bean.QueryUserParam
 import com.supwisdom.dlpay.framework.ResponseBodyBuilder
diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql
index c2749b3..c20963d 100644
--- a/src/main/resources/data.sql
+++ b/src/main/resources/data.sql
@@ -54,6 +54,8 @@
 INSERT INTO "tb_businesspara"("parakey", "paraval") VALUES ('water_appid', '700001');
 INSERT INTO "tb_businesspara"("parakey", "paraval") VALUES ('water_dtlcredit_maxcount', '3');
 INSERT INTO "tb_businesspara"("parakey", "paraval") VALUES ('water_dtlcredit_intervalhour', '1');
+INSERT INTO "tb_businesspara"("parakey", "paraval") VALUES ('water_monitor_url', 'http://127.0.0.1:8082/collect/device/');
+
 
 INSERT INTO "tb_syspara"("paraid", "displayflag", "editflag", "lastsaved", "paraname", "paraunit", "paraval", "remark", "valuetype") VALUES (1, '1', 1, '1', 'shopaccno', NULL, NULL, NULL, NULL);