limeng 4 bulan lalu
melakukan
103035cea5
38 mengubah file dengan 3522 tambahan dan 0 penghapusan
  1. 170 0
      pom.xml
  2. 8 0
      sooka-middleground.iml
  3. 39 0
      src/main/java/com/sooka/sponest/middleground/SookaMiddleGroundApplication.java
  4. 155 0
      src/main/java/com/sooka/sponest/middleground/controller/MonitorController.java
  5. 129 0
      src/main/java/com/sooka/sponest/middleground/hwMeeting/controller/HwMeetingController.java
  6. 34 0
      src/main/java/com/sooka/sponest/middleground/hwMeeting/service/HwMeetingService.java
  7. 46 0
      src/main/java/com/sooka/sponest/middleground/hwMeeting/service/impl/HwMeetingApi.java
  8. 178 0
      src/main/java/com/sooka/sponest/middleground/hwMeeting/service/impl/HwMeetingServiceImpl.java
  9. 44 0
      src/main/java/com/sooka/sponest/middleground/monitoringEquipment/chenganshengbang/controller/WaterPressureController.java
  10. 9 0
      src/main/java/com/sooka/sponest/middleground/monitoringEquipment/chenganshengbang/service/WaterPressureService.java
  11. 60 0
      src/main/java/com/sooka/sponest/middleground/monitoringEquipment/chenganshengbang/service/impl/WaterPressureServiceImpl.java
  12. 24 0
      src/main/java/com/sooka/sponest/middleground/monitoringEquipment/inserctpests/controller/PlantDiseasesAndInsectPestsController.java
  13. 11 0
      src/main/java/com/sooka/sponest/middleground/monitoringEquipment/inserctpests/service/PlantDiseasesAndInsectPestsService.java
  14. 163 0
      src/main/java/com/sooka/sponest/middleground/monitoringEquipment/inserctpests/service/impl/PlantDiseasesAndInsectPestsServiceImpl.java
  15. 12 0
      src/main/java/com/sooka/sponest/middleground/monitoringEquipment/sennor/api/API.java
  16. 28 0
      src/main/java/com/sooka/sponest/middleground/monitoringEquipment/sennor/controller/SennorController.java
  17. 14 0
      src/main/java/com/sooka/sponest/middleground/monitoringEquipment/sennor/service/SennorService.java
  18. 78 0
      src/main/java/com/sooka/sponest/middleground/monitoringEquipment/sennor/service/impl/SennorServiceImpl.java
  19. 116 0
      src/main/java/com/sooka/sponest/middleground/monitoringEquipment/shuicejia/TcpServer.java
  20. 22 0
      src/main/java/com/sooka/sponest/middleground/remoteapi/EnableSookaFeignClients.java
  21. 4 0
      src/main/java/com/sooka/sponest/middleground/remoteapi/RemoveApiBaseService.java
  22. 136 0
      src/main/java/com/sooka/sponest/middleground/remoteapi/fallback/center/monitor/RemoteMonitorBaseServiceFallbackFactory.java
  23. 53 0
      src/main/java/com/sooka/sponest/middleground/remoteapi/fallback/center/system/RemoteSystemBaseServiceFallbackFactory.java
  24. 46 0
      src/main/java/com/sooka/sponest/middleground/remoteapi/service/ModulesServiceNameContants.java
  25. 164 0
      src/main/java/com/sooka/sponest/middleground/remoteapi/service/center/monitor/RemoteMonitorService.java
  26. 46 0
      src/main/java/com/sooka/sponest/middleground/remoteapi/service/center/system/RemoteSystemService.java
  27. 161 0
      src/main/java/com/sooka/sponest/middleground/scheduleTask/StaticScheduleTask.java
  28. 287 0
      src/main/java/com/sooka/sponest/middleground/scheduleTask/entity/GasTankDevices.java
  29. 197 0
      src/main/java/com/sooka/sponest/middleground/util/CacheUtils.java
  30. 32 0
      src/main/java/com/sooka/sponest/middleground/util/FileUtils.java
  31. 53 0
      src/main/java/com/sooka/sponest/middleground/util/HmacSHA256.java
  32. 54 0
      src/main/java/com/sooka/sponest/middleground/util/LoginUtil.java
  33. 33 0
      src/main/java/com/sooka/sponest/middleground/util/MD5Util.java
  34. 626 0
      src/main/java/com/sooka/sponest/middleground/util/StringUtils.java
  35. 95 0
      src/main/java/com/sooka/sponest/middleground/util/hwMeetingCacheUtil.java
  36. 159 0
      src/main/java/com/sooka/sponest/middleground/util/spring/SpringUtils.java
  37. 9 0
      src/main/resources/banner.txt
  38. 27 0
      src/main/resources/bootstrap.yml

+ 170 - 0
pom.xml

@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>ruoyi-modules</artifactId>
+        <groupId>com.ruoyi</groupId>
+        <version>3.4.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.sooka.onest</groupId>
+    <artifactId>sooka-middleground</artifactId>
+
+
+    <dependencies>
+        <!-- SpringCloud Alibaba Nacos -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+
+        <!-- SpringCloud Alibaba Nacos Config -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+
+        <!-- SpringCloud Alibaba Sentinel -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
+        </dependency>
+
+        <!-- Sentinel Datasource Nacos -->
+        <dependency>
+            <groupId>com.alibaba.csp</groupId>
+            <artifactId>sentinel-datasource-nacos</artifactId>
+        </dependency>
+
+        <!-- SpringBoot Actuator -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+
+        <!-- Swagger UI -->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>${swagger.fox.version}</version>
+        </dependency>
+
+        <!-- Mysql Connector -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+
+        <!-- RuoYi Common DataSource -->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>sooka-sponest-common-datasource</artifactId>
+        </dependency>
+
+        <!-- RuoYi Common DataScope -->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>sooka-sponest-common-datascope</artifactId>
+        </dependency>
+
+        <!-- RuoYi Common Log -->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>sooka-sponest-common-log</artifactId>
+        </dependency>
+
+        <!-- RuoYi Common Swagger -->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>sooka-sponest-common-swagger</artifactId>
+        </dependency>
+
+        <!--Shiro核心框架 -->
+        <dependency>
+            <groupId>org.apache.shiro</groupId>
+            <artifactId>shiro-core</artifactId>
+            <version>1.10.1</version>
+        </dependency>
+
+        <!-- Shiro使用EhCache缓存框架 -->
+        <dependency>
+            <groupId>org.apache.shiro</groupId>
+            <artifactId>shiro-ehcache</artifactId>
+            <version>1.10.1</version>
+        </dependency>
+
+        <!--海康-->
+        <dependency>
+            <groupId>com.hikvision.ga</groupId>
+            <artifactId>artemis-http-client</artifactId>
+            <version>1.1.3</version>
+        </dependency>
+
+        <!-- ICC鉴权 -->
+        <dependency>
+            <groupId>com.dahuatech.icc</groupId>
+            <artifactId>java-sdk-oauth</artifactId>
+            <version>1.0.9</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>java-sdk-core</artifactId>
+                    <groupId>com.dahuatech.icc</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>com.dahuatech.icc</groupId>
+            <artifactId>java-sdk-core</artifactId>
+            <version>1.0.9</version>
+        </dependency>
+
+        <!-- mp4文件操作jar -->
+        <!-- https://mvnrepository.com/artifact/com.googlecode.mp4parser/isoparser -->
+        <dependency>
+            <groupId>com.googlecode.mp4parser</groupId>
+            <artifactId>isoparser</artifactId>
+            <version>1.1.22</version>
+        </dependency>
+
+        <dependency>
+            <groupId>javax.websocket</groupId>
+            <artifactId>javax.websocket-api</artifactId>
+            <version>1.1</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <!--hutool-->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.2</version>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.1.5.RELEASE</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 8 - 0
sooka-middleground.iml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module version="4">
+  <component name="FacetManager">
+    <facet type="Spring" name="Spring">
+      <configuration />
+    </facet>
+  </component>
+</module>

+ 39 - 0
src/main/java/com/sooka/sponest/middleground/SookaMiddleGroundApplication.java

@@ -0,0 +1,39 @@
+package com.sooka.sponest.middleground;
+
+import com.ruoyi.common.security.annotation.EnableCustomConfig;
+import com.ruoyi.common.security.annotation.EnableRyFeignClients;
+import com.ruoyi.common.swagger.annotation.EnableCustomSwagger2;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.servlet.MultipartConfigFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.util.unit.DataSize;
+
+import javax.servlet.MultipartConfigElement;
+
+@EnableCustomConfig
+@EnableCustomSwagger2
+@EnableRyFeignClients
+@SpringBootApplication
+public class SookaMiddleGroundApplication
+{
+    public static void main(String[] args)
+    {
+        SpringApplication.run(SookaMiddleGroundApplication.class, args);
+        System.out.println("(♥◠‿◠)ノ゙  首佳科技 一体化 互联网区中台 启动成功   ლ(´ڡ`ლ)゙  \n" +
+                "  __________   ____ |  | _______          ____________   ____   ____   ____   _______/  |_\n"+
+                " /  ___/  _ \\ /  _ \\|  |/ /\\__  \\        /  ___/\\____ \\ /  _ \\ /    \\_/ __ \\ /  ___/\\   __\\\n"+
+                " \\___ (  <_> |  <_> )    <  / __ \\_      \\___ \\ |  |_> >  <_> )   |  \\  ___/ \\___ \\  |  |\n"+
+                "/____  >____/ \\____/|__|_ \\(____  /     /____  >|   __/ \\____/|___|  /\\___  >____  > |__|\n"+
+                "     \\/                  \\/     \\/           \\/ |__|               \\/     \\/     \\/\n"
+        );
+    }
+
+    @Bean
+    public MultipartConfigElement multipartConfigElement(){
+        MultipartConfigFactory factory = new MultipartConfigFactory();
+        factory.setMaxFileSize(DataSize.parse("10240000KB"));
+        factory.setMaxRequestSize(DataSize.parse("10240000KB"));
+        return factory.createMultipartConfig();
+    }
+}

+ 155 - 0
src/main/java/com/sooka/sponest/middleground/controller/MonitorController.java

@@ -0,0 +1,155 @@
+package com.sooka.sponest.middleground.controller;
+
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.sooka.sponest.middleground.remoteapi.service.center.monitor.RemoteMonitorService;
+import com.sooka.sponest.middleground.scheduleTask.StaticScheduleTask;
+import com.sooka.sponest.middleground.scheduleTask.entity.GasTankDevices;
+import com.sooka.sponest.middleground.util.LoginUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.conn.ssl.NoopHostnameVerifier;
+import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.impl.client.LaxRedirectStrategy;
+import org.apache.http.ssl.SSLContextBuilder;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLContext;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.springframework.web.bind.annotation.RequestMethod.GET;
+
+
+@Slf4j
+@Controller
+@RequestMapping("/gps/tank")
+public class MonitorController {
+    
+    protected static final Logger logger = LoggerFactory.getLogger(StaticScheduleTask.class);
+    @Value("${sooka.equip_gps.ip:}")
+    public String ip;
+    @Value("${sooka.equip_gps.login_name:}")
+    public String loginName;
+    @Value("${sooka.equip_gps.password:}")
+    public String password;
+    @Value("${sooka.equip_gps.username:}")
+    public String username;
+    @Resource
+    public RemoteMonitorService remoteMonitorService;
+
+    /**
+     * 根据用户名查询设备列表,新增煤气罐设备信息
+     *
+     * @return
+     * @throws Exception
+     */
+    @RequestMapping(value = "/queryMonitorList", method = GET)
+    @ResponseBody
+    public AjaxResult queryMonitorList() {
+        AjaxResult ajaxResult = AjaxResult.success();
+        String token = null;
+        try {
+            token = LoginUtil.login(ip, loginName, password);
+            HttpPost httpPost = new HttpPost(ip + "/webapi?action=querymonitorlist&token=" + token);
+            String requestBody = "{\r\n\t\"username\": \"" + username + "\"}";
+            JSONObject jsonObject = getJsonObject(requestBody, httpPost);
+            if (jsonObject != null) {
+                ajaxResult = remoteMonitorService.gpsTankInsertBatch(jsonObject);
+                return ajaxResult;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return ajaxResult;
+    }
+
+    /**
+     * 对接北斗卫星定位设备车辆轨迹和行程
+     *
+     * @return
+     * @throws Exception
+     */
+    public void configureGpsTank() throws Exception {
+        // 创建日期格式化对象
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        // 获取当前日期
+        LocalDateTime nowDateTime = LocalDateTime.now();
+        String startOfDay;
+        String endOfDay;
+        //获取token
+        String token = LoginUtil.login(ip, loginName, password);
+        //获取设备id列表
+        List<GasTankDevices> deviceList = new ArrayList<>();
+        AjaxResult resultOne = remoteMonitorService.selectGasTankDevicesNewEndTime();
+        if (resultOne.get("code").equals(200)) {
+            deviceList = JSON.parseArray(JSON.toJSONString(resultOne.get("data")), GasTankDevices.class);
+        } else {
+            logger.error("查询北斗卫星定位设备列表失败");
+        }
+        //按时间查询历史轨迹
+        HttpPost trajectoriesHttpPost = new HttpPost(ip + "/webapi?action=querytracks&token=" + token);
+        //查询行程
+        HttpPost travelHttpPost = new HttpPost(ip + "/webapi?action=querytrips&token=" + token);
+        for (GasTankDevices device : deviceList) {
+            LocalDateTime date = LocalDateTime.now();
+            //结束时间为当前时间
+            endOfDay = formatter.format(date);
+            //开始时间为当前时间减12分钟后的时间
+            LocalDateTime endOfDayDateTime = date.plusMinutes(-12);
+            startOfDay = endOfDayDateTime.format(formatter);
+            // 入参报文
+            String requestBody = "{\r\n\t\"deviceid\": \"" + device.getDeviceid() + "\",\r\n\t\"begintime\": \"" + startOfDay + "\",\r\n\t\"endtime\": \"" + endOfDay + "\",\r\n\t\"timezone\": \"8\"}";
+            JSONObject trajectoryObj = getJsonObject(requestBody, trajectoriesHttpPost);
+
+            AjaxResult trajectoryResult = remoteMonitorService.remoteTrajectoryInsertBatch(trajectoryObj);
+            if (!trajectoryResult.get("code").equals(200)) {
+                logger.info("北斗卫星定位车辆gps历史轨迹对接,数据新增失败");
+            }
+            JSONObject mileageObject = getJsonObject(requestBody, travelHttpPost);
+            AjaxResult mileageResult = remoteMonitorService.remoteMileageInsertBatch(mileageObject);
+            if (!mileageResult.get("code").equals(200)) {
+                logger.info("北斗卫星定位车辆gps历史行程对接,数据新增失败");
+            }
+        }
+        logger.info("执行对接北斗卫星定位设备车辆轨迹和行程定时任务结束");
+    }
+
+
+    private static JSONObject getJsonObject(String requestBody, HttpPost httpPost) throws Exception {
+        SSLContext sslContext = SSLContextBuilder.create()
+                .loadTrustMaterial(new TrustSelfSignedStrategy())
+                .build();
+        HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;
+        HttpClient httpClient = HttpClients.custom()
+                .setSSLContext(sslContext)
+                .setSSLHostnameVerifier(hostnameVerifier)
+                .setRedirectStrategy(new LaxRedirectStrategy())
+                .build();
+        StringEntity requestEntity = new StringEntity(requestBody, ContentType.APPLICATION_JSON);
+        httpPost.setEntity(requestEntity);
+        HttpResponse response = httpClient.execute(httpPost);
+        HttpEntity responseEntity = response.getEntity();
+        String responseBody = EntityUtils.toString(responseEntity);
+        JSONObject jsonObject = JSONObject.parseObject(responseBody);
+        return jsonObject;
+    }
+}

+ 129 - 0
src/main/java/com/sooka/sponest/middleground/hwMeeting/controller/HwMeetingController.java

@@ -0,0 +1,129 @@
+package com.sooka.sponest.middleground.hwMeeting.controller;
+
+
+import com.dahuatech.hutool.json.JSONArray;
+import com.dahuatech.hutool.json.JSONObject;
+import com.dahuatech.hutool.json.JSONTokener;
+import com.dahuatech.hutool.json.JSONUtil;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.redis.service.RedisService;
+import com.sooka.sponest.middleground.hwMeeting.service.HwMeetingService;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 华为云会议控制器
+ */
+@Controller
+@RequestMapping("/hwMeeting")
+public class HwMeetingController {
+
+    @Resource
+    private HwMeetingService hwMeetingService;
+
+    @Resource
+    private RedisService redisService;
+
+    /**
+     * 创建或加入会议
+     */
+    @GetMapping("/joinConferences/{eventId}/{subject}/{nickName}")
+    @ResponseBody
+    public AjaxResult hasConferences(@PathVariable(name = "eventId") String eventId,
+                                     @PathVariable(name = "subject") String subject,
+                                     @PathVariable(name = "nickName") String nickName) {
+        Map<String,Object> map = new HashMap<>();
+        //查询在线会议
+        JSONObject hasConferences = JSONUtil.parseObj(hwMeetingService.hasConferences());
+        //有在线会议 返回来宾入会凭据
+        if (hasConferences.getInt("count") > 0) {
+            //取会议信息
+            JSONObject conferencesInfo = hasConferences.getJSONArray("data").getJSONObject(0);
+            //取密码数组 passwordEntry
+            JSONArray array = JSONUtil.parseArray(conferencesInfo.get("passwordEntry"));
+            for (Object o : array) {
+                JSONObject password = JSONUtil.parseObj(o);
+                JSONObject generalInfo = new JSONObject();
+                if (password.getStr("conferenceRole").equals("general")) {
+                    generalInfo.put("conferenceID", conferencesInfo.getStr("conferenceID"));
+                    generalInfo.put("password", password.getStr("password"));
+                    map.put("info",generalInfo);
+                }
+            }
+        }else{
+            //无在线会议 创建会议并返回主持人入会凭据
+            this.createConferences(eventId,subject,map);
+        }
+        map.put("nickName",nickName);
+        map.put("nonce",hwMeetingService.getNonce());
+        return AjaxResult.success(map);
+    }
+
+    /**
+     * 创建会议
+     */
+    public boolean createConferences(String eventId,String subject,Map map) {
+        String result = hwMeetingService.conferences(subject);
+        if (isSuccess(result)) {
+            //将结果转换为json数组,当处理成功时返回的格式为数组
+            Object ob = JSONUtil.parseArray(result).get(0);
+            //ob转换为JSONObject 取主持人入会信息返回
+            JSONObject object = JSONUtil.parseObj(ob);
+            //取密码数组 passwordEntry
+            JSONArray array = JSONUtil.parseArray(object.get("passwordEntry"));
+            for (Object o : array) {
+                JSONObject password = JSONUtil.parseObj(o);
+                JSONObject chairInfo = new JSONObject();
+                //返回主持人入会凭据
+                if (password.getStr("conferenceRole").equals("chair")) {
+                    chairInfo.put("conferenceID", object.getStr("conferenceID"));
+                    chairInfo.put("password", password.getStr("password"));
+                    map.put("info",chairInfo);
+                }
+            }
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 获取加入会议URI
+     */
+    @ResponseBody
+    @GetMapping("/guestJoinUri/{eventId}")
+    public AjaxResult guestJoinUri(@PathVariable(name = "eventId") String eventId) {
+        //查询在线会议
+        JSONObject hasConferences = JSONUtil.parseObj(hwMeetingService.hasConferences());
+        if(hasConferences != null){
+            //取会议信息
+            JSONObject conferencesInfo = hasConferences.getJSONArray("data").getJSONObject(0);
+            //取入会链接
+            return AjaxResult.success(conferencesInfo.get("guestJoinUri"));
+        }
+        return AjaxResult.error("未查询到数据");
+    }
+
+    /**
+     * 判断返回数据是JSONArray还是JSONObject,
+     * 如果是Array 则表示成功
+     * 反之失败
+     * */
+    private boolean isSuccess(String result) {
+        Object object = new JSONTokener(result).nextValue();
+        if (object instanceof JSONObject) {
+            JSONObject jsonObject = (JSONObject) object;
+            String error_code = jsonObject.get("error_code").toString();
+            System.err.println(error_code);
+            return false;
+        }
+        return true;
+    }
+
+}

+ 34 - 0
src/main/java/com/sooka/sponest/middleground/hwMeeting/service/HwMeetingService.java

@@ -0,0 +1,34 @@
+package com.sooka.sponest.middleground.hwMeeting.service;
+
+public interface HwMeetingService {
+
+    /**
+     * appId鉴权方法 获取token
+     */
+    String appauth();
+
+    /**
+     * 获取页面免登陆跳转的nonce信息
+     */
+    String getNonce();
+
+    /**
+     * 构成Authorization
+     */
+    String getAuthorization(String appId, String userId, String nonce);
+
+    /**
+     * 绑定给当前创会帐号的VMR ID。通过查询云会议室及个人会议ID接口获取。
+     */
+    String vmrID(String token);
+
+    /**
+     * 查询在线会议列表
+     */
+    String hasConferences();
+
+    /**
+     * 创建会议
+     */
+    String conferences(String subject);
+}

+ 46 - 0
src/main/java/com/sooka/sponest/middleground/hwMeeting/service/impl/HwMeetingApi.java

@@ -0,0 +1,46 @@
+package com.sooka.sponest.middleground.hwMeeting.service.impl;
+
+import org.springframework.beans.factory.annotation.Value;
+
+/**
+ * 华为接口类
+ */
+public abstract class HwMeetingApi {
+
+    /**
+     * 请求地址
+     **/
+    public static final String url = "https://api.meeting.huaweicloud.com";
+
+    /**
+     * appId
+     **/
+    @Value("${HwM.appId}")
+    public static final String appId = "3f989ae3a9664bbd8e78dde9d29a5a22";
+
+    /**
+     * appKey 也是HmacSHA256加密秘钥
+     **/
+    @Value("${HwM.appKey}")
+    public static final String appKey = "a48cbf11d0172b1c9fd4e9017bd8cf4dca674aa3a40696bd59f2542e746552fa";
+
+    /**
+     * 第三方平台的userId
+     **/
+    public static final String userId = "1001";
+
+    /**
+     * 执行AppID鉴权
+     */
+    public static final String appauth = "/v2/usg/acs/auth/appauth";
+
+    /**
+     * 普通用户分页查询云会议室及个人会议ID
+     **/
+    public static final String vmr = "/v1/usg/dcs/member/vmr";
+
+    /**
+     * 创建会议
+     */
+    public static final String conferences = "/v1/mmc/management/conferences";
+}

+ 178 - 0
src/main/java/com/sooka/sponest/middleground/hwMeeting/service/impl/HwMeetingServiceImpl.java

@@ -0,0 +1,178 @@
+package com.sooka.sponest.middleground.hwMeeting.service.impl;
+
+import com.dahuatech.hutool.core.util.RandomUtil;
+import com.dahuatech.hutool.http.HttpRequest;
+import com.dahuatech.hutool.json.JSONArray;
+import com.dahuatech.hutool.json.JSONObject;
+import com.dahuatech.hutool.json.JSONUtil;
+import com.sooka.sponest.middleground.hwMeeting.service.HwMeetingService;
+import com.sooka.sponest.middleground.util.HmacSHA256;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+@Service
+public class HwMeetingServiceImpl implements HwMeetingService {
+
+    private static final Logger log = LoggerFactory.getLogger(HwMeetingServiceImpl.class);
+
+    /**服务器地址**/
+    @Value("${meeting.serverUrl:}")
+    public String serverUrl;
+
+    /**appId**/
+    @Value("${meeting.appId:}")
+    public String appId;
+
+    /**第三方平台userId**/
+    @Value("${meeting.userId:}")
+    public String userId;
+
+    /**执行AppID鉴权地址**/
+    @Value("${meeting.appAuth:}")
+    public String appAuth;
+
+    /**appKey**/
+    @Value("${meeting.appKey:}")
+    public String appKey;
+
+    /**vmr**/
+    @Value("${meeting.vmr:}")
+    public String vmr;
+
+    /**查询在线会议**/
+    @Value("${meeting.onlineConferences:}")
+    public String onlineConferences;
+
+    /**创建会议**/
+    @Value("${meeting.conferences:}")
+    public String conferences;
+
+    /**获取页面免登陆跳转的nonce信息**/
+    @Value("${meeting.getNonce:}")
+    public String getNonce;
+
+
+
+    /**
+     * appId鉴权方法 获取token
+     */
+    @Override
+    public String appauth() {
+        //64位随机字符串
+        String nonce = RandomUtil.randomString(64);
+        log.info("nonce:{}", nonce);
+        //鉴权信息
+        String authorization = getAuthorization(appId, userId, nonce);
+        log.info("authorization:{}", authorization);
+        //body
+        JSONObject json = new JSONObject();
+        json.put("appId", appId);
+        json.put("expireTime", 0);
+        json.put("nonce", nonce);
+//        json.put("userId", userId);
+        json.put("clientType", 72);
+        //请求结果
+        String result = HttpRequest.post(serverUrl + appAuth)
+                .header("Authorization", authorization)
+                .header("Content-Type", "application/json")
+                .body(json)
+                .execute().body();
+        //打印
+        log.info("result:{}", result);
+        return JSONUtil.parseObj(result).get("accessToken").toString();
+    }
+
+    /**
+     * 构成Authorization
+     */
+    @Override
+    public String getAuthorization(String appId, String userId, String nonce) {
+        String data = appId + ":" + userId + ":" + 0 + ":" + nonce;
+        String authorization = "HMAC-SHA256 signature=" + HmacSHA256.encode(data, appKey);
+        return authorization;
+    }
+
+    /**
+     * 绑定给当前创会帐号的VMR_ID。通过查询云会议室及个人会议ID接口获取。
+     */
+    @Override
+    public String vmrID(String token) {
+        //body
+        String result = HttpRequest.get(serverUrl + vmr)
+                .header("X-Access-Token", token)
+                .header("Content-Type", "application/json")
+                .execute().body();
+        log.info("vmr:{}", result);
+        JSONArray rooms = JSONUtil.parseArray(JSONUtil.parseObj(result).get("data"));
+        log.info("rooms.get(0):{}", rooms.get(0));
+        log.info("JSONUtil.parseObj(rooms.get(0)):{}", JSONUtil.parseObj(rooms.get(0)));
+        log.info("vmrID:{}", JSONUtil.parseObj(rooms.get(0)).get("vmrId"));
+        return JSONUtil.parseObj(rooms.get(0)).get("id").toString();
+    }
+
+    /**
+     * 查询在线会议列表
+     */
+    @Override
+    public String hasConferences(){
+        String token = appauth();
+        String result = HttpRequest.get(serverUrl + onlineConferences)
+                .header("X-Access-Token", token)
+                .header("Content-Type", "application/json")
+                .execute().body();
+        log.info("查询在线会议列表:{}", result);
+        return result;
+    }
+
+    /**
+     * 创建会议
+     */
+    @Override
+    public String conferences(String subject) {
+        String token = appauth();
+        String vmrID = vmrID(token);
+        //body
+        JSONObject json = new JSONObject();
+        /**会议的媒体类型。Voice:语音会议,HDVideo:视频会议**/
+        json.put("mediaTypes", "HDVideo");
+        /**
+         * 会议持续时长,单位分钟。默认30分钟。
+         * 最大1440分钟(24小时),最小15分钟。
+         * */
+        json.put("length", 15);
+        /**会议主题。最多128个字符。**/
+        json.put("subject", subject);
+        /**
+         * 是否使用云会议室或者个人会议ID召开预约会议。默认0。
+         * 0:不使用云会议室或者个人会议ID
+         * 1:使用云会议室或者个人会议ID
+         * */
+        json.put("vmrFlag", 1);
+        /**绑定给当前创会帐号的VMR ID。通过查询云会议室及个人会议ID接口获取。**/
+        json.put("vmrID", vmrID);
+        //请求
+        String result = HttpRequest.post(serverUrl + conferences)
+                .header("X-Access-Token", token)
+                .header("Content-Type", "application/json")
+                .body(json)
+                .execute().body();
+        log.info("创建会议:{}", result);
+        return result;
+    }
+
+    /**
+     * 获取页面免登陆跳转的nonce信息
+     */
+    public String getNonce(){
+        String result = HttpRequest.post(serverUrl + getNonce)
+                .header("X-Access-Token", appauth())
+                .header("Content-Type", "application/json")
+                .execute().body();
+        log.info("获取页面免登陆跳转的nonce信息:{}", result);
+        Object nonce = JSONUtil.parseObj(result).get("nonce");
+        return nonce !=null ? nonce.toString() : "";
+    }
+
+}

+ 44 - 0
src/main/java/com/sooka/sponest/middleground/monitoringEquipment/chenganshengbang/controller/WaterPressureController.java

@@ -0,0 +1,44 @@
+package com.sooka.sponest.middleground.monitoringEquipment.chenganshengbang.controller;
+
+import com.sooka.sponest.middleground.monitoringEquipment.chenganshengbang.service.WaterPressureService;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("/api/WaterPressure")
+public class WaterPressureController {
+
+    @Resource
+    private WaterPressureService waterPressureService;
+
+    /**
+     * 水压传感器上报数据
+     * */
+    @PostMapping("/waterPressureMessageReceiver")
+    public byte[] waterPressureMessageReceiver(@RequestBody String data){
+        waterPressureService.waterPressureMessageReceiver(data);
+        return responseData();
+    }
+
+    /**
+     * 水压传感器指令下发
+     * */
+    @PostMapping("/command")
+    public String command(@RequestBody String data){
+        return waterPressureService.command(data);
+    }
+
+    public static byte[] responseData(){
+        int xiangyingma = 200;
+        byte[] xiangyingbytes = new byte[4];
+        xiangyingbytes[3] = (byte) (xiangyingma & 0xff);
+        xiangyingbytes[2] = (byte) (xiangyingma >> 8 & 0xff);
+        xiangyingbytes[1] = (byte) (xiangyingma >> 16 & 0xff);
+        xiangyingbytes[0] = (byte) (xiangyingma >> 24 & 0xff);
+        return xiangyingbytes;
+    }
+}

+ 9 - 0
src/main/java/com/sooka/sponest/middleground/monitoringEquipment/chenganshengbang/service/WaterPressureService.java

@@ -0,0 +1,9 @@
+package com.sooka.sponest.middleground.monitoringEquipment.chenganshengbang.service;
+
+
+public interface WaterPressureService {
+
+    void waterPressureMessageReceiver(String data);
+
+    String command(String data);
+}

+ 60 - 0
src/main/java/com/sooka/sponest/middleground/monitoringEquipment/chenganshengbang/service/impl/WaterPressureServiceImpl.java

@@ -0,0 +1,60 @@
+package com.sooka.sponest.middleground.monitoringEquipment.chenganshengbang.service.impl;
+
+import cn.hutool.http.HttpRequest;
+import com.alibaba.fastjson.JSONObject;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.sooka.sponest.middleground.monitoringEquipment.chenganshengbang.service.WaterPressureService;
+import com.sooka.sponest.middleground.remoteapi.service.center.monitor.RemoteMonitorService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+@Service
+public class WaterPressureServiceImpl implements WaterPressureService {
+
+    private static final Logger log = LoggerFactory.getLogger(WaterPressureServiceImpl.class);
+
+    @Resource
+    public RemoteMonitorService remoteMonitorService;
+
+    /**水压传感器指令地址**/
+    @Value("${monitoringEquipment.waterPressure.commandURL:}")
+    public String commandURL;
+
+
+    public void waterPressureMessageReceiver(String data){
+        log.info("WaterPressure 接到数据 ==>{}",data);
+        JSONObject object;
+        AjaxResult res;
+        try {
+            object = JSONObject.parseObject(data);
+            res = remoteMonitorService.saveWaterPressureDeviceData(object);
+            log.info("WaterPressure 数据推送成功! data ===> {} , result ===> {}",data, res);
+        }catch(Exception e){
+            e.printStackTrace();
+            log.error("WaterPressure 数据推送失败! data ===> {} , result ===> {}",data, e.getMessage());
+        }
+    }
+
+    public String command(String data){
+        log.info("WaterPressure-command 接到指令 ==>{}",data);
+        JSONObject object;
+        String res = null;
+        try {
+            object = JSONObject.parseObject(data);
+            res = HttpRequest.post(commandURL)
+                    .header("Content-Type", "application/json")
+                    .body(object.toJSONString())
+                    .execute().body();
+            log.info("指令下发成功! data ===> {} , result ===> {}",data, res);
+            return res;
+        }catch(Exception e){
+            e.printStackTrace();
+            log.error("指令下发失败! data ===> {} , result ===> {}",data, e.getMessage());
+            return res;
+        }
+    }
+}

+ 24 - 0
src/main/java/com/sooka/sponest/middleground/monitoringEquipment/inserctpests/controller/PlantDiseasesAndInsectPestsController.java

@@ -0,0 +1,24 @@
+package com.sooka.sponest.middleground.monitoringEquipment.inserctpests.controller;
+
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.sooka.sponest.middleground.monitoringEquipment.inserctpests.service.PlantDiseasesAndInsectPestsService;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("/api/plantDiseasesAndInsectPestsMessageReceiver")
+public class PlantDiseasesAndInsectPestsController {
+
+    @Resource
+    private PlantDiseasesAndInsectPestsService plantDiseasesAndInsectPestsService;
+
+    /**
+     * 病虫害传感器上报数据
+     * */
+    @GetMapping("/plantDiseasesAndInsectPestsMessageReceiver/{deviceNumber}")
+    public AjaxResult plantDiseasesAndInsectPestsMessageReceiver(@PathVariable("deviceNumber") String deviceNumber){
+        return plantDiseasesAndInsectPestsService.plantDiseasesAndInsectPestsMessageReceiver(deviceNumber);
+    }
+
+}

+ 11 - 0
src/main/java/com/sooka/sponest/middleground/monitoringEquipment/inserctpests/service/PlantDiseasesAndInsectPestsService.java

@@ -0,0 +1,11 @@
+package com.sooka.sponest.middleground.monitoringEquipment.inserctpests.service;
+
+import com.alibaba.fastjson.JSONArray;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+
+public interface PlantDiseasesAndInsectPestsService {
+
+    AjaxResult plantDiseasesAndInsectPestsMessageReceiver(String deviceNumber);
+
+
+}

+ 163 - 0
src/main/java/com/sooka/sponest/middleground/monitoringEquipment/inserctpests/service/impl/PlantDiseasesAndInsectPestsServiceImpl.java

@@ -0,0 +1,163 @@
+package com.sooka.sponest.middleground.monitoringEquipment.inserctpests.service.impl;
+
+import cn.hutool.http.HttpRequest;
+import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.system.api.domain.SysFile;
+import com.sooka.sponest.middleground.monitoringEquipment.inserctpests.service.PlantDiseasesAndInsectPestsService;
+import com.sooka.sponest.middleground.monitoringEquipment.sennor.api.API;
+import com.sooka.sponest.middleground.remoteapi.service.center.monitor.RemoteMonitorService;
+import com.sooka.sponest.middleground.util.FileUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+@Service
+public class PlantDiseasesAndInsectPestsServiceImpl implements PlantDiseasesAndInsectPestsService {
+
+    private static final Logger log = LoggerFactory.getLogger(PlantDiseasesAndInsectPestsServiceImpl.class);
+
+    @Resource
+    public RemoteMonitorService remoteMonitorService;
+
+    /**病虫害token**/
+    @Value("${monitoringEquipment.insect.insectToken:}")
+    private String insectToken;
+
+    /**病虫害用户名**/
+    @Value("${monitoringEquipment.insect.insectName:}")
+    private String insectName;
+
+    /**精讯物联网病虫害服务地址**/
+    @Value("${monitoringEquipment.insect.sennorInsectURL:}")
+    private String sennorInsectURL;
+
+    /**病虫害传感器图片下载地址**/
+    @Value("${monitoringEquipment.insect.insectPestsUrl:}")
+    private String insectPestsUrl;
+
+    public AjaxResult plantDiseasesAndInsectPestsMessageReceiver(String deviceNumber) {
+        //先请求
+        StringBuffer URI = new StringBuffer(sennorInsectURL + API.getInsectNewCollectionResult);
+        URI.append("?token=").append(insectToken);
+        URI.append("&userName=").append(insectName);
+        URI.append("&deviceNumber=").append(deviceNumber);
+        String result = HttpRequest.post(URI.toString())
+                .header("Content-Type", "application/json")
+                .execute().body();
+        log.info("plantDiseasesAndInsectPestsMessageReceiver 收到数据 ==> {}", result);
+
+        //后推送
+//        String result = deviceNumber;
+        JSONObject object;
+        try {
+            object = JSONObject.parseObject(result);
+            JSONObject data = object.getJSONObject("data");
+            String oldTaggingImgUrl = object.getJSONObject("data").getString("oldTaggingImgUrl");
+            String taggingImgUrl = object.getJSONObject("data").getString("taggingImgUrl");
+            if (oldTaggingImgUrl != null) {
+                JSONObject img = img(oldTaggingImgUrl);
+                if (img != null && img.getJSONObject("data") != null) {
+                    String imgUrl = img.getJSONObject("data").getString("url");
+                    if (imgUrl != null) {
+                        data.put("oldTaggingImgUrl", imgUrl);
+                    }
+                }
+            }
+
+            if (taggingImgUrl != null) {
+                JSONObject img2 = img(taggingImgUrl);
+                if (img2 != null && img2.getJSONObject("data") != null) {
+                    String imgUrl2 = img2.getJSONObject("data").getString("url");
+                    if (imgUrl2 != null) {
+                        data.put("taggingImgUrl", imgUrl2);
+                    }
+                }
+            }
+
+//            JSONObject img = img(oldTaggingImgUrl);
+//            object.getJSONObject("data").put("oldTaggingImgUrl", img.getJSONObject("data").getString("url"));
+//            JSONObject img2 = img(taggingImgUrl);
+//            object.getJSONObject("data").put("taggingImgUrl", img2.getJSONObject("data").getString("url"));
+
+            System.out.println("--------------------------图片-----------------------------");
+            String updatedOldTaggingImgUrl = data.getString("oldTaggingImgUrl");
+            String updatedTaggingImgUrl = data.getString("taggingImgUrl");
+            System.out.println("oldTaggingImgUrl:" + updatedOldTaggingImgUrl);
+            System.out.println("taggingImgUrl:" + updatedTaggingImgUrl);
+            System.out.println("-------------------------------------------------------------");
+            if (object.get("state") != null && object.getString("state").equals("success")) {
+                AjaxResult ajaxResult = remoteMonitorService.saveInsectPestsDeviceData(object);
+                log.info("数据推送成功! data ===> {} , result ===> {}", result, ajaxResult);
+                return AjaxResult.success("数据推送成功!", ajaxResult);
+            }
+            return AjaxResult.error("数据推送失败!", result);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("数据推送失败! data ===> {} , result ===> {}", result, e.getMessage());
+            return AjaxResult.error("数据推送失败!", result);
+        }
+    }
+
+    private JSONObject img(String oldTggingImgUrl) {
+        try {
+            //定义一个URL对象
+            URL url = new URL(insectPestsUrl + oldTggingImgUrl);
+            //打开连接
+            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+            //设置请求方式为"GET"
+            conn.setRequestMethod("GET");
+            //超时响应时间为10秒
+            conn.setConnectTimeout(10 * 1000);
+            //通过输入流获取图片数据
+            InputStream inStream = conn.getInputStream();
+            //得到图片的二进制数据,以二进制封装得到数据,具有通用性
+            byte[] data = readInputStream(inStream);
+            //new一个文件对象用来保存图片,默认保存当前工程根目录
+            File imageFile = new File("InputStreamInfo.jpg");
+            //创建输出流
+            FileOutputStream outStream = new FileOutputStream(imageFile);
+            //写入数据
+            outStream.write(data);
+            //关闭输出流
+            outStream.close();
+            MultipartFile multipartFile = FileUtils.getMultipartFile(imageFile);
+            R<SysFile> r = remoteMonitorService.upload(multipartFile);
+            return JSONObject.parseObject(JSONObject.toJSONString(r));
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new JSONObject();
+        }
+    }
+
+    private static byte[] readInputStream(InputStream inStream) throws Exception {
+        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
+        //创建一个Buffer字符串
+        byte[] buffer = new byte[6024];
+        //每次读取的字符串长度,如果为-1,代表全部读取完毕
+        int len = 0;
+        //使用一个输入流从buffer里把数据读取出来
+        while ((len = inStream.read(buffer)) != -1) {
+            //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
+            outStream.write(buffer, 0, len);
+        }
+        //关闭输入流
+        inStream.close();
+        //把outStream里的数据写入内存
+        return outStream.toByteArray();
+    }
+
+}

+ 12 - 0
src/main/java/com/sooka/sponest/middleground/monitoringEquipment/sennor/api/API.java

@@ -0,0 +1,12 @@
+package com.sooka.sponest.middleground.monitoringEquipment.sennor.api;
+
+public class API {
+
+    //获取设备信息
+    public static final String getDeviceInfo = "device/getDeviceInfo";
+    //查询设备节点数据接口
+    public static final String selSensorData = "device/selSensorData";
+
+    public static final String getInsectNewCollectionResult = "getInsectNewCollectionResult";
+
+}

+ 28 - 0
src/main/java/com/sooka/sponest/middleground/monitoringEquipment/sennor/controller/SennorController.java

@@ -0,0 +1,28 @@
+package com.sooka.sponest.middleground.monitoringEquipment.sennor.controller;
+
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.sooka.sponest.middleground.monitoringEquipment.sennor.service.SennorService;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("/api/Sennor")
+public class SennorController {
+
+    @Resource
+    private SennorService sennorService;
+
+    /**
+     * 查询设备节点数据
+     * */
+    @GetMapping("/getDeviceInfo/{deviceNumber}")
+    public AjaxResult getDeviceInfo(@PathVariable("deviceNumber") String deviceNumber){
+        return sennorService.getDeviceInfo(deviceNumber);
+    }
+
+
+}

+ 14 - 0
src/main/java/com/sooka/sponest/middleground/monitoringEquipment/sennor/service/SennorService.java

@@ -0,0 +1,14 @@
+package com.sooka.sponest.middleground.monitoringEquipment.sennor.service;
+
+import cn.hutool.json.JSONArray;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+
+public interface SennorService {
+
+    /**
+     * 查询设备节点数据
+     * */
+    AjaxResult getDeviceInfo(String deviceNumber);
+
+    JSONArray getDevideCodeMapByTypes(String types);
+}

+ 78 - 0
src/main/java/com/sooka/sponest/middleground/monitoringEquipment/sennor/service/impl/SennorServiceImpl.java

@@ -0,0 +1,78 @@
+package com.sooka.sponest.middleground.monitoringEquipment.sennor.service.impl;
+
+import cn.hutool.http.HttpRequest;
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.ruoyi.common.core.constant.HttpStatus;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.sooka.sponest.middleground.monitoringEquipment.sennor.api.API;
+import com.sooka.sponest.middleground.monitoringEquipment.sennor.service.SennorService;
+import com.sooka.sponest.middleground.remoteapi.service.center.monitor.RemoteMonitorService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+@Service
+public class SennorServiceImpl implements SennorService {
+
+    private static final Logger log = LoggerFactory.getLogger(SennorServiceImpl.class);
+
+    /**精讯物联网秘钥**/
+    @Value("${monitoringEquipment.sennor.sennorSecretKey:}")
+    public String sennorSecretKey;
+
+    /**精讯物联网服务地址**/
+    @Value("${monitoringEquipment.sennor.sennorUrl:}")
+    public String sennorUrl;
+
+    @Resource
+    public RemoteMonitorService remoteMonitorService;
+
+
+
+    //这个方法应该用定时任务三分钟调用一次
+    @Override
+    public AjaxResult getDeviceInfo(String deviceNumber) {
+        //先请求
+        StringBuffer URI = new StringBuffer(sennorUrl + API.getDeviceInfo);
+        URI.append("?secretKey=").append(sennorSecretKey);
+        URI.append("&deviceNumber=").append(deviceNumber);
+        String result = HttpRequest.get(URI.toString())
+                .header("Content-Type", "application/json")
+                .execute().body();
+        log.info("Sennor 收到数据 ==> {}", result);
+        //后推送
+        JSONObject object;
+        String res;
+        try {
+            object = JSONObject.parseObject(result);
+            AjaxResult ajaxResult = remoteMonitorService.saveSennorDeviceData(object);
+            log.info("数据推送成功! data ===> {} , result ===> {}",result, ajaxResult);
+            return AjaxResult.success("数据推送成功!",ajaxResult);
+        }catch(Exception e){
+            e.printStackTrace();
+            log.error("数据推送失败! data ===> {} , result ===> {}",result, e.getMessage());
+            return AjaxResult.error("数据推送失败!",result);
+        }
+
+    }
+
+    @Override
+    public JSONArray getDevideCodeMapByTypes(String types) {
+        //先请求
+        AjaxResult ajaxResult = remoteMonitorService.getDevideCodeMapByTypes(types);
+        try {
+            if(ajaxResult.get("code").equals(HttpStatus.SUCCESS)){
+                return JSONUtil.parseArray(ajaxResult.get("data"));
+            }
+        }catch(Exception e){
+            e.printStackTrace();
+            log.error("服务端数据校验失败! data ===> {} , result ===> {}", JSONUtil.toJsonStr(ajaxResult.get("data")), e.getMessage());
+        }
+        return new JSONArray();
+    }
+}

+ 116 - 0
src/main/java/com/sooka/sponest/middleground/monitoringEquipment/shuicejia/TcpServer.java

@@ -0,0 +1,116 @@
+package com.sooka.sponest.middleground.monitoringEquipment.shuicejia;
+
+import cn.hutool.core.io.BufferUtil;
+import cn.hutool.core.io.IORuntimeException;
+import cn.hutool.core.io.IoUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.socket.nio.NioServer;
+import com.alibaba.fastjson.JSONObject;
+import com.ruoyi.common.core.constant.HttpStatus;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.sooka.sponest.middleground.remoteapi.service.center.monitor.RemoteMonitorService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.nio.ByteBuffer;
+import java.nio.channels.SocketChannel;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+@Component
+public class TcpServer extends Thread implements CommandLineRunner {
+
+    private static final Logger log = LoggerFactory.getLogger(TcpServer.class);
+    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+    /**服务器地址**/
+    @Value("${monitoringEquipment.tcp.port:}")
+    public Integer port;
+
+    @Resource
+    public RemoteMonitorService remoteMonitorService;
+
+
+    @Override
+    public void run(String... args){
+        NioServer server = new NioServer(port);
+        server.setChannelHandler((sc)->{
+            ByteBuffer readBuffer = ByteBuffer.allocate(1024);
+            try{
+                int readBytes = sc.read(readBuffer);
+                if (readBytes > 0) {
+                    readBuffer.flip();
+                    byte[] bytes = new byte[readBuffer.remaining()];
+                    readBuffer.get(bytes);
+                    String body = StrUtil.utf8Str(bytes);
+                    readAndWrite(sc, body);
+                } else if (readBytes < 0) {
+                    IoUtil.close(sc);
+                }
+            } catch (IOException e){
+                throw new IORuntimeException(e);
+            }
+        });
+        server.listen();
+    }
+
+    public void readAndWrite(SocketChannel channel, String response) throws IOException {
+        JSONObject object;
+        AjaxResult result;
+        log.info("TCPServer 收到数据 ==> {}", response);
+        try {
+            object = JSONObject.parseObject(response);
+            //推送数据到监控中心
+            result = remoteMonitorService.saveWaterMonitoringData(object);
+            log.info("TCPServer 数据推送成功! result ===> {}", result);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.info("TCPServer 数据推送失败! result ===> {}", e.getMessage());
+            return;
+        }
+        //返回客户端数据
+        String st = object.get("ST").toString();
+        Integer serial = Integer.parseInt(object.get("SERIAL").toString());
+        JSONObject res = new JSONObject();
+        res.put("ST",st);
+        res.put("SERIAL",serial);
+        res.put("MARK",1);
+        res.put("TM", sdf.format(new Date()));
+        //将缓冲数据写入渠道,返回给客户端
+        channel.write(BufferUtil.createUtf8(res.toJSONString()));
+    }
+
+
+    /**
+     * 对象转Map
+     * @param object
+     * @return
+     * @throws IllegalAccessException
+     */
+    public static Map beanToMap(Object object){
+        Map<String, Object> map = new HashMap<>();
+        Field[] fields = object.getClass().getDeclaredFields();
+        for (Field field : fields) {
+            field.setAccessible(true);
+            try {
+                map.put(field.getName(), field.get(object));
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        }
+        return map;
+    }
+
+
+}
+
+

+ 22 - 0
src/main/java/com/sooka/sponest/middleground/remoteapi/EnableSookaFeignClients.java

@@ -0,0 +1,22 @@
+package com.sooka.sponest.middleground.remoteapi;
+
+import org.springframework.cloud.openfeign.EnableFeignClients;
+
+import java.lang.annotation.*;
+
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@EnableFeignClients
+public @interface EnableSookaFeignClients {
+
+    String[] value() default {};
+
+    String[] basePackages() default {"com.ruoyi", "com.sooka" };
+
+    Class<?>[] basePackageClasses() default {};
+
+    Class<?>[] defaultConfiguration() default {};
+
+    Class<?>[] clients() default {};
+}

+ 4 - 0
src/main/java/com/sooka/sponest/middleground/remoteapi/RemoveApiBaseService.java

@@ -0,0 +1,4 @@
+package com.sooka.sponest.middleground.remoteapi;
+
+public interface RemoveApiBaseService {
+}

+ 136 - 0
src/main/java/com/sooka/sponest/middleground/remoteapi/fallback/center/monitor/RemoteMonitorBaseServiceFallbackFactory.java

@@ -0,0 +1,136 @@
+package com.sooka.sponest.middleground.remoteapi.fallback.center.monitor;
+
+import com.alibaba.fastjson.JSONObject;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.system.api.domain.SysFile;
+import com.ruoyi.system.api.domain.SysUser;
+import com.ruoyi.system.api.factory.RemoteUserFallbackFactory;
+import com.sooka.sponest.middleground.remoteapi.service.center.monitor.RemoteMonitorService;
+import com.sooka.sponest.middleground.remoteapi.service.center.system.RemoteSystemService;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * @program: ruoyi
+ * @description: yy
+ * @author: yy
+ * @create: 2022-06-16 11:05
+ **/
+@Component
+public class RemoteMonitorBaseServiceFallbackFactory implements FallbackFactory<RemoteMonitorService> {
+
+    private static final Logger log = LoggerFactory.getLogger(RemoteUserFallbackFactory.class);
+
+    @Override
+    public RemoteMonitorService create(Throwable cause) {
+        log.error("监控中心-服务调用失败:{}", cause.getMessage());
+
+        return new RemoteMonitorService() {
+
+            @Override
+            public AjaxResult saveWaterMonitoringData(@RequestBody JSONObject json) {
+                return null;
+            }
+
+            @Override
+            public AjaxResult saveWaterPressureDeviceData(@RequestBody JSONObject json){
+                return null;
+            }
+
+            @Override
+            public AjaxResult saveSennorDeviceData(@RequestBody JSONObject json){
+                return null;
+            }
+
+            @Override
+            public AjaxResult getDevideCodeMapByTypes(@RequestBody String types){
+                return null;
+            }
+
+            @Override
+            public AjaxResult saveInsectPestsDeviceData(@RequestBody JSONObject json){
+                return null;
+            }
+
+            @Override
+            public R<SysFile> upload(MultipartFile file){
+                return null;
+            }
+
+            @Override
+            public AjaxResult configureBlackTasks() {
+                return null;
+            }
+
+            @Override
+            public AjaxResult configureWhiteTasks() {
+                return null;
+            }
+
+            @Override
+            public AjaxResult configureGpsTank() {
+                return null;
+            }
+
+            @Override
+            public AjaxResult selectGasTankDevicesNewEndTime() {
+                return null;
+            }
+
+            @Override
+            public AjaxResult remoteTrajectoryInsertBatch(JSONObject obj) {
+                return null;
+            }
+
+            @Override
+            public AjaxResult remoteMileageInsertBatch(JSONObject obj) {
+                return null;
+            }
+
+            @Override
+            public AjaxResult gpsTankInsertBatch(JSONObject obj) {
+                return null;
+            }
+
+            @Override
+            public AjaxResult getLongPollingPositionMsg() {
+                return null;
+            }
+
+            @Override
+            public AjaxResult updateDeviceStatusQuartz() {
+                return null;
+            }
+
+            @Override
+            public AjaxResult selectDayLineChartCountTask() {
+                return null;
+            }
+
+            @Override
+            public AjaxResult selectMonthlyLineChartCountTask() {
+                return null;
+            }
+
+            @Override
+            public AjaxResult quarterlineChartTask() {
+                return null;
+            }
+
+            @Override
+            public AjaxResult yearlineChartTask() {
+                return null;
+            }
+
+        };
+    }
+}

+ 53 - 0
src/main/java/com/sooka/sponest/middleground/remoteapi/fallback/center/system/RemoteSystemBaseServiceFallbackFactory.java

@@ -0,0 +1,53 @@
+package com.sooka.sponest.middleground.remoteapi.fallback.center.system;
+
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.system.api.domain.SysUser;
+import com.ruoyi.system.api.factory.RemoteUserFallbackFactory;
+import com.sooka.sponest.middleground.remoteapi.service.center.system.RemoteSystemService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @program: ruoyi
+ * @description: yy
+ * @author: yy
+ * @create: 2022-06-16 11:05
+ **/
+@Component
+public class RemoteSystemBaseServiceFallbackFactory implements FallbackFactory<RemoteSystemService> {
+
+    private static final Logger log = LoggerFactory.getLogger(RemoteUserFallbackFactory.class);
+
+    @Override
+    public RemoteSystemService create(Throwable cause) {
+        log.error("维护中心-服务调用失败:{}", cause.getMessage());
+
+        return new RemoteSystemService() {
+
+            @Override
+            public R<List<SysUser>> userFeginlist(SysUser user) {
+                return null;
+            }
+
+            @Override
+            public R<String> selectConfigKey_insectPestsUrl() {
+                return null;
+            }
+
+            @Override
+            public R<String> selectConfigKey_fileUrl() {
+                return null;
+            }
+
+            @Override
+            public R<String> remotegetConfigKey(String configKey) {
+                return null;
+            }
+
+        };
+    }
+}

+ 46 - 0
src/main/java/com/sooka/sponest/middleground/remoteapi/service/ModulesServiceNameContants.java

@@ -0,0 +1,46 @@
+package com.sooka.sponest.middleground.remoteapi.service;
+
+import com.ruoyi.common.core.constant.ServiceNameConstants;
+
+public class ModulesServiceNameContants extends ServiceNameConstants {
+
+    //综合治理中心中心
+   public static final String CENTER_COMPREHENSIVE = "sooka-sponest-center-comprehensive";
+
+   //数据中心
+   public static final String CENTER_DATA = "sooka-sponest-center-data";
+
+   //测评中心
+   public static final String CENTER_EVALUATION = "sooka-sponest-center-evaluation";
+
+    //事件中心
+    public static final String CENTER_EVENT = "sooka-sponest-center-event";
+
+    //森林防火中心
+    public static final String CENTER_FIRE = "sooka-sponest-center-fire";
+
+    //监控中心
+    public static final String CENTER_MONITOR = "sooka-sponest-center-monitor";
+
+    //一体化平台
+    public static final String CENTER_ONEST = "sooka-sponest-center-onest";
+
+    //病虫灾害中心
+    public static final String CENTER_PESTS = "sooka-sponest-center-pests";
+
+    //秸秆禁烧中心
+    public static final String CENTER_STRAW = "sooka-sponest-center-straw";
+
+    //任务中心
+    public static final String CENTER_TASK = "sooka-sponest-center-task";
+
+    //运管中心
+    public static final String CENTER_TRANMANAGER = "sooka-sponest-center-tranmanager";
+    //文件中心
+    public static final String CENTER_FILE = "sooka-sponest-file";
+    /**
+     * 系统模块的serviceid
+     */
+    public static final String SYSTEM_SERVICE = "sooka-sponest-system";
+
+}

+ 164 - 0
src/main/java/com/sooka/sponest/middleground/remoteapi/service/center/monitor/RemoteMonitorService.java

@@ -0,0 +1,164 @@
+package com.sooka.sponest.middleground.remoteapi.service.center.monitor;
+
+import com.alibaba.fastjson.JSONObject;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.system.api.domain.SysFile;
+import com.ruoyi.system.api.domain.SysUser;
+import com.sooka.sponest.middleground.remoteapi.fallback.center.monitor.RemoteMonitorBaseServiceFallbackFactory;
+import com.sooka.sponest.middleground.remoteapi.fallback.center.system.RemoteSystemBaseServiceFallbackFactory;
+import com.sooka.sponest.middleground.remoteapi.service.ModulesServiceNameContants;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+@FeignClient(
+        contextId = "remoteMonitorService"
+        ,value = ModulesServiceNameContants.MONITOR_SERVICE
+        ,fallbackFactory = RemoteMonitorBaseServiceFallbackFactory.class
+        ,url = "${sooka.service.monitor}"
+)
+public interface RemoteMonitorService {
+    /**
+     * 【水流速推送】向监控中心推送水流速采集数据
+     * @param json
+     * @return AjaxResult
+     * @author limeng
+     * @date 2023/7/31 16:27
+     **/
+    @PostMapping("/device/saveWaterMonitoringData")
+    public AjaxResult saveWaterMonitoringData(@RequestBody JSONObject json);
+
+
+    /**
+     * 【水压】接收城安盛邦 水压传感器数据方法
+     * */
+    @PostMapping("/device/saveWaterPressureDeviceData")
+    public AjaxResult saveWaterPressureDeviceData(@RequestBody JSONObject json);
+
+    /**
+     * 【物联网】接收精讯传感器:大气、水质、土壤墒情数据通用方法
+     * */
+    @ApiOperation(value = "接收精讯传感器数据通用方法", notes = "接收精讯传感器数据通用方法")
+    @PostMapping("/device/saveSennorDeviceData")
+    public AjaxResult saveSennorDeviceData(@RequestBody JSONObject json);
+
+    /**
+     * 【水流速】根据设备类型查询监控设备Map
+     * */
+    @ApiOperation(value = "接收传感器水质数据", notes = "接收传感器水质数据")
+    @PostMapping("/device/getDevideCodeMapByTypes")
+    public AjaxResult getDevideCodeMapByTypes(@RequestBody String types);
+
+    /**
+     * 【病虫害】接收病虫害传感器数据方法
+     * */
+    @ApiOperation(value = "接收病虫害传感器数据", notes = "接收病虫害传感器数据")
+    @PostMapping("/device/saveInsectPestsDeviceData")
+    public AjaxResult saveInsectPestsDeviceData(@RequestBody JSONObject json);
+
+    /**
+     * 病虫害文件上传
+     */
+    @PostMapping (value = "/centerMonitorFeign/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public R<SysFile> upload(MultipartFile file);
+
+    /**
+     * 对接大华黑天云台日志定时任务
+     * */
+    @ApiOperation(value = "对接大华黑天云台日志定时任务", notes = "对接大华黑天云台日志定时任务")
+    @PostMapping("/dahuaOperateLog/configureBlackTasks")
+    public AjaxResult configureBlackTasks();
+
+    /**
+     * 对接大华白天云台日志定时任务
+     * */
+    @ApiOperation(value = "对接大华白天云台日志定时任务", notes = "对接大华白天云台日志定时任务")
+    @PostMapping("/dahuaOperateLog/configureWhiteTasks")
+    public AjaxResult configureWhiteTasks();
+
+    /**
+     * 对接定位设备车辆gps定时任务
+     * */
+    @ApiOperation(value = "对接定位设备车辆gps定时任务", notes = "对接定位设备车辆gps定时任务")
+    @GetMapping("/gps/gasTank/queryTracks")
+    public AjaxResult configureGpsTank();
+
+    /**
+     * 获取最新一次行动轨迹时间的设备id列表
+     * */
+    @ApiOperation(value = "获取最新一次行动轨迹时间的设备id列表", notes = "获取最新一次行动轨迹时间的设备id列表")
+    @GetMapping("/gps/devices/selectGasTankDevicesNewEndTime")
+    public AjaxResult selectGasTankDevicesNewEndTime();
+
+    /**
+     * 新增北斗卫星定位车辆gps历史轨迹
+     * */
+    @ApiOperation(value = "新增北斗卫星定位车辆gps历史轨迹", notes = "新增北斗卫星定位车辆gps历史轨迹")
+    @PostMapping("/gps/trajectory/remoteInsertBatch")
+    public AjaxResult remoteTrajectoryInsertBatch(@RequestBody JSONObject obj);
+
+    /**
+     * 新增北斗卫星定位车辆gps历史行程
+     * */
+    @ApiOperation(value = "新增北斗卫星定位车辆gps历史行程", notes = "新增北斗卫星定位车辆gps历史行程")
+    @PostMapping("/gps/mileage/remoteInsertBatch")
+    public AjaxResult remoteMileageInsertBatch(@RequestBody JSONObject obj);
+
+    /**
+     * 新增煤气罐设备信息
+     * */
+    @ApiOperation(value = "新增煤气罐设备信息", notes = "新增煤气罐设备信息")
+    @PostMapping("/gps/devices/gpsTankInsertBatch")
+    public AjaxResult gpsTankInsertBatch(@RequestBody JSONObject obj);
+
+
+    /**
+     * 对接大华根据组织获取执法记录仪、单兵设备在线状态定时任务
+     * */
+    @ApiOperation(value = "对接大华根据组织获取执法记录仪、单兵设备在线状态定时任务", notes = "对接大华根据组织获取执法记录仪、单兵设备在线状态定时任务")
+    @GetMapping("/equipmentStatus/quartz/getLongPollingPositionMsg")
+    public AjaxResult getLongPollingPositionMsg();
+
+    /**
+     * 传感器设备定时任务
+     * */
+    @ApiOperation(value = "传感器设备定时任务", notes = "传感器设备定时任务")
+    @GetMapping("/device/quartz/updateDeviceStatusQuartz")
+    public AjaxResult updateDeviceStatusQuartz();
+
+    /**
+     * 监控中心首页-离线设备日折线图缓存
+     * */
+    @ApiOperation(value = "监控中心首页-离线设备日折线图缓存", notes = "监控中心首页-离线设备日折线图缓存")
+    @GetMapping("/camera/quartz/selectDayLineChartCountTask")
+    public AjaxResult selectDayLineChartCountTask();
+
+    /**
+     * 监控中心首页-离线设备月折线图缓存
+     * */
+    @ApiOperation(value = "监控中心首页-离线设备月折线图缓存", notes = "监控中心首页-离线设备月折线图缓存")
+    @GetMapping("/camera/quartz/selectMonthlyLineChartCountTask")
+    public AjaxResult selectMonthlyLineChartCountTask();
+
+    /**
+     * 监控中心首页-离线设备季度折线图缓存
+     * */
+    @ApiOperation(value = "监控中心首页-离线设备季度折线图缓存", notes = "监控中心首页-离线设备季度折线图缓存")
+    @GetMapping("/camera/quartz/quarterlineChartTask")
+    public AjaxResult quarterlineChartTask();
+
+    /**
+     * 监控中心首页-离线设备年折线图缓存
+     * */
+    @ApiOperation(value = "监控中心首页-离线设备年折线图缓存", notes = "监控中心首页-离线设备年折线图缓存")
+    @GetMapping("/camera/quartz/yearlineChartTask")
+    public AjaxResult yearlineChartTask();
+
+}

+ 46 - 0
src/main/java/com/sooka/sponest/middleground/remoteapi/service/center/system/RemoteSystemService.java

@@ -0,0 +1,46 @@
+package com.sooka.sponest.middleground.remoteapi.service.center.system;
+
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.system.api.domain.SysUser;
+import com.sooka.sponest.middleground.remoteapi.fallback.center.system.RemoteSystemBaseServiceFallbackFactory;
+import com.sooka.sponest.middleground.remoteapi.service.ModulesServiceNameContants;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
+
+@FeignClient(contextId = "remoteSystemService", fallbackFactory = RemoteSystemBaseServiceFallbackFactory.class,value = ModulesServiceNameContants.SYSTEM_SERVICE)
+public interface RemoteSystemService {
+    /**
+     * 获取系统用户
+     *
+     * @param user
+     * @return com.ruoyi.common.core.domain.R<java.util.List < com.ruoyi.system.api.domain.SysUser>>
+     * @author pengyu
+     * @date 2023/3/8 16:27
+     **/
+    @PostMapping("/user/userFeginlist")
+    public R<List<SysUser>> userFeginlist(@RequestBody SysUser user);
+
+    /**
+     * 获取系统参数配置
+     *
+     * @return com.ruoyi.common.core.domain.R<java.lang.String>
+     * @author pengyu
+     * @date 2023/3/8 16:27
+     **/
+    @GetMapping("/config/selectConfigKey/insectPestsUrl")
+    public R<String> selectConfigKey_insectPestsUrl();
+
+    @GetMapping("/config/selectConfigKey/fileUrl")
+    public R<String> selectConfigKey_fileUrl();
+
+    @PostMapping(value = "/config/remotegetConfigKey")
+    R<String> remotegetConfigKey(@RequestBody String configKey);
+
+
+
+
+}

+ 161 - 0
src/main/java/com/sooka/sponest/middleground/scheduleTask/StaticScheduleTask.java

@@ -0,0 +1,161 @@
+package com.sooka.sponest.middleground.scheduleTask;
+
+import cn.hutool.json.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.ruoyi.common.core.utils.DateUtils;
+import com.sooka.sponest.middleground.controller.MonitorController;
+import com.sooka.sponest.middleground.monitoringEquipment.inserctpests.service.PlantDiseasesAndInsectPestsService;
+import com.sooka.sponest.middleground.monitoringEquipment.sennor.service.SennorService;
+import com.sooka.sponest.middleground.remoteapi.service.center.monitor.RemoteMonitorService;
+import org.apache.commons.lang3.time.FastDateFormat;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+
+import javax.annotation.Resource;
+import java.text.ParseException;
+import java.util.Calendar;
+
+
+/**
+ * @author limeng
+ * @date 2023年11月30日 8:50
+ */
+@Configuration
+@EnableScheduling
+public class StaticScheduleTask {
+
+    protected static final Logger logger = LoggerFactory.getLogger(StaticScheduleTask.class);
+
+    private static FastDateFormat simpleDateFormat = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss");
+
+    @Resource
+    private SennorService sennorService;
+
+    @Resource
+    private PlantDiseasesAndInsectPestsService plantDiseasesAndInsectPestsService;
+
+    /**
+     * 精讯物联网设备类型
+     **/
+    @Value("${monitoringEquipment.sennor.sennorDeviceTypes:}")
+    public String sennorDeviceTypes;
+
+    /**
+     * 精讯物联网病虫害设备类型
+     **/
+    @Value("${monitoringEquipment.insect.sennorInsectDeviceType:}")
+    public String sennorInsectDeviceType;
+
+    @Resource
+    public RemoteMonitorService remoteMonitorService;
+    @Resource
+    public MonitorController monitorController;
+
+
+    @Scheduled(cron = "0 0 0/2 * * ?")//添加定时任务 每2小时执行
+//    @Scheduled(cron = "0 */5 * * * ?")//添加定时任务 每1分钟执行
+    private void configureTasks() {
+        logger.info("执行物联网数据采集定时任务=>{}", DateUtils.dateTimeNow());
+        JSONArray jsonArray = sennorService.getDevideCodeMapByTypes(sennorDeviceTypes);
+        for (Object object : jsonArray) {
+            JSONObject jsonObject = JSONObject.parseObject(object.toString());
+            sennorService.getDeviceInfo(jsonObject.getString("device_code"));
+        }
+    }
+
+
+    @Scheduled(cron = "0 0 0/2 * * ?")//添加定时任务 每2小时执行
+//    @Scheduled(cron = "0 */5 * * * ?")//添加定时任务 每1分钟执行
+    private void configureTask() {
+        logger.info("执行虫情数据采集定时任务=>{}", DateUtils.dateTimeNow());
+        JSONArray jsonArray = sennorService.getDevideCodeMapByTypes(sennorInsectDeviceType);
+        for (Object object : jsonArray) {
+            JSONObject jsonObject = JSONObject.parseObject(object.toString());
+            plantDiseasesAndInsectPestsService.plantDiseasesAndInsectPestsMessageReceiver(jsonObject.getString("device_code"));
+        }
+    }
+
+    @Scheduled(cron = "0 0 1 * * ?")//添加定时任务 每天1点执行
+    private void configureBlackTasks() {
+        logger.info("执行凌晨1点对接大华云台日志定时任务=>{}", DateUtils.dateTimeNow());
+        remoteMonitorService.configureBlackTasks();
+    }
+
+    @Scheduled(cron = "0 0/10 * * * ?")//添加定时任务 每10分钟执行
+    private void configureWhiteTasks() {
+        logger.info("执行每10分钟对接大华云台日志定时任务务=>{}", DateUtils.dateTimeNow());
+        remoteMonitorService.configureWhiteTasks();
+    }
+
+
+    @Scheduled(cron = "0 0/10 * * * ?")//添加定时任务 每天10分钟执行
+    private void configureGpsTank() throws Exception {
+        logger.info("执行每天10分钟一次对接北斗卫星定位设备车辆轨迹和行程定时任务=>{}", DateUtils.dateTimeNow());
+        monitorController.configureGpsTank();
+    }
+
+    @Scheduled(cron = "0 0/5 * * * ?")//添加定时任务 每5分钟执行一次
+    private void getLongPollingPositionMsg() {
+        logger.info("对接大华根据组织获取执法记录仪、单兵设备在线状态定时任务定时任务=>{}", DateUtils.dateTimeNow());
+        remoteMonitorService.getLongPollingPositionMsg();
+    }
+
+    @Scheduled(cron = "0 0 */2 * * ?")//添加定时任务 每两小时执行一次
+    private void updateDeviceStatusQuartz() {
+        logger.info("传感器设备定时任务=>{}", DateUtils.dateTimeNow());
+        remoteMonitorService.updateDeviceStatusQuartz();
+    }
+
+    @Scheduled(cron = "0 0 */2 * * ?")//添加定时任务 每两小时执行一次
+    private void selectDayLineChartCountTask() {
+        logger.info("监控中心首页-离线设备日折线图缓存定时任务=>{}", DateUtils.dateTimeNow());
+        remoteMonitorService.selectDayLineChartCountTask();
+    }
+
+    @Scheduled(cron = "0 0 */2 * * ?")//添加定时任务 每两小时执行一次
+    private void selectMonthlyLineChartCountTask() {
+        logger.info("监控中心首页-离线设备月折线图缓存存定时任务=>{}", DateUtils.dateTimeNow());
+        remoteMonitorService.selectMonthlyLineChartCountTask();
+    }
+
+    @Scheduled(cron = "0 0 */2 * * ?")//添加定时任务 每两小时执行一次
+    private void quarterlineChartTask() {
+        logger.info("监控中心首页-离线设备季度折线图缓存定时任务=>{}", DateUtils.dateTimeNow());
+        remoteMonitorService.quarterlineChartTask();
+    }
+
+    @Scheduled(cron = "0 0 */2 * * ?")//添加定时任务 每两小时执行一次
+    private void yearlineChartTask() {
+        logger.info("监控中心首页-离线设备年折线图缓存定时任务=>{}", DateUtils.dateTimeNow());
+        remoteMonitorService.yearlineChartTask();
+    }
+
+
+    /**
+     * 比较两个日期大小
+     **/
+    private boolean daysBefore(String time) {
+        boolean result = false;
+        try {
+            Calendar calendar = getCalendar(time);
+            Calendar now = Calendar.getInstance();
+            result = calendar.before(now);
+        } catch (ParseException e) {
+            logger.error(e.getMessage());
+        }
+        return result;
+    }
+
+    /**
+     * 将String时间转换为Calendar
+     **/
+    private static Calendar getCalendar(String time) throws ParseException {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(simpleDateFormat.parse(time));
+        return calendar;
+    }
+}

+ 287 - 0
src/main/java/com/sooka/sponest/middleground/scheduleTask/entity/GasTankDevices.java

@@ -0,0 +1,287 @@
+package com.sooka.sponest.middleground.scheduleTask.entity;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.core.annotation.Excel;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author ruoyi
+ * @date 2023-12-09
+ */
+@Data
+public class GasTankDevices {
+
+    private static final long serialVersionUID = 1L;
+
+    /** 主键id */
+    private Long id;
+
+    /** 设备序列号,全局唯一 */
+    @Excel(name = "设备序列号,全局唯一")
+    private String deviceid;
+
+    /** 设备名称 */
+    @Excel(name = "设备名称")
+    private String devicename;
+
+    /** 设备类型 */
+    @Excel(name = "设备类型")
+    private Long devicetype;
+
+    /** SIM号码 */
+    @Excel(name = "SIM号码")
+    private String simnum;
+
+    /** 过期时间 */
+    @Excel(name = "过期时间")
+    private Long overduetime;
+
+    /** 到期通知时间 */
+    @Excel(name = "到期通知时间")
+    private Long expirnotifytime;
+
+    /** 哪个用户创建的,方便快速查找分组 */
+    @Excel(name = "哪个用户创建的,方便快速查找分组")
+    private String creater;
+
+    /** 备注 */
+    @Excel(name = "备注")
+    private String remark;
+
+    /** 默认摄像头数量 */
+    @Excel(name = "默认摄像头数量")
+    private Long videochannelcount;
+
+    /** 上一次在线时间 */
+    @Excel(name = "上一次在线时间")
+    private Long lastactivetime;
+
+    /** 是否能正常使用: 1 正常使用, 2 正在体验, 3 已禁用, 4 设备到期, 5 设备过期 */
+    @Excel(name = "是否能正常使用: 1 正常使用, 2 正在体验, 3 已禁用, 4 设备到期, 5 设备过期")
+    private Long isfree;
+
+    /** 0代表不允许二级普通用户编辑, 1代表允许 */
+    @Excel(name = "0代表不允许二级普通用户编辑, 1代表允许")
+    private Long allowedit;
+
+    /** 默认图标, 0代表小车 */
+    @Excel(name = "默认图标, 0代表小车")
+    private Long icon;
+
+    /** 是否关注: 0 代表未关注, 1代表关注 */
+    @Excel(name = "是否关注: 0 代表未关注, 1代表关注")
+    private Long stared;
+
+    /** 登录名称 */
+    @Excel(name = "登录名称")
+    private String loginname;
+
+    private String deptId;
+    private String maxspeed;
+    private String averagespeed;
+    private String endtime;
+
+    private List<GeoLocation> trajectory;
+    public List<GeoLocation> getTrajectory() {
+        return trajectory;
+    }
+    public void setTrajectory(List<GeoLocation> trajectory) {
+        this.trajectory = trajectory;
+    }
+
+
+    public static class GeoLocation {
+
+        private String callat; //计算出来的纬度
+        private String callon; //计算出来的经度
+        @JsonFormat(
+                pattern = "yyyy-MM-dd HH:mm:ss"
+        )
+        private Date  createTime; //时间
+
+        public  Date  getCreateTime() {
+            return createTime;
+        }
+
+        public void setCreateTime( Date  createTime) {
+            this.createTime = createTime;
+        }
+
+
+
+        public String getCallat() {
+            return callat;
+        }
+
+        public void setCallat(String callat) {
+            this.callat = callat;
+        }
+
+        public String getCallon() {
+            return callon;
+        }
+
+        public void setCallon(String callon) {
+            this.callon = callon;
+        }
+    }
+
+
+
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getDeviceid() {
+        return deviceid;
+    }
+
+    public void setDeviceid(String deviceid) {
+        this.deviceid = deviceid;
+    }
+
+    public String getDevicename() {
+        return devicename;
+    }
+
+    public void setDevicename(String devicename) {
+        this.devicename = devicename;
+    }
+
+    public Long getDevicetype() {
+        return devicetype;
+    }
+
+    public void setDevicetype(Long devicetype) {
+        this.devicetype = devicetype;
+    }
+
+    public String getSimnum() {
+        return simnum;
+    }
+
+    public void setSimnum(String simnum) {
+        this.simnum = simnum;
+    }
+
+    public Long getOverduetime() {
+        return overduetime;
+    }
+
+    public void setOverduetime(Long overduetime) {
+        this.overduetime = overduetime;
+    }
+
+    public Long getExpirnotifytime() {
+        return expirnotifytime;
+    }
+
+    public void setExpirnotifytime(Long expirnotifytime) {
+        this.expirnotifytime = expirnotifytime;
+    }
+
+    public String getCreater() {
+        return creater;
+    }
+
+    public void setCreater(String creater) {
+        this.creater = creater;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Long getVideochannelcount() {
+        return videochannelcount;
+    }
+
+    public void setVideochannelcount(Long videochannelcount) {
+        this.videochannelcount = videochannelcount;
+    }
+
+    public Long getLastactivetime() {
+        return lastactivetime;
+    }
+
+    public void setLastactivetime(Long lastactivetime) {
+        this.lastactivetime = lastactivetime;
+    }
+
+    public Long getIsfree() {
+        return isfree;
+    }
+
+    public void setIsfree(Long isfree) {
+        this.isfree = isfree;
+    }
+
+    public Long getAllowedit() {
+        return allowedit;
+    }
+
+    public void setAllowedit(Long allowedit) {
+        this.allowedit = allowedit;
+    }
+
+    public Long getIcon() {
+        return icon;
+    }
+
+    public void setIcon(Long icon) {
+        this.icon = icon;
+    }
+
+    public Long getStared() {
+        return stared;
+    }
+
+    public void setStared(Long stared) {
+        this.stared = stared;
+    }
+
+    public String getLoginname() {
+        return loginname;
+    }
+
+    public void setLoginname(String loginname) {
+        this.loginname = loginname;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+                .append("id", getId())
+                .append("deviceid", getDeviceid())
+                .append("devicename", getDevicename())
+                .append("devicetype", getDevicetype())
+                .append("simnum", getSimnum())
+                .append("overduetime", getOverduetime())
+                .append("expirnotifytime", getExpirnotifytime())
+                .append("remark", getRemark())
+                .append("creater", getCreater())
+                .append("videochannelcount", getVideochannelcount())
+                .append("lastactivetime", getLastactivetime())
+                .append("isfree", getIsfree())
+                .append("allowedit", getAllowedit())
+                .append("icon", getIcon())
+                .append("stared", getStared())
+                .append("loginname", getLoginname())
+                .toString();
+    }
+
+}

+ 197 - 0
src/main/java/com/sooka/sponest/middleground/util/CacheUtils.java

@@ -0,0 +1,197 @@
+package com.sooka.sponest.middleground.util;
+
+import com.sooka.sponest.middleground.util.spring.SpringUtils;
+import org.apache.shiro.cache.Cache;
+import org.apache.shiro.cache.CacheManager;
+import org.apache.shiro.cache.ehcache.EhCacheManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * Cache工具类
+ *
+ * @author ruoyi
+ */
+public class CacheUtils
+{
+    private static Logger logger = LoggerFactory.getLogger(CacheUtils.class);
+
+    private static CacheManager cacheManager = SpringUtils.getBean(CacheManager.class);
+
+    private static final String SYS_CACHE = "sys-cache";
+
+    /**
+     * 获取SYS_CACHE缓存
+     *
+     * @param key
+     * @return
+     */
+    public static Object get(String key)
+    {
+        return get(SYS_CACHE, key);
+    }
+
+    /**
+     * 获取SYS_CACHE缓存
+     *
+     * @param key
+     * @param defaultValue
+     * @return
+     */
+    public static Object get(String key, Object defaultValue)
+    {
+        Object value = get(key);
+        return value != null ? value : defaultValue;
+    }
+
+    /**
+     * 写入SYS_CACHE缓存
+     *
+     * @param key
+     * @return
+     */
+    public static void put(String key, Object value)
+    {
+        put(SYS_CACHE, key, value);
+    }
+
+    /**
+     * 从SYS_CACHE缓存中移除
+     *
+     * @param key
+     * @return
+     */
+    public static void remove(String key)
+    {
+        remove(SYS_CACHE, key);
+    }
+
+    /**
+     * 获取缓存
+     *
+     * @param cacheName
+     * @param key
+     * @return
+     */
+    public static Object get(String cacheName, String key)
+    {
+        return getCache(cacheName).get(getKey(key));
+    }
+
+    /**
+     * 获取缓存
+     *
+     * @param cacheName
+     * @param key
+     * @param defaultValue
+     * @return
+     */
+    public static Object get(String cacheName, String key, Object defaultValue)
+    {
+        Object value = get(cacheName, getKey(key));
+        return value != null ? value : defaultValue;
+    }
+
+    /**
+     * 写入缓存
+     *
+     * @param cacheName
+     * @param key
+     * @param value
+     */
+    public static void put(String cacheName, String key, Object value)
+    {
+        getCache(cacheName).put(getKey(key), value);
+    }
+
+    /**
+     * 从缓存中移除
+     *
+     * @param cacheName
+     * @param key
+     */
+    public static void remove(String cacheName, String key)
+    {
+        getCache(cacheName).remove(getKey(key));
+    }
+
+    /**
+     * 从缓存中移除所有
+     *
+     * @param cacheName
+     */
+    public static void removeAll(String cacheName)
+    {
+        Cache<String, Object> cache = getCache(cacheName);
+        Set<String> keys = cache.keys();
+        for (Iterator<String> it = keys.iterator(); it.hasNext();)
+        {
+            cache.remove(it.next());
+        }
+        logger.info("清理缓存: {} => {}", cacheName, keys);
+    }
+
+    /**
+     * 从缓存中移除指定key
+     *
+     * @param keys
+     */
+    public static void removeByKeys(Set<String> keys)
+    {
+        removeByKeys(SYS_CACHE, keys);
+    }
+
+    /**
+     * 从缓存中移除指定key
+     *
+     * @param cacheName
+     * @param keys
+     */
+    public static void removeByKeys(String cacheName, Set<String> keys)
+    {
+        for (Iterator<String> it = keys.iterator(); it.hasNext();)
+        {
+            remove(it.next());
+        }
+        logger.info("清理缓存: {} => {}", cacheName, keys);
+    }
+
+    /**
+     * 获取缓存键名
+     *
+     * @param key
+     * @return
+     */
+    private static String getKey(String key)
+    {
+        return key;
+    }
+
+    /**
+     * 获得一个Cache,没有则显示日志。
+     *
+     * @param cacheName
+     * @return
+     */
+    public static Cache<String, Object> getCache(String cacheName)
+    {
+        Cache<String, Object> cache = cacheManager.getCache(cacheName);
+        if (cache == null)
+        {
+            throw new RuntimeException("当前系统中没有定义“" + cacheName + "”这个缓存。");
+        }
+        return cache;
+    }
+
+    /**
+     * 获取所有缓存
+     *
+     * @return 缓存组
+     */
+    public static String[] getCacheNames()
+    {
+        return ((EhCacheManager) cacheManager).getCacheManager().getCacheNames();
+    }
+}

+ 32 - 0
src/main/java/com/sooka/sponest/middleground/util/FileUtils.java

@@ -0,0 +1,32 @@
+package com.sooka.sponest.middleground.util;
+
+import com.alibaba.cloud.commons.io.IOUtils;
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.springframework.http.MediaType;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.commons.CommonsMultipartFile;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+public class FileUtils {
+
+    public static MultipartFile getMultipartFile(File file) {
+        FileItem item = new DiskFileItemFactory().createItem("file"
+                , MediaType.MULTIPART_FORM_DATA_VALUE
+                , true
+                , file.getName());
+        try (InputStream input = new FileInputStream(file);
+             OutputStream os = item.getOutputStream()) {
+            // 流转移
+            IOUtils.copy(input, os, 1024);
+        } catch (Exception e) {
+            throw new IllegalArgumentException("Invalid file: " + e, e);
+        }
+
+        return new CommonsMultipartFile(item);
+    }
+}

+ 53 - 0
src/main/java/com/sooka/sponest/middleground/util/HmacSHA256.java

@@ -0,0 +1,53 @@
+package com.sooka.sponest.middleground.util;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.UnsupportedEncodingException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+
+public class HmacSHA256 {
+
+    //十六进制字符集
+    private final static char[] DIGEST_ARRAYS = {
+            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
+    };
+
+    /**
+     * 功能:Signature生成算法
+     * 输入参数:
+     *          1.data: HMAC-SHA256的输入数据
+     *          2.key: App Key
+     * 输出参数:十六进制字符串编码的HMAC-SHA256值
+     */
+    public static String encode(String data, String key) {
+        byte[] hashByte;
+        try {
+            Mac sha256HMAC = Mac.getInstance("HmacSHA256");
+            SecretKeySpec secretKey = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256");
+            sha256HMAC.init(secretKey);
+
+            hashByte = sha256HMAC.doFinal(data.getBytes("UTF-8"));
+        } catch (NoSuchAlgorithmException | UnsupportedEncodingException | InvalidKeyException e) {
+            return null;
+        }
+
+        return bytesToHex(hashByte);
+    }
+
+    /**
+     * 功能:byte类型数组转换成十六进制字符串
+     * 输入参数:
+     *          1.bytes:被转换的字节数组
+     * 输出参数:十六进制字符串
+     */
+    private static String bytesToHex(byte[] bytes) {
+        StringBuffer hexStr = new StringBuffer();
+        for (int i = 0; i < bytes.length; i++) {
+            hexStr.append(DIGEST_ARRAYS[bytes[i] >>> 4 & 0X0F]);
+            hexStr.append(DIGEST_ARRAYS[bytes[i] & 0X0F]);
+        }
+
+        return hexStr.toString();
+    }
+}

+ 54 - 0
src/main/java/com/sooka/sponest/middleground/util/LoginUtil.java

@@ -0,0 +1,54 @@
+package com.sooka.sponest.middleground.util;
+
+import com.alibaba.fastjson.JSONObject;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.conn.ssl.NoopHostnameVerifier;
+import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.impl.client.LaxRedirectStrategy;
+import org.apache.http.ssl.SSLContextBuilder;
+import org.apache.http.util.EntityUtils;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLContext;
+
+public class LoginUtil {
+
+    public static String login(String ip,String username, String psd) throws Exception {
+        //取消证书认证
+        SSLContext sslContext = SSLContextBuilder.create()
+                .loadTrustMaterial(new TrustSelfSignedStrategy())
+                .build();
+        HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;
+        HttpClient httpClient = HttpClients.custom()
+                .setSSLContext(sslContext)
+                .setSSLHostnameVerifier(hostnameVerifier)
+                .setRedirectStrategy(new LaxRedirectStrategy())
+                .build();
+        HttpPost httpPost = new HttpPost(ip + "/webapi?action=login");
+        String password = MD5Util.Md5(psd);
+        String requestBody = "{\r\n\t\"type\": \"USER\",\r\n\t\"from\": \"web\",\r\n\t\"username\": \"" + username +"\",\r\n\t\"password\": \"" + password + "\",\r\n\t\"browser\": \"Chrome/104.0.0.0\"\r\n}";
+        StringEntity requestEntity = new StringEntity(requestBody, ContentType.APPLICATION_JSON);
+        httpPost.setEntity(requestEntity);
+        HttpResponse response = httpClient.execute(httpPost);
+        HttpEntity responseEntity = response.getEntity();
+        String responseBody = EntityUtils.toString(responseEntity);
+        JSONObject jsonObject = JSONObject.parseObject(responseBody);
+        if (ObjectUtils.isNotEmpty(jsonObject) && jsonObject.get("status").toString().equals("0")) {
+            return jsonObject.get("token").toString();
+        } else {
+            throw new Exception("获取token失败,请检查!!!");
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        LoginUtil.login("https://www.gps51.com","演示测试组", "Ys2024");
+    }
+
+}

+ 33 - 0
src/main/java/com/sooka/sponest/middleground/util/MD5Util.java

@@ -0,0 +1,33 @@
+package com.sooka.sponest.middleground.util;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+public class MD5Util {
+
+    public static String Md5(String plainText) {
+        try {
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            md.update(plainText.getBytes());
+            byte b[] = md.digest();
+            int i;
+            StringBuffer buf = new StringBuffer("");
+            for (int offset = 0; offset < b.length; offset++) {
+                i = b[offset];
+                if (i < 0) i += 256;
+                if (i < 16) buf.append("0");
+                buf.append(Integer.toHexString(i));
+            }
+            return buf.toString();
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+            return "";
+        }
+    }
+
+    public static void main(String[] args) {
+        MD5Util.Md5("Ys2024");
+    }
+
+}
+

+ 626 - 0
src/main/java/com/sooka/sponest/middleground/util/StringUtils.java

@@ -0,0 +1,626 @@
+package com.sooka.sponest.middleground.util;
+
+import com.ruoyi.common.core.constant.Constants;
+import com.ruoyi.common.core.text.StrFormatter;
+import org.springframework.util.AntPathMatcher;
+
+import java.util.*;
+
+/**
+ * 字符串工具类
+ *
+ * @author ruoyi
+ */
+public class StringUtils extends org.apache.commons.lang3.StringUtils
+{
+    /** 空字符串 */
+    private static final String NULLSTR = "";
+
+    /** 下划线 */
+    private static final char SEPARATOR = '_';
+
+    /**
+     * 获取参数不为空值
+     *
+     * @param value defaultValue 要判断的value
+     * @return value 返回值
+     */
+    public static <T> T nvl(T value, T defaultValue)
+    {
+        return value != null ? value : defaultValue;
+    }
+
+    /**
+     * * 判断一个Collection是否为空, 包含List,Set,Queue
+     *
+     * @param coll 要判断的Collection
+     * @return true:为空 false:非空
+     */
+    public static boolean isEmpty(Collection<?> coll)
+    {
+        return isNull(coll) || coll.isEmpty();
+    }
+
+    /**
+     * * 判断一个Collection是否非空,包含List,Set,Queue
+     *
+     * @param coll 要判断的Collection
+     * @return true:非空 false:空
+     */
+    public static boolean isNotEmpty(Collection<?> coll)
+    {
+        return !isEmpty(coll);
+    }
+
+    /**
+     * * 判断一个对象数组是否为空
+     *
+     * @param objects 要判断的对象数组
+     ** @return true:为空 false:非空
+     */
+    public static boolean isEmpty(Object[] objects)
+    {
+        return isNull(objects) || (objects.length == 0);
+    }
+
+    /**
+     * * 判断一个对象数组是否非空
+     *
+     * @param objects 要判断的对象数组
+     * @return true:非空 false:空
+     */
+    public static boolean isNotEmpty(Object[] objects)
+    {
+        return !isEmpty(objects);
+    }
+
+    /**
+     * * 判断一个Map是否为空
+     *
+     * @param map 要判断的Map
+     * @return true:为空 false:非空
+     */
+    public static boolean isEmpty(Map<?, ?> map)
+    {
+        return isNull(map) || map.isEmpty();
+    }
+
+    /**
+     * * 判断一个Map是否为空
+     *
+     * @param map 要判断的Map
+     * @return true:非空 false:空
+     */
+    public static boolean isNotEmpty(Map<?, ?> map)
+    {
+        return !isEmpty(map);
+    }
+
+    /**
+     * * 判断一个字符串是否为空串
+     *
+     * @param str String
+     * @return true:为空 false:非空
+     */
+    public static boolean isEmpty(String str)
+    {
+        return isNull(str) || NULLSTR.equals(str.trim());
+    }
+
+    /**
+     * * 判断一个字符串是否为非空串
+     *
+     * @param str String
+     * @return true:非空串 false:空串
+     */
+    public static boolean isNotEmpty(String str)
+    {
+        return !isEmpty(str);
+    }
+
+    /**
+     * * 判断一个对象是否为空
+     *
+     * @param object Object
+     * @return true:为空 false:非空
+     */
+    public static boolean isNull(Object object)
+    {
+        return object == null;
+    }
+
+    /**
+     * * 判断一个对象是否非空
+     *
+     * @param object Object
+     * @return true:非空 false:空
+     */
+    public static boolean isNotNull(Object object)
+    {
+        return !isNull(object);
+    }
+
+    /**
+     * * 判断一个对象是否是数组类型(Java基本型别的数组)
+     *
+     * @param object 对象
+     * @return true:是数组 false:不是数组
+     */
+    public static boolean isArray(Object object)
+    {
+        return isNotNull(object) && object.getClass().isArray();
+    }
+
+    /**
+     * 去空格
+     */
+    public static String trim(String str)
+    {
+        return (str == null ? "" : str.trim());
+    }
+
+    /**
+     * 截取字符串
+     *
+     * @param str 字符串
+     * @param start 开始
+     * @return 结果
+     */
+    public static String substring(final String str, int start)
+    {
+        if (str == null)
+        {
+            return NULLSTR;
+        }
+
+        if (start < 0)
+        {
+            start = str.length() + start;
+        }
+
+        if (start < 0)
+        {
+            start = 0;
+        }
+        if (start > str.length())
+        {
+            return NULLSTR;
+        }
+
+        return str.substring(start);
+    }
+
+    /**
+     * 截取字符串
+     *
+     * @param str 字符串
+     * @param start 开始
+     * @param end 结束
+     * @return 结果
+     */
+    public static String substring(final String str, int start, int end)
+    {
+        if (str == null)
+        {
+            return NULLSTR;
+        }
+
+        if (end < 0)
+        {
+            end = str.length() + end;
+        }
+        if (start < 0)
+        {
+            start = str.length() + start;
+        }
+
+        if (end > str.length())
+        {
+            end = str.length();
+        }
+
+        if (start > end)
+        {
+            return NULLSTR;
+        }
+
+        if (start < 0)
+        {
+            start = 0;
+        }
+        if (end < 0)
+        {
+            end = 0;
+        }
+
+        return str.substring(start, end);
+    }
+
+    /**
+     * 格式化文本, {} 表示占位符<br>
+     * 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
+     * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
+     * 例:<br>
+     * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>
+     * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
+     * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
+     *
+     * @param template 文本模板,被替换的部分用 {} 表示
+     * @param params 参数值
+     * @return 格式化后的文本
+     */
+    public static String format(String template, Object... params)
+    {
+        if (isEmpty(params) || isEmpty(template))
+        {
+            return template;
+        }
+        return StrFormatter.format(template, params);
+    }
+
+    /**
+     * 是否为http(s)://开头
+     *
+     * @param link 链接
+     * @return 结果
+     */
+    public static boolean ishttp(String link)
+    {
+        return StringUtils.startsWithAny(link, Constants.HTTP, Constants.HTTPS);
+    }
+
+    /**
+     * 字符串转set
+     *
+     * @param str 字符串
+     * @param sep 分隔符
+     * @return set集合
+     */
+    public static final Set<String> str2Set(String str, String sep)
+    {
+        return new HashSet<String>(str2List(str, sep, true, false));
+    }
+
+    /**
+     * 字符串转list
+     *
+     * @param str 字符串
+     * @param sep 分隔符
+     * @param filterBlank 过滤纯空白
+     * @param trim 去掉首尾空白
+     * @return list集合
+     */
+    public static final List<String> str2List(String str, String sep, boolean filterBlank, boolean trim)
+    {
+        List<String> list = new ArrayList<String>();
+        if (StringUtils.isEmpty(str))
+        {
+            return list;
+        }
+
+        // 过滤空白字符串
+        if (filterBlank && StringUtils.isBlank(str))
+        {
+            return list;
+        }
+        String[] split = str.split(sep);
+        for (String string : split)
+        {
+            if (filterBlank && StringUtils.isBlank(string))
+            {
+                continue;
+            }
+            if (trim)
+            {
+                string = string.trim();
+            }
+            list.add(string);
+        }
+
+        return list;
+    }
+
+    /**
+     * 判断给定的collection列表中是否包含数组array 判断给定的数组array中是否包含给定的元素value
+     *
+     * @param collection 给定的集合
+     * @param array 给定的数组
+     * @return boolean 结果
+     */
+    public static boolean containsAny(Collection<String> collection, String... array)
+    {
+        if (isEmpty(collection) || isEmpty(array))
+        {
+            return false;
+        }
+        else
+        {
+            for (String str : array)
+            {
+                if (collection.contains(str))
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+    }
+
+    /**
+     * 查找指定字符串是否包含指定字符串列表中的任意一个字符串同时串忽略大小写
+     *
+     * @param cs 指定字符串
+     * @param searchCharSequences 需要检查的字符串数组
+     * @return 是否包含任意一个字符串
+     */
+    public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences)
+    {
+        if (isEmpty(cs) || isEmpty(searchCharSequences))
+        {
+            return false;
+        }
+        for (CharSequence testStr : searchCharSequences)
+        {
+            if (containsIgnoreCase(cs, testStr))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 驼峰转下划线命名
+     */
+    public static String toUnderScoreCase(String str)
+    {
+        if (str == null)
+        {
+            return null;
+        }
+        StringBuilder sb = new StringBuilder();
+        // 前置字符是否大写
+        boolean preCharIsUpperCase = true;
+        // 当前字符是否大写
+        boolean curreCharIsUpperCase = true;
+        // 下一字符是否大写
+        boolean nexteCharIsUpperCase = true;
+        for (int i = 0; i < str.length(); i++)
+        {
+            char c = str.charAt(i);
+            if (i > 0)
+            {
+                preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1));
+            }
+            else
+            {
+                preCharIsUpperCase = false;
+            }
+
+            curreCharIsUpperCase = Character.isUpperCase(c);
+
+            if (i < (str.length() - 1))
+            {
+                nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1));
+            }
+
+            if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase)
+            {
+                sb.append(SEPARATOR);
+            }
+            else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase)
+            {
+                sb.append(SEPARATOR);
+            }
+            sb.append(Character.toLowerCase(c));
+        }
+
+        return sb.toString();
+    }
+
+    /**
+     * 是否包含字符串
+     *
+     * @param str 验证字符串
+     * @param strs 字符串组
+     * @return 包含返回true
+     */
+    public static boolean inStringIgnoreCase(String str, String... strs)
+    {
+        if (str != null && strs != null)
+        {
+            for (String s : strs)
+            {
+                if (str.equalsIgnoreCase(trim(s)))
+                {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 删除最后一个字符串
+     *
+     * @param str 输入字符串
+     * @param spit 以什么类型结尾的
+     * @return 截取后的字符串
+     */
+    public static String lastStringDel(String str, String spit)
+    {
+        if (!StringUtils.isEmpty(str) && str.endsWith(spit))
+        {
+            return str.subSequence(0, str.length() - 1).toString();
+        }
+        return str;
+    }
+
+    /**
+     * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld
+     *
+     * @param name 转换前的下划线大写方式命名的字符串
+     * @return 转换后的驼峰式命名的字符串
+     */
+    public static String convertToCamelCase(String name)
+    {
+        StringBuilder result = new StringBuilder();
+        // 快速检查
+        if (name == null || name.isEmpty())
+        {
+            // 没必要转换
+            return "";
+        }
+        else if (!name.contains("_"))
+        {
+            // 不含下划线,仅将首字母大写
+            return name.substring(0, 1).toUpperCase() + name.substring(1);
+        }
+        // 用下划线将原始字符串分割
+        String[] camels = name.split("_");
+        for (String camel : camels)
+        {
+            // 跳过原始字符串中开头、结尾的下换线或双重下划线
+            if (camel.isEmpty())
+            {
+                continue;
+            }
+            // 首字母大写
+            result.append(camel.substring(0, 1).toUpperCase());
+            result.append(camel.substring(1).toLowerCase());
+        }
+        return result.toString();
+    }
+
+    /**
+     * 驼峰式命名法
+     * 例如:user_name->userName
+     */
+    public static String toCamelCase(String s)
+    {
+        if (s == null)
+        {
+            return null;
+        }
+        if (s.indexOf(SEPARATOR) == -1)
+        {
+            return s;
+        }
+        s = s.toLowerCase();
+        StringBuilder sb = new StringBuilder(s.length());
+        boolean upperCase = false;
+        for (int i = 0; i < s.length(); i++)
+        {
+            char c = s.charAt(i);
+
+            if (c == SEPARATOR)
+            {
+                upperCase = true;
+            }
+            else if (upperCase)
+            {
+                sb.append(Character.toUpperCase(c));
+                upperCase = false;
+            }
+            else
+            {
+                sb.append(c);
+            }
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串
+     *
+     * @param str 指定字符串
+     * @param strs 需要检查的字符串数组
+     * @return 是否匹配
+     */
+    public static boolean matches(String str, List<String> strs)
+    {
+        if (isEmpty(str) || isEmpty(strs))
+        {
+            return false;
+        }
+        for (String pattern : strs)
+        {
+            if (isMatch(pattern, str))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 判断url是否与规则配置:
+     * ? 表示单个字符;
+     * * 表示一层路径内的任意字符串,不可跨层级;
+     * ** 表示任意层路径;
+     *
+     * @param pattern 匹配规则
+     * @param url 需要匹配的url
+     * @return
+     */
+    public static boolean isMatch(String pattern, String url)
+    {
+        AntPathMatcher matcher = new AntPathMatcher();
+        return matcher.match(pattern, url);
+    }
+
+    @SuppressWarnings("unchecked")
+    public static <T> T cast(Object obj)
+    {
+        return (T) obj;
+    }
+
+    /**
+     * 数字左边补齐0,使之达到指定长度。注意,如果数字转换为字符串后,长度大于size,则只保留 最后size个字符。
+     *
+     * @param num 数字对象
+     * @param size 字符串指定长度
+     * @return 返回数字的字符串格式,该字符串为指定长度。
+     */
+    public static final String padl(final Number num, final int size)
+    {
+        return padl(num.toString(), size, '0');
+    }
+
+    /**
+     * 字符串左补齐。如果原始字符串s长度大于size,则只保留最后size个字符。
+     *
+     * @param s 原始字符串
+     * @param size 字符串指定长度
+     * @param c 用于补齐的字符
+     * @return 返回指定长度的字符串,由原字符串左补齐或截取得到。
+     */
+    public static final String padl(final String s, final int size, final char c)
+    {
+        final StringBuilder sb = new StringBuilder(size);
+        if (s != null)
+        {
+            final int len = s.length();
+            if (s.length() <= size)
+            {
+                for (int i = size - len; i > 0; i--)
+                {
+                    sb.append(c);
+                }
+                sb.append(s);
+            }
+            else
+            {
+                return s.substring(len - size, len);
+            }
+        }
+        else
+        {
+            for (int i = size; i > 0; i--)
+            {
+                sb.append(c);
+            }
+        }
+        return sb.toString();
+    }
+}

+ 95 - 0
src/main/java/com/sooka/sponest/middleground/util/hwMeetingCacheUtil.java

@@ -0,0 +1,95 @@
+package com.sooka.sponest.middleground.util;
+
+import com.ruoyi.common.core.utils.SpringUtils;
+import org.apache.shiro.cache.Cache;
+import org.apache.shiro.cache.CacheManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class hwMeetingCacheUtil {
+
+    private static Logger logger = LoggerFactory.getLogger(CacheUtils.class);
+
+    private static CacheManager cacheManager = SpringUtils.getBean(CacheManager.class);
+
+    private static final String CACHE = "hwMeetingCache";
+
+    /**
+     * 获取CACHE缓存
+     *
+     * @param key
+     * @return
+     */
+    public static Object get(String key)
+    {
+        return get(CACHE, key);
+    }
+
+    /**
+     * 获取缓存
+     *
+     * @param cacheName
+     * @param key
+     * @return
+     */
+    private static Object get(String cacheName, String key)
+    {
+        return getCache(cacheName).get(key);
+    }
+
+    /**
+     * 写入CACHE缓存
+     *
+     * @param key
+     * @return
+     */
+    public static void put(String key, Object value)
+    {
+        put(CACHE, key, value);
+    }
+
+
+    /**
+     * 写入缓存
+     *
+     * @param cacheName
+     * @param key
+     * @param value
+     */
+    private static void put(String cacheName, String key, Object value)
+    {
+        getCache(cacheName).put(key, value);
+    }
+
+    /**
+     * 判断是否有CACHE缓存
+     *
+     * @param key
+     * @return
+     */
+    public static boolean has(String key)
+    {
+        Object o = getCache(CACHE).get(key);
+        if(o == null){
+            return false;
+        }
+        return true;
+    }
+
+
+    /**
+     * 获得一个Cache,没有则显示日志。
+     *
+     * @param cacheName
+     * @return
+     */
+    private static Cache<String, Object> getCache(String cacheName)
+    {
+        Cache<String, Object> cache = cacheManager.getCache(cacheName);
+        if (cache == null)
+        {
+            throw new RuntimeException("当前系统中没有定义“" + cacheName + "”这个缓存。");
+        }
+        return cache;
+    }
+}

+ 159 - 0
src/main/java/com/sooka/sponest/middleground/util/spring/SpringUtils.java

@@ -0,0 +1,159 @@
+package com.sooka.sponest.middleground.util.spring;
+
+import com.sooka.sponest.middleground.util.StringUtils;
+import org.springframework.aop.framework.AopContext;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+/**
+ * spring工具类 方便在非spring管理环境中获取bean
+ *
+ * @author ruoyi
+ */
+@Component
+public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware
+{
+    /** Spring应用上下文环境 */
+    private static ConfigurableListableBeanFactory beanFactory;
+
+    private static ApplicationContext applicationContext;
+
+    @Override
+    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException
+    {
+        SpringUtils.beanFactory = beanFactory;
+    }
+
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
+    {
+        SpringUtils.applicationContext = applicationContext;
+    }
+
+    /**
+     * 获取对象
+     *
+     * @param name
+     * @return Object 一个以所给名字注册的bean的实例
+     * @throws BeansException
+     *
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> T getBean(String name) throws BeansException
+    {
+        return (T) beanFactory.getBean(name);
+    }
+
+    /**
+     * 获取类型为requiredType的对象
+     *
+     * @param clz
+     * @return
+     * @throws BeansException
+     *
+     */
+    public static <T> T getBean(Class<T> clz) throws BeansException
+    {
+        T result = (T) beanFactory.getBean(clz);
+        return result;
+    }
+
+    /**
+     * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
+     *
+     * @param name
+     * @return boolean
+     */
+    public static boolean containsBean(String name)
+    {
+        return beanFactory.containsBean(name);
+    }
+
+    /**
+     * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
+     *
+     * @param name
+     * @return boolean
+     * @throws NoSuchBeanDefinitionException
+     *
+     */
+    public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException
+    {
+        return beanFactory.isSingleton(name);
+    }
+
+    /**
+     * @param name
+     * @return Class 注册对象的类型
+     * @throws NoSuchBeanDefinitionException
+     *
+     */
+    public static Class<?> getType(String name) throws NoSuchBeanDefinitionException
+    {
+        return beanFactory.getType(name);
+    }
+
+    /**
+     * 如果给定的bean名字在bean定义中有别名,则返回这些别名
+     *
+     * @param name
+     * @return
+     * @throws NoSuchBeanDefinitionException
+     *
+     */
+    public static String[] getAliases(String name) throws NoSuchBeanDefinitionException
+    {
+        return beanFactory.getAliases(name);
+    }
+
+    /**
+     * 获取aop代理对象
+     *
+     * @param invoker
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> T getAopProxy(T invoker)
+    {
+        return (T) AopContext.currentProxy();
+    }
+
+    /**
+     * 获取当前的环境配置,无配置返回null
+     *
+     * @return 当前的环境配置
+     */
+    public static String[] getActiveProfiles()
+    {
+        return applicationContext.getEnvironment().getActiveProfiles();
+    }
+
+    /**
+     * 获取当前的环境配置,当有多个环境配置时,只获取第一个
+     *
+     * @return 当前的环境配置
+     */
+    public static String getActiveProfile()
+    {
+        final String[] activeProfiles = getActiveProfiles();
+        return StringUtils.isNotEmpty(activeProfiles) ? activeProfiles[0] : null;
+    }
+
+    /**
+     * 获取配置文件中的值
+     *
+     * @param key 配置文件的key
+     * @return 当前的配置文件的值
+     *
+     */
+    public static String getRequiredProperty(String key)
+    {
+        return applicationContext.getEnvironment().getRequiredProperty(key);
+    }
+
+}

+ 9 - 0
src/main/resources/banner.txt

@@ -0,0 +1,9 @@
+Spring Boot Version: ${spring-boot.version}
+Spring Application Name: ${spring.application.name}
+
+  __________   ____ |  | _______          ____________   ____   ____   ____   _______/  |_
+
+ /  ___/  _ \ /  _ \|  |/ /\__  \        /  ___/\____ \ /  _ \ /    \_/ __ \ /  ___/\   __\
+ \___ (  <_> |  <_> )    <  / __ \_      \___ \ |  |_> >  <_> )   |  \  ___/ \___ \  |  |
+/____  >____/ \____/|__|_ \(____  /     /____  >|   __/ \____/|___|  /\___  >____  > |__|
+     \/                  \/     \/           \/ |__|               \/     \/     \/

+ 27 - 0
src/main/resources/bootstrap.yml

@@ -0,0 +1,27 @@
+# Tomcat
+server:
+  port: 43000 #市场演示服务器端口,外网端口一致
+#  port: 41000
+# Spring
+spring:
+  application:
+    # 应用名称
+    name: sooka-sponest-middleground
+  profiles:
+    # 环境配置
+    active: dev
+  cloud:
+    nacos:
+      discovery:
+        # 服务注册地址
+        server-addr: www.sooka.onest.com:8848
+#        server-addr: 127.0.0.1:8848
+      config:
+        # 配置中心地址
+        server-addr: www.sooka.onest.com:8848
+#        server-addr: 127.0.0.1:8848
+        # 配置文件格式
+        file-extension: yml
+        # 共享配置
+        shared-configs:
+          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}