From f99021d9f942882c194d46d7b1d3cf726e93423e Mon Sep 17 00:00:00 2001 From: lau572 <1010031226@qq.com> Date: Fri, 22 Mar 2024 21:36:56 +0800 Subject: [PATCH 01/27] =?UTF-8?q?=E6=A1=A9=E5=8F=B7=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/DcStakeMarkController.java | 7 ++ .../com/zc/business/domain/DcStakeMark.java | 2 + .../zc/business/mapper/DcStakeMarkMapper.java | 9 +- .../business/service/IDcStakeMarkService.java | 11 +++ .../service/impl/DcStakeMarkServiceImpl.java | 84 ++++++++++++++++++- .../mapper/business/DcStakeMarkMapper.xml | 41 +++++++++ 6 files changed, 150 insertions(+), 4 deletions(-) create mode 100644 zc-business/src/main/resources/mapper/business/DcStakeMarkMapper.xml diff --git a/zc-business/src/main/java/com/zc/business/controller/DcStakeMarkController.java b/zc-business/src/main/java/com/zc/business/controller/DcStakeMarkController.java index 12b3a390..b926ae3f 100644 --- a/zc-business/src/main/java/com/zc/business/controller/DcStakeMarkController.java +++ b/zc-business/src/main/java/com/zc/business/controller/DcStakeMarkController.java @@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; +import java.io.IOException; import java.util.List; /** @@ -112,4 +113,10 @@ public class DcStakeMarkController extends BaseController { return toAjax(dcStakeMarkService.removeStakeMark(ids)); } + @ApiOperation("根据json文件路径导入桩号") + @PostMapping("importStakeMarkByJsonFilePath") + public AjaxResult importJsonStakeMark(String filePath) throws IOException { + return dcStakeMarkService.importJsonStakeMark(filePath); + } + } diff --git a/zc-business/src/main/java/com/zc/business/domain/DcStakeMark.java b/zc-business/src/main/java/com/zc/business/domain/DcStakeMark.java index 123c57cd..8370ee64 100644 --- a/zc-business/src/main/java/com/zc/business/domain/DcStakeMark.java +++ b/zc-business/src/main/java/com/zc/business/domain/DcStakeMark.java @@ -29,5 +29,7 @@ public class DcStakeMark { private Date updateTime; @ApiModelProperty("所属辖区") private Long sectionId; + @ApiModelProperty("桩号里程") + private Long mileage; } diff --git a/zc-business/src/main/java/com/zc/business/mapper/DcStakeMarkMapper.java b/zc-business/src/main/java/com/zc/business/mapper/DcStakeMarkMapper.java index 448050c3..bc949499 100644 --- a/zc-business/src/main/java/com/zc/business/mapper/DcStakeMarkMapper.java +++ b/zc-business/src/main/java/com/zc/business/mapper/DcStakeMarkMapper.java @@ -1,14 +1,21 @@ package com.zc.business.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.zc.business.domain.DcDevice; import com.zc.business.domain.DcStakeMark; import org.apache.ibatis.annotations.Mapper; +import java.util.List; + /** * 桩号Mapper接口 * - * @author zhaoxianglong + * @author */ @Mapper public interface DcStakeMarkMapper extends BaseMapper { + + + boolean batchInsert(List dcStakeMarkList); + } diff --git a/zc-business/src/main/java/com/zc/business/service/IDcStakeMarkService.java b/zc-business/src/main/java/com/zc/business/service/IDcStakeMarkService.java index 8390bd34..f508f7dc 100644 --- a/zc-business/src/main/java/com/zc/business/service/IDcStakeMarkService.java +++ b/zc-business/src/main/java/com/zc/business/service/IDcStakeMarkService.java @@ -2,8 +2,10 @@ package com.zc.business.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.common.core.domain.AjaxResult; import com.zc.business.domain.DcStakeMark; +import java.io.IOException; import java.util.List; /** @@ -60,4 +62,13 @@ public interface IDcStakeMarkService extends IService { * @return 设备信息 */ DcStakeMark getStakeMark(String id); + + + /** + * 导入桩号 + * + * @param filePath json文件路径 + * @return + */ + AjaxResult importJsonStakeMark(String filePath) throws IOException; } diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcStakeMarkServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcStakeMarkServiceImpl.java index 3dacb227..7c8c3974 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcStakeMarkServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcStakeMarkServiceImpl.java @@ -1,19 +1,24 @@ package com.zc.business.service.impl; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.constant.HttpStatus; +import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.PageUtils; +import com.ruoyi.common.utils.StakeMarkUtils; import com.zc.business.domain.DcStakeMark; import com.zc.business.mapper.DcStakeMarkMapper; import com.zc.business.service.IDcStakeMarkService; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; -import java.util.Date; -import java.util.List; -import java.util.Objects; +import javax.annotation.Resource; +import java.io.*; +import java.util.*; +import java.util.regex.Pattern; /** * 桩号Service业务层处理 @@ -23,6 +28,8 @@ import java.util.Objects; @Service public class DcStakeMarkServiceImpl extends ServiceImpl implements IDcStakeMarkService { + @Resource + private DcStakeMarkMapper dcStakeMarkMapper; public LambdaQueryWrapper stakeMarkQueryWrapper(DcStakeMark dcStakeMark) { @@ -125,5 +132,76 @@ public class DcStakeMarkServiceImpl extends ServiceImpl> map = JSON.parseObject(jsonStr, new TypeReference>>() {}); + List stakeMarkList = new ArrayList<>(); + + //桩号格式校验 + List errorKey = new ArrayList<>(); + map.keySet().forEach(key ->{ + if (!checkStakeMark(key)){ + errorKey.add(key); + } + DcStakeMark dcStakeMark = new DcStakeMark(); + dcStakeMark.setStakeMark(key); + + dcStakeMark.setLongitude(map.get(key).containsKey("lng") ? map.get(key).get("lng").toString() : ""); + dcStakeMark.setLatitude(map.get(key).containsKey("lat") ? map.get(key).get("lat").toString() : ""); + dcStakeMark.setDirection("1"); + dcStakeMark.setSectionId(1L); + dcStakeMark.setMileage(Long.valueOf(StakeMarkUtils.formatMetre(key))); + stakeMarkList.add(dcStakeMark); + }); + + if (errorKey.size() > 0){ + return AjaxResult.error("桩号格式错误",errorKey); + } + Date databaseStart = new Date(); + Long time = databaseStart.getTime() - methodStart.getTime(); + System.out.println("处理数据用时---------------------------------->" + time); + dcStakeMarkMapper.batchInsert(stakeMarkList); + + Long endTime = new Date().getTime() - databaseStart.getTime(); + System.out.println("导入数据库用时--------------------------------->" + endTime); + return AjaxResult.success(); + } + + /** + * @Description 桩号格式校验 + * + * 正确格式: K060+010 + * @author liuwenge + * @date 2024/3/22 20:05 + * @param stakeMark + * @return boolean + */ + private boolean checkStakeMark(String stakeMark){ + Pattern pattern = Pattern.compile("^K\\d{3}\\+\\d{3}$"); + return pattern.matcher(stakeMark).matches(); + } + } diff --git a/zc-business/src/main/resources/mapper/business/DcStakeMarkMapper.xml b/zc-business/src/main/resources/mapper/business/DcStakeMarkMapper.xml new file mode 100644 index 00000000..62cb4d6d --- /dev/null +++ b/zc-business/src/main/resources/mapper/business/DcStakeMarkMapper.xml @@ -0,0 +1,41 @@ + + + + + + + + insert into dc_stake_mark + + stake_mark, + longitude, + latitude, + direction, + section_id, + mileage, + create_time, + + + #{dcStakeMark.stakeMark}, + #{dcStakeMark.longitude}, + #{dcStakeMark.latitude}, + #{dcStakeMark.direction}, + #{dcStakeMark.sectionId}, + #{dcStakeMark.mileage}, + now(), + + ON DUPLICATE KEY UPDATE + + stake_mark = #{dcStakeMark.stakeMark}, + longitude = #{dcStakeMark.longitude}, + latitude = #{dcStakeMark.latitude}, + direction = #{dcStakeMark.direction}, + section_id = #{dcStakeMark.sectionId}, + mileage = #{dcStakeMark.mileage}, + update_time = now(), + + + + From 7107a0748f5f4475cd80084f5f748d6767a64838 Mon Sep 17 00:00:00 2001 From: lau572 <1010031226@qq.com> Date: Mon, 25 Mar 2024 09:11:04 +0800 Subject: [PATCH 02/27] =?UTF-8?q?=E6=A1=A9=E5=8F=B7=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/common/utils/StakeMarkUtils.java | 28 +++++++++++++++---- .../service/impl/DcStakeMarkServiceImpl.java | 16 +---------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StakeMarkUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StakeMarkUtils.java index 6c61fa9a..686b4c29 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StakeMarkUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StakeMarkUtils.java @@ -2,15 +2,33 @@ package com.ruoyi.common.utils; import java.math.BigDecimal; import java.math.RoundingMode; +import java.util.regex.Pattern; /** - * @Description 桩号计算工具 + * @Description 桩号工具 * * @author liuwenge * @date 2024/1/17 14:43 */ public class StakeMarkUtils { + /** + * @Description 桩号格式校验 + * + * 正确格式: K060+010 + * @author liuwenge + * @date 2024/3/22 20:05 + * @param stakeMark + * @return boolean + */ + public static boolean checkStakeMark(String stakeMark){ + if (StringUtils.isEmpty(stakeMark)){ + return false; + } + Pattern pattern = Pattern.compile("^K\\d{3}\\+\\d{3}$"); + return pattern.matcher(stakeMark).matches(); + } + /** * @Description 桩号转公里数 * @@ -20,7 +38,7 @@ public class StakeMarkUtils { * @return 公里数:123.123 */ public static String formatKilometre(String stakeMark){ - if (StringUtils.isEmpty(stakeMark)){ + if (!checkStakeMark(stakeMark)){ return ""; } return stakeMark.toLowerCase().replace("k","").replace("+","."); @@ -35,7 +53,7 @@ public class StakeMarkUtils { * @return 公里数:123123 */ public static String formatMetre(String stakeMark){ - if (StringUtils.isEmpty(stakeMark)){ + if (!checkStakeMark(stakeMark)){ return ""; } return stakeMark.toLowerCase().replace("k","").replace("+",""); @@ -51,7 +69,7 @@ public class StakeMarkUtils { * @return java.math.BigDecimal 距离 */ public static BigDecimal getKilometre(String startStakeMark, String endStakeMark){ - if (StringUtils.isEmpty(startStakeMark) || StringUtils.isEmpty(endStakeMark)){ + if (!checkStakeMark(startStakeMark) || !checkStakeMark(endStakeMark)){ return BigDecimal.ZERO; } String start = startStakeMark.toLowerCase().replace("k","").replace("+","."); @@ -75,7 +93,7 @@ public class StakeMarkUtils { * @return java.math.BigDecimal 距离 */ public static BigDecimal getMetre(String startStakeMark, String endStakeMark){ - if (StringUtils.isEmpty(startStakeMark) || StringUtils.isEmpty(endStakeMark)){ + if (!checkStakeMark(startStakeMark) || !checkStakeMark(endStakeMark)){ return BigDecimal.ZERO; } String start = startStakeMark.toLowerCase().replace("k","").replace("+","."); diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcStakeMarkServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcStakeMarkServiceImpl.java index 7c8c3974..e2d3022b 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcStakeMarkServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcStakeMarkServiceImpl.java @@ -162,7 +162,7 @@ public class DcStakeMarkServiceImpl extends ServiceImpl errorKey = new ArrayList<>(); map.keySet().forEach(key ->{ - if (!checkStakeMark(key)){ + if (!StakeMarkUtils.checkStakeMark(key)){ errorKey.add(key); } DcStakeMark dcStakeMark = new DcStakeMark(); @@ -189,19 +189,5 @@ public class DcStakeMarkServiceImpl extends ServiceImpl Date: Mon, 25 Mar 2024 15:44:38 +0800 Subject: [PATCH 03/27] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=9F=B1=E7=8A=B6=E5=9B=BE=E6=8C=89=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E5=92=8C=E7=B1=BB=E5=9E=8B=E8=AF=B7=E6=B1=82=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E5=80=BC=E5=9D=87=E4=B8=BA0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/zc/business/controller/StatusController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zc-business/src/main/java/com/zc/business/controller/StatusController.java b/zc-business/src/main/java/com/zc/business/controller/StatusController.java index 52b65fbd..5a4adb7a 100644 --- a/zc-business/src/main/java/com/zc/business/controller/StatusController.java +++ b/zc-business/src/main/java/com/zc/business/controller/StatusController.java @@ -86,7 +86,7 @@ public class StatusController extends BaseController { Map mapSort=new TreeMap<>(); for (Map.Entry> entry : mapTime.entrySet()) { List groupItems = entry.getValue(); - long count = groupItems.stream().filter(iteam -> iteam.getDeviceStatus() == "1").count(); + long count = groupItems.stream().filter(iteam -> Objects.equals(iteam.getDeviceStatus(), "1")).count(); String onlineRate=String.format("%.2f%%", (double) count / groupItems.size() * 100); mapSort.put(entry.getKey(),onlineRate); } From b2885326b1941d915dfc145b71ee21ef2efcc084 Mon Sep 17 00:00:00 2001 From: "Mr.Wang" Date: Mon, 25 Mar 2024 16:53:32 +0800 Subject: [PATCH 04/27] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=83=85=E6=8A=A5?= =?UTF-8?q?=E6=9D=BF=E5=9B=9E=E6=98=BE=E5=8E=9F=E5=A7=8B=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/DcEmergencyPlansServiceImpl.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcEmergencyPlansServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcEmergencyPlansServiceImpl.java index c570691e..7f0a614a 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcEmergencyPlansServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcEmergencyPlansServiceImpl.java @@ -30,6 +30,7 @@ import javax.annotation.Resource; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.*; +import java.util.concurrent.CountDownLatch; import java.util.stream.Collectors; @Service @@ -225,12 +226,11 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { */ public Map> getBoardTemplate(List dcDevices) { Map> map = new HashMap<>(); + CountDownLatch latch = new CountDownLatch(dcDevices.size()); dcDevices.forEach(dcDevice -> { threadPoolTaskExecutor.execute(() -> { try { - if (StringUtils.isEmpty(dcDevice.getIotDeviceId())) { - return; - } + if (StringUtils.isNotEmpty(dcDevice.getIotDeviceId())){ AjaxResult ajaxResult = dcDeviceController.getDeviceRealtimeProperty(dcDevice.getIotDeviceId(), "3A", new HashMap<>()); if (ajaxResult.get("code").equals(200)) { JSONObject properties = JSON.parseObject(JSON.parseObject(ajaxResult.get("data").toString()).get("3A").toString()); @@ -263,12 +263,19 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { }); map.put(dcDevice.getDeviceName(), list); } + } } catch (Exception e) { e.printStackTrace(); + } finally { + latch.countDown(); // 确保在异常情况下也能减少CountDownLatch计数 } }); }); - + try { + latch.await(); // 等待所有线程执行完毕 + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } return map; } @@ -301,7 +308,7 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { } else if (searchRule.equals(2)) { // 事件上游最近 - if (direction.equals("1")) { + if (direction.equals("菏泽方向")) { // 上行 取最大的几个 start.add("55"); start.add("379"); @@ -341,7 +348,7 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { } else if (searchRule.equals(3)) { // 事件下游最近 - if (direction.equals("1")) { + if (direction.equals("菏泽方向")) { // 上行 取最大的几个 start.add(markArray[0]); start.add(markArray[1]); From d0ff7a2ca149311f7707fea85e4d14703b6b1b36 Mon Sep 17 00:00:00 2001 From: lau572 <1010031226@qq.com> Date: Tue, 26 Mar 2024 09:30:57 +0800 Subject: [PATCH 05/27] =?UTF-8?q?=E5=AF=BC=E5=85=A5=E6=A1=A9=E5=8F=B7?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/common/utils/StakeMarkUtils.java | 20 +++++++---- .../controller/DcStakeMarkController.java | 4 +-- .../business/service/IDcStakeMarkService.java | 2 +- .../service/impl/DcStakeMarkServiceImpl.java | 34 ++++++++++++++++--- 4 files changed, 47 insertions(+), 13 deletions(-) diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StakeMarkUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StakeMarkUtils.java index 686b4c29..4a42e0a3 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StakeMarkUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StakeMarkUtils.java @@ -41,9 +41,10 @@ public class StakeMarkUtils { if (!checkStakeMark(stakeMark)){ return ""; } - return stakeMark.toLowerCase().replace("k","").replace("+","."); + return stakeMark.replace("K","").replace("+","."); } + /** * @Description 桩号转米 * @@ -52,11 +53,18 @@ public class StakeMarkUtils { * @param stakeMark 桩号:"K123+123" * @return 公里数:123123 */ + public static Long formatMetreLong(String stakeMark){ + if (!checkStakeMark(stakeMark)){ + return null; + } + return Long.valueOf(stakeMark.replace("K","").replace("+","")); + } + public static String formatMetre(String stakeMark){ if (!checkStakeMark(stakeMark)){ return ""; } - return stakeMark.toLowerCase().replace("k","").replace("+",""); + return stakeMark.replace("K","").replace("+",""); } /** @@ -72,8 +80,8 @@ public class StakeMarkUtils { if (!checkStakeMark(startStakeMark) || !checkStakeMark(endStakeMark)){ return BigDecimal.ZERO; } - String start = startStakeMark.toLowerCase().replace("k","").replace("+","."); - String end = endStakeMark.toLowerCase().replace("k","").replace("+","."); + String start = startStakeMark.replace("K","").replace("+","."); + String end = endStakeMark.replace("K","").replace("+","."); BigDecimal startKilometre = new BigDecimal(start); BigDecimal endKilometre = new BigDecimal(end); if (startKilometre.compareTo(endKilometre) > 0){ @@ -96,8 +104,8 @@ public class StakeMarkUtils { if (!checkStakeMark(startStakeMark) || !checkStakeMark(endStakeMark)){ return BigDecimal.ZERO; } - String start = startStakeMark.toLowerCase().replace("k","").replace("+","."); - String end = endStakeMark.toLowerCase().replace("k","").replace("+","."); + String start = startStakeMark.replace("K","").replace("+","."); + String end = endStakeMark.replace("K","").replace("+","."); BigDecimal startKilometre = new BigDecimal(start); BigDecimal endKilometre = new BigDecimal(end); if (startKilometre.compareTo(endKilometre) > 0){ diff --git a/zc-business/src/main/java/com/zc/business/controller/DcStakeMarkController.java b/zc-business/src/main/java/com/zc/business/controller/DcStakeMarkController.java index b926ae3f..ee7a0f91 100644 --- a/zc-business/src/main/java/com/zc/business/controller/DcStakeMarkController.java +++ b/zc-business/src/main/java/com/zc/business/controller/DcStakeMarkController.java @@ -115,8 +115,8 @@ public class DcStakeMarkController extends BaseController { @ApiOperation("根据json文件路径导入桩号") @PostMapping("importStakeMarkByJsonFilePath") - public AjaxResult importJsonStakeMark(String filePath) throws IOException { - return dcStakeMarkService.importJsonStakeMark(filePath); + public AjaxResult importJsonStakeMark(String filePath,String direction) throws IOException { + return dcStakeMarkService.importJsonStakeMark(filePath, direction); } } diff --git a/zc-business/src/main/java/com/zc/business/service/IDcStakeMarkService.java b/zc-business/src/main/java/com/zc/business/service/IDcStakeMarkService.java index f508f7dc..0131c4d2 100644 --- a/zc-business/src/main/java/com/zc/business/service/IDcStakeMarkService.java +++ b/zc-business/src/main/java/com/zc/business/service/IDcStakeMarkService.java @@ -70,5 +70,5 @@ public interface IDcStakeMarkService extends IService { * @param filePath json文件路径 * @return */ - AjaxResult importJsonStakeMark(String filePath) throws IOException; + AjaxResult importJsonStakeMark(String filePath,String direction) throws IOException; } diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcStakeMarkServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcStakeMarkServiceImpl.java index e2d3022b..ae0d23b4 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcStakeMarkServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcStakeMarkServiceImpl.java @@ -9,7 +9,9 @@ import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.PageUtils; import com.ruoyi.common.utils.StakeMarkUtils; +import com.zc.business.domain.DcRoadSection; import com.zc.business.domain.DcStakeMark; +import com.zc.business.mapper.DcRoadSectionMapper; import com.zc.business.mapper.DcStakeMarkMapper; import com.zc.business.service.IDcStakeMarkService; import org.springframework.stereotype.Service; @@ -30,6 +32,8 @@ public class DcStakeMarkServiceImpl extends ServiceImpl stakeMarkQueryWrapper(DcStakeMark dcStakeMark) { @@ -142,7 +146,7 @@ public class DcStakeMarkServiceImpl extends ServiceImpl> map = JSON.parseObject(jsonStr, new TypeReference>>() {}); List stakeMarkList = new ArrayList<>(); + List dcRoadSectionList = dcRoadSectionMapper.selectDcRoadSectionList(null); + //桩号格式校验 List errorKey = new ArrayList<>(); map.keySet().forEach(key ->{ @@ -170,9 +176,11 @@ public class DcStakeMarkServiceImpl extends ServiceImpl roadSectionList,String stakeMark){ + + if (roadSectionList == null || roadSectionList.size() < 1){ + return null; + } + Long metre = StakeMarkUtils.formatMetreLong(stakeMark); + for (DcRoadSection dcRoadSection : roadSectionList) { + Long startStakeMark = StakeMarkUtils.formatMetreLong(dcRoadSection.getStartStakeMark()); + Long endStakeMark = StakeMarkUtils.formatMetreLong(dcRoadSection.getEndStakeMark()); + if (metre >= startStakeMark && metre < endStakeMark){ + return dcRoadSection.getId(); + } + } + + return null; + + } + } From c955b386ff5738626b50362ec79176beb23890c5 Mon Sep 17 00:00:00 2001 From: wangsixiang <2970484253@qq.com> Date: Tue, 26 Mar 2024 11:01:36 +0800 Subject: [PATCH 06/27] =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=84=9F=E7=9F=A5?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E8=BF=87=E6=BB=A4=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/DcWarningServiceImpl.java | 141 +++++++++++++++++- .../DcPerceivedEventsWarningMapper.xml | 2 +- 2 files changed, 137 insertions(+), 6 deletions(-) diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java index 65648daf..77224c7c 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java @@ -89,11 +89,141 @@ public class DcWarningServiceImpl implements IDcWarningService @Override public int insertDcWarning(DcWarning dcWarning) { - dcWarning.setCreateTime(DateUtils.getNowDate()); //设置事件Id UUID无下划线格式32 String uuid = IdUtils.fastSimpleUUID(); dcWarning.setId(uuid); - return dcWarningMapper.insertDcWarning(dcWarning); + if (StringUtils.isBlank(dcWarning.getStakeMark())||dcWarning.getWarningSource()==null||dcWarning.getWarningType()==null|| + StringUtils.isBlank(dcWarning.getWarningSubclass())||StringUtils.isBlank(dcWarning.getDirection())){ + return 0; + } + String redisKye=dcWarning.getWarningSource().toString()+dcWarning.getWarningType().toString()+dcWarning.getWarningSubclass();//配置数据的key 事件源+事件类型+策略 + Map redisWarningStrategy = redisCache.getCacheMap(WARNINGSTRATEGY);//获取缓存全部的配置数据 + if (redisWarningStrategy==null||redisWarningStrategy.size()==0){//如果缓存为空,查询数据重新加入缓存 + Map redisMap = new HashMap<>(); + List dcWaringStrategies = dcWarningMapper.selectDcWaringStrategyList();//数据库全部配置数据 + for (DcWaringStrategy waringStrategy : dcWaringStrategies) { + String key = waringStrategy.getWarningSource().toString() + waringStrategy.getWarningType().toString() + + waringStrategy.getWarningSubclass()+waringStrategy.getStrategy().toString();//redis配置数据key + JSONObject jsonObject = new JSONObject(); + jsonObject.put("strategy", waringStrategy.getStrategy());//策略模式 + jsonObject.put("strategyTime", waringStrategy.getStrategyTime());//模式时长,单位为分钟 + jsonObject.put("priority", waringStrategy.getPriority());//优先级 + redisMap.put(key, jsonObject); + } + redisCache.setCacheMap(WARNINGSTRATEGY, redisMap);//数据库配置数据加入缓存中 + redisWarningStrategy = redisCache.getCacheMap(WARNINGSTRATEGY);//缓存数据为空重新加入到缓存在取出缓存的配置 + } + String key=dcWarning.getStakeMark()+dcWarning.getDirection()+dcWarning.getWarningSource(). + toString()+dcWarning.getWarningType().toString()+dcWarning.getWarningSubclass();//key,redis存储事件的key(桩号+方向+事件源+类型) + String dataId = redisCache.getCacheObject(WARNINGDATA + key);//查看redis是否存在数据(id的值) + HashMap redisValueOne = redisWarningStrategy.get(redisKye+"1");//查看传入的事件类型是否配置策略1(优先级策略) + if(redisValueOne!=null){//执行策略1(暂时未定义,定义后开发) + return dcWarningMapper.insertDcWarning(dcWarning);//未定义直接走新增; + } + HashMap redisValueTwo = redisWarningStrategy.get(redisKye+"2");//查看传入的事件类型是否配置策略2(延迟策略) + if (redisValueOne==null&&redisValueTwo!=null){ //执行策略2,执行到这里说明1不存在或者1未满足过滤条件 + String strategyTime = redisValueTwo.get("strategyTime").toString();//策略时长 + if (dataId==null){//如果不存在直接加入数据库,加入缓存,配置对应的过期时间 + int insertDcWarning = dcWarningMapper.insertDcWarning(dcWarning);//加入数据库 + if (insertDcWarning==0){ + return 0; + } + String id = dcWarning.getId();//取出加入后的id作为value + redisCache.setCacheObject(WARNINGDATA+key,id,Integer.parseInt(strategyTime),TimeUnit.MINUTES);//加入缓存并设置延迟时间(单位分钟) + return 1;//结束 + } + //redis存在数据,取出redis的id找对对应事件的配置,合成事件配置,重新定义延迟时间 + HashMap map = dcWarningMapper.selectDcWarningById(dataId); + if (map==null){//redis中有id但是数据库中没有这条数据,那就删除这条redis数据,新数据加入到数据库,并加入到redis + redisCache.deleteObject(WARNINGDATA+key); + dcWarningMapper.insertDcWarning(dcWarning); + String id = dcWarning.getId(); + redisCache.setCacheObject(WARNINGDATA+key,id,Integer.parseInt(strategyTime),TimeUnit.MINUTES); + return 1; + } + String otherConfig=""; + if (map.get("otherConfig")!=null){ + otherConfig = map.get("otherConfig").toString(); //取出原id的配置信息 + } + String otherConfigString = dcWarning.getOtherConfig();//新增的配置信息 + JSONObject jsonObjectOne = new JSONObject(otherConfig); + JSONObject jsonObjectTwo = new JSONObject(otherConfigString); + DcWarningServiceImpl dcWarningService = new DcWarningServiceImpl();//合成新的json + JSONObject jsonObject = dcWarningService.mergeJsonObjects(jsonObjectOne, jsonObjectTwo); + Integer integer = dcWarningMapper.updateOtherConfig(dataId, jsonObject.toString());//修改数据库配置 + redisCache.setCacheObject(WARNINGDATA+key,dataId,Integer.parseInt(strategyTime),TimeUnit.MINUTES);//重新设置延迟时间 + if (integer==0){ + return 0; + } + return 1; + } + HashMap redisValueThree = redisWarningStrategy.get(redisKye+"3");//查看传入的事件类型是否配置策略3(时间窗口策略) + if (redisValueOne==null&&redisValueTwo==null&&redisValueThree!=null){ //执行策略3,执行到这里说明1不存在或者2不存在或者1未满足过滤条件 + String strategyTime = redisValueThree.get("strategyTime").toString();//策略时长 + if (dataId==null){//如果不存在直接加入数据库,加入缓存,配置对应的过期时间 + int insertDcWarning = dcWarningMapper.insertDcWarning(dcWarning);//加入数据库 + if (insertDcWarning==0){ + return 0; + } + String id = dcWarning.getId();//取出加入后的id作为value + redisCache.setCacheObject(WARNINGDATA+key,id,Integer.parseInt(strategyTime),TimeUnit.MINUTES);//加入缓存并设置延迟时间(单位分钟) + return 1;//结束 + } + //redis存在数据,取出redis的id找对对应事件的配置,合成事件配置 + HashMap map = dcWarningMapper.selectDcWarningById(dataId); + if (map==null){//redis中有id但是数据库中没有这条数据,那就删除这条redis数据,新数据加入到数据库,并加入到redis + redisCache.deleteObject(WARNINGDATA+key); + dcWarningMapper.insertDcWarning(dcWarning); + String id = dcWarning.getId(); + redisCache.setCacheObject(WARNINGDATA+key,id,Integer.parseInt(strategyTime),TimeUnit.MINUTES); + return 1; + } + String otherConfig=""; + otherConfig = map.get("otherConfig").toString();//取出原id的配置信息 + String otherConfigString = dcWarning.getOtherConfig();//新增的配置信息 + JSONObject jsonObjectOne = new JSONObject(otherConfig); + JSONObject jsonObjectTwo = new JSONObject(otherConfigString); + JSONObject jsonObject = new DcWarningServiceImpl().mergeJsonObjects(jsonObjectOne, jsonObjectTwo);//合成新的json + Integer integer = dcWarningMapper.updateOtherConfig(dataId, jsonObject.toString());//修改数据库配置 + if (integer==0){ + return 0; + } + return 1; + } + HashMap redisValueFour = redisWarningStrategy.get(redisKye+"4");//查看传入的事件类型是否配置策略3(自动结束策略) + if (redisValueOne==null&&redisValueTwo==null&&redisValueThree==null&&redisValueFour!=null){ //执行策略4,执行到这里说明1不存在或者2、3不存在或者1未满足过滤条件 + if (dataId==null){//如果不存在直接加入数据库,加入缓存 + int insertDcWarning = dcWarningMapper.insertDcWarning(dcWarning);//加入数据库 + if (insertDcWarning==0){ + return 0; + } + String id = dcWarning.getId();//取出加入后的id作为value + redisCache.setCacheObject(WARNINGDATA+key,id);//加入缓存????存在问题会数据累计 + return 1;//结束 + } + //redis存在数据,取出redis的id找对对应事件的配置,合成事件配置 + HashMap map = dcWarningMapper.selectDcWarningById(dataId); + if (map==null){//redis中有id但是数据库中没有这条数据,那就删除这条redis数据,新数据加入到数据库,并加入到redis + redisCache.deleteObject(WARNINGDATA+key); + dcWarningMapper.insertDcWarning(dcWarning); + String id = dcWarning.getId(); + redisCache.setCacheObject(WARNINGDATA+key,id); + return 1; + } + String otherConfig=""; + otherConfig = map.get("otherConfig").toString();//取出原id的配置信息 + String otherConfigString = dcWarning.getOtherConfig();//新增的配置信息 + JSONObject jsonObjectOne = new JSONObject(otherConfig); + JSONObject jsonObjectTwo = new JSONObject(otherConfigString); + JSONObject jsonObject = new DcWarningServiceImpl().mergeJsonObjects(jsonObjectOne, jsonObjectTwo);//合成新的json + Integer integer = dcWarningMapper.updateOtherConfig(dataId, jsonObject.toString());//修改数据库配置 + redisCache.deleteObject(WARNINGDATA + key);//删除redis存储的数据 + if (integer==0){ + return 0; + } + return 1; + } + return dcWarningMapper.insertDcWarning(dcWarning);//如果没有配置策略直接加入数据库; } @@ -170,13 +300,14 @@ public class DcWarningServiceImpl implements IDcWarningService } HashMap redisValueThree = redisWarningStrategy.get(redisKye+"3");//查看传入的事件类型是否配置策略3(时间窗口策略) if (redisValueOne==null&&redisValueTwo==null&&redisValueThree!=null){ //执行策略3,执行到这里说明1不存在或者2不存在或者1未满足过滤条件 - if (dataId==null){//如果不存在直接加入数据库,加入缓存,配置对应的过期时间(30分钟) + String strategyTime = redisValueThree.get("strategyTime").toString();//策略时长 + if (dataId==null){//如果不存在直接加入数据库,加入缓存,配置对应的过期时间 int insertDcWarning = dcWarningMapper.insertDcWarning(dcWarning);//加入数据库 if (insertDcWarning==0){ return 0; } String id = dcWarning.getId();//取出加入后的id作为value - redisCache.setCacheObject(WARNINGDATA+key,id,30,TimeUnit.MINUTES);//加入缓存并设置延迟时间(单位分钟) + redisCache.setCacheObject(WARNINGDATA+key,id,Integer.parseInt(strategyTime),TimeUnit.MINUTES);//加入缓存并设置延迟时间(单位分钟) return 1;//结束 } //redis存在数据,取出redis的id找对对应事件的配置,合成事件配置 @@ -185,7 +316,7 @@ public class DcWarningServiceImpl implements IDcWarningService redisCache.deleteObject(WARNINGDATA+key); dcWarningMapper.insertDcWarning(dcWarning); String id = dcWarning.getId(); - redisCache.setCacheObject(WARNINGDATA+key,id,30,TimeUnit.MINUTES); + redisCache.setCacheObject(WARNINGDATA+key,id,Integer.parseInt(strategyTime),TimeUnit.MINUTES); return 1; } String otherConfig=""; diff --git a/zc-business/src/main/resources/mapper/business/DcPerceivedEventsWarningMapper.xml b/zc-business/src/main/resources/mapper/business/DcPerceivedEventsWarningMapper.xml index 3b372a0b..2891c83f 100644 --- a/zc-business/src/main/resources/mapper/business/DcPerceivedEventsWarningMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcPerceivedEventsWarningMapper.xml @@ -451,7 +451,7 @@ SELECT '2-1' AS warning_subclass, '行人' AS subclass UNION ALL SELECT '6-4' AS warning_subclass, '抛洒物' AS subclass UNION ALL SELECT '5-6' AS warning_subclass, '变道' AS subclass UNION ALL - SELECT '99-1' AS warning_subclass, '机占非' AS subclass UNION ALL + SELECT '99-1' AS warning_subclass, '其它' AS subclass UNION ALL SELECT '6-3' AS warning_subclass, '路障' AS subclass UNION ALL SELECT '7-1' AS warning_subclass, '施工' AS subclass UNION ALL SELECT '4-10' AS warning_subclass, '停车' AS subclass UNION ALL From 7d940bacf2c017207daabd934c7707f12a5d87b5 Mon Sep 17 00:00:00 2001 From: wangsixiang <2970484253@qq.com> Date: Tue, 26 Mar 2024 11:17:03 +0800 Subject: [PATCH 07/27] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/zc/business/service/impl/DcWarningServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java index 77224c7c..24a7817d 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java @@ -198,7 +198,7 @@ public class DcWarningServiceImpl implements IDcWarningService return 0; } String id = dcWarning.getId();//取出加入后的id作为value - redisCache.setCacheObject(WARNINGDATA+key,id);//加入缓存????存在问题会数据累计 + redisCache.setCacheObject(WARNINGDATA+key,id,24,TimeUnit.HOURS);//加入缓存,防止redis数据累计,这里也要设置过期时间,设置为24小时 return 1;//结束 } //redis存在数据,取出redis的id找对对应事件的配置,合成事件配置 From f4dd5e4a7532a036bd41eab4e2750bef758bfd49 Mon Sep 17 00:00:00 2001 From: wangsixiang <2970484253@qq.com> Date: Tue, 26 Mar 2024 11:17:52 +0800 Subject: [PATCH 08/27] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/zc/business/service/impl/DcWarningServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java index 24a7817d..cd5a4d71 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java @@ -198,7 +198,7 @@ public class DcWarningServiceImpl implements IDcWarningService return 0; } String id = dcWarning.getId();//取出加入后的id作为value - redisCache.setCacheObject(WARNINGDATA+key,id,24,TimeUnit.HOURS);//加入缓存,防止redis数据累计,这里也要设置过期时间,设置为24小时 + redisCache.setCacheObject(WARNINGDATA+key,id,24,TimeUnit.HOURS);//加入缓存,防止redis数据累计,这里也要设置过期时间,设置为24小时 return 1;//结束 } //redis存在数据,取出redis的id找对对应事件的配置,合成事件配置 From 451cee4e0e2797c18ddcffedf49c243a03aa330a Mon Sep 17 00:00:00 2001 From: wangsixiang <2970484253@qq.com> Date: Tue, 26 Mar 2024 11:38:07 +0800 Subject: [PATCH 09/27] =?UTF-8?q?=E7=AD=96=E7=95=A5=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/zc/business/service/impl/DcWarningServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java index cd5a4d71..0ad11a12 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java @@ -89,6 +89,7 @@ public class DcWarningServiceImpl implements IDcWarningService @Override public int insertDcWarning(DcWarning dcWarning) { + dcWarning.setCreateTime(DateUtils.getNowDate()); //设置事件Id UUID无下划线格式32 String uuid = IdUtils.fastSimpleUUID(); dcWarning.setId(uuid); From ac45d7c34c899caae52514f0abf344a0d25b0e16 Mon Sep 17 00:00:00 2001 From: mengff <1198151809@qq.com> Date: Tue, 26 Mar 2024 14:38:46 +0800 Subject: [PATCH 10/27] =?UTF-8?q?--=E6=B3=A8=E9=87=8A=E6=8E=89=E5=9C=A8?= =?UTF-8?q?=E7=BA=BF=E7=8E=87=E6=8B=96=E6=8B=BD=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../business/controller/StatusController.java | 37 +++++++++++++++++-- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/zc-business/src/main/java/com/zc/business/controller/StatusController.java b/zc-business/src/main/java/com/zc/business/controller/StatusController.java index 5a4adb7a..0bbc786a 100644 --- a/zc-business/src/main/java/com/zc/business/controller/StatusController.java +++ b/zc-business/src/main/java/com/zc/business/controller/StatusController.java @@ -1,8 +1,10 @@ package com.zc.business.controller; +import com.github.pagehelper.util.StringUtil; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.poi.ExcelUtil; @@ -15,6 +17,7 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; @@ -31,6 +34,10 @@ public class StatusController extends BaseController { private StatusService statusService; @Autowired private DcDeviceServiceImpl dcDeviceService; + @Resource + private RedisCache redisCache; + + private static final String ORDERRULE = "orderRule";//排序策略key //设备列表 @ApiOperation("设备状态列表按时间和类型") @@ -95,6 +102,16 @@ public class StatusController extends BaseController { } + //按时间划分设备柱状图 + @ApiOperation("更新缓存规则") + @GetMapping ("/rule") + public AjaxResult setRule(String rule) + { + redisCache.setCacheSetValue(ORDERRULE,rule); + return AjaxResult.success(); + } + + @ApiOperation("根据设备Id查询折线图数据") @GetMapping("/deviceStatusList/{deviceId}") public AjaxResult getDeviceStatusList(@PathVariable Long deviceId) { @@ -251,11 +268,11 @@ public class StatusController extends BaseController { Integer lastKey = Collections.max(ipMap.keySet()); List lastEntry = ipMap.get(lastKey); Map> typeMap = lastEntry.stream().filter(iteam -> iteam.getType() != null).collect(Collectors.groupingBy(Status::getType)); - Map> subMap = new HashMap<>(); + Map> subMap = new HashMap<>(); itemTypeMap.forEach((key, value) -> { - Map maps = new HashMap<>(); + Map maps = new HashMap<>(); List groupItems = typeMap.get(key); if (groupItems == null) { //丢包率 @@ -317,7 +334,7 @@ public class StatusController extends BaseController { // // } //} - Map maps=new HashMap<>(); + Map maps=new HashMap<>(); double lostRate = lastEntry.stream() .mapToDouble(Status -> Double.parseDouble(Status.getLostRate().replace("%", ""))) // 去掉%,并转换为double .average().getAsDouble(); @@ -337,7 +354,19 @@ public class StatusController extends BaseController { //总数 maps.put("sum",String.valueOf(list.size())); subMap.put("全部设备",maps); - +// Map ruleMap=new HashMap<>(); +// String orderRule=redisCache.getCacheObject(ORDERRULE); +// if(StringUtil.isNotEmpty(orderRule)){ +// ruleMap.put("rule",orderRule); +// subMap.put("排序规则",ruleMap); +// }else{ +// String[] rules = {"全部设备","高清网络枪型固定摄像机","高清网络球形摄像机","桥下高清网络球形摄像机","360°全景摄像机","180°全景摄像机", +// "门架式可变信息标志","雨棚可变信息标志","站前悬臂式可变信息标志","气象检测器","路段语音广播系统","护栏碰撞预警系统","毫米波雷达", +// "合流区预警系统","激光疲劳唤醒","一类交通量调查站","智能行车诱导系统"}; +// orderRule= Arrays.toString(rules); +// ruleMap.put("rule",orderRule); +// subMap.put("排序规则",ruleMap); +// } return AjaxResult.success(subMap); } From b07864492dcaf227bbaa5fa7ac465e6b593ec9a4 Mon Sep 17 00:00:00 2001 From: "Mr.Wang" Date: Tue, 26 Mar 2024 17:37:46 +0800 Subject: [PATCH 11/27] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E7=A1=AE=E8=AE=A4=E4=BB=A3=E7=A0=81=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E4=BA=8B=E4=BB=B6id-=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E9=A2=84=E6=A1=88=E4=BA=8B=E4=BB=B6=E5=85=B3=E8=81=94=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DcEmergencyPlansController.java | 9 +++++ .../service/DcEmergencyPlansService.java | 8 ++++ .../impl/DcEmergencyPlansServiceImpl.java | 37 ++++++++++++++----- 3 files changed, 45 insertions(+), 9 deletions(-) diff --git a/zc-business/src/main/java/com/zc/business/controller/DcEmergencyPlansController.java b/zc-business/src/main/java/com/zc/business/controller/DcEmergencyPlansController.java index 1163548e..d6b84c89 100644 --- a/zc-business/src/main/java/com/zc/business/controller/DcEmergencyPlansController.java +++ b/zc-business/src/main/java/com/zc/business/controller/DcEmergencyPlansController.java @@ -126,6 +126,15 @@ public class DcEmergencyPlansController extends BaseController { return AjaxResult.success(dcEmergencyPlansService.executionEventConfirmation(dcEventAnDcEmergencyPlans)); } + /** + * 根据事件id-查询预案事件关联表 + */ + @ApiOperation("根据事件id-查询预案事件关联表") + @GetMapping("/event/assoc/{id}") + public AjaxResult eventConfirm(@PathVariable("id") String id) { + return AjaxResult.success(dcEmergencyPlansService.selectEventPlanAssocByEventId(id)); + } + /** * 感知事件确定 */ diff --git a/zc-business/src/main/java/com/zc/business/service/DcEmergencyPlansService.java b/zc-business/src/main/java/com/zc/business/service/DcEmergencyPlansService.java index 2ecea0a2..de8faf8e 100644 --- a/zc-business/src/main/java/com/zc/business/service/DcEmergencyPlansService.java +++ b/zc-business/src/main/java/com/zc/business/service/DcEmergencyPlansService.java @@ -65,6 +65,14 @@ public interface DcEmergencyPlansService { */ JSONArray executionEventConfirmation(DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans); + /** + * 根据事件id-查询预案事件关联表 + * + * @param eventId 事件id + * @return 结果 + */ + EventPlanAssoc selectEventPlanAssocByEventId(String eventId); + /** * 感知事件确定 * diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcEmergencyPlansServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcEmergencyPlansServiceImpl.java index 7f0a614a..e837c5ea 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcEmergencyPlansServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcEmergencyPlansServiceImpl.java @@ -424,6 +424,18 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { return executionConfirmation(dcEventAnDcEmergencyPlans, dcEvent.getStakeMark(), direction, id); } + /** + * 根据事件id-查询预案事件关联表 + * @param eventId 事件id + * @return + */ + @Override + public EventPlanAssoc selectEventPlanAssocByEventId(String eventId) { + EventPlanAssoc eventPlanAssoc = new EventPlanAssoc(); + eventPlanAssoc.setEventId(eventId); + return eventPlanAssocMapper.selectByEventId(eventPlanAssoc); + } + /** * 感知事件-情报板自动生成 * @@ -584,17 +596,24 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { EventPlanAssoc eventPlanAssoc = new EventPlanAssoc(); // 事件编号 eventPlanAssoc.setEventId(id); - + EventPlanAssoc selectEventPlanAssoc = eventPlanAssocMapper.selectByEventId(eventPlanAssoc); // 区分是执行操作 还是 恢复操作 - if (dcEventAnDcEmergencyPlans.getOperationType().equals(1)) { - // 事件预案编号 + if (dcEventAnDcEmergencyPlans.getOperationType().equals(1) && StringUtils.isEmpty(selectEventPlanAssoc.getId())) { + // 首次执行操作 eventPlanAssoc.setEmergencyPlansId(dcEmergencyPlans.getId()); eventPlanAssoc.setExecutingControlDevice(deviceIds.toString().replaceFirst(";", "")); eventPlanAssoc.setExecutingControlResult(resultArray.toJSONString()); eventPlanAssoc.setCreateTime(DateUtils.getNowDate()); eventPlanAssocMapper.insertEventPlanAssoc(eventPlanAssoc); - } else { - EventPlanAssoc selectEventPlanAssoc = eventPlanAssocMapper.selectByEventId(eventPlanAssoc); + } + else if (StringUtils.isNotEmpty(selectEventPlanAssoc.getId()) && dcEventAnDcEmergencyPlans.getOperationType().equals(1)) { + // 多次执行操作 + selectEventPlanAssoc.setExecutingControlResult(resultArray.toJSONString()); + selectEventPlanAssoc.setUpdateTime(DateUtils.getNowDate()); + eventPlanAssocMapper.updateEventPlanAssoc(selectEventPlanAssoc); + } + else { + // 恢复操作 未执行的事件不能进行恢复操作 selectEventPlanAssoc.setUpdateTime(DateUtils.getNowDate()); selectEventPlanAssoc.setRecoveredControlDevice(deviceIds.toString().replaceFirst(";", "")); selectEventPlanAssoc.setRecoveredControlResult(resultArray.toJSONString()); @@ -620,7 +639,7 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { iotDeviceId = device.getIotDeviceId(); HashMap props = new HashMap<>(); try { - if (device.getDeviceType().equals(DeviceTypeConstants.DRIVING_GUIDANCE)) { + if (device.getDeviceType().equals(DeviceTypeConstants.DRIVING_GUIDANCE.toString())) { // 行车诱导 functionId = DeviceFunctionIdConstants.DRIVING_GUIDANCE; // 控制模式 1-手动 2-自动 3-万年历 @@ -645,7 +664,7 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { } - else if (device.getDeviceType().equals(DeviceTypeConstants.VARIABLE_INFORMATION_FLAG)) { + else if (device.getDeviceType().equals(DeviceTypeConstants.VARIABLE_INFORMATION_FLAG.toString())) { if (operationType == 1) { // 执行操作 @@ -721,7 +740,7 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { } } - else if (device.getDeviceType().equals(DeviceTypeConstants.ROAD_SECTION_VOICE_BROADCASTING)) { + else if (device.getDeviceType().equals(DeviceTypeConstants.ROAD_SECTION_VOICE_BROADCASTING.toString())) { // 路段广播 JSONObject params = new JSONObject(); params.put("name", "task-event"); @@ -742,7 +761,7 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { } - else if (device.getDeviceType().equals(DeviceTypeConstants.LASER_FATIGUE_AWAKENING)) { + else if (device.getDeviceType().equals(DeviceTypeConstants.LASER_FATIGUE_AWAKENING.toString())) { // 激光疲劳唤醒 functionId = otherConfig.get("state").toString(); From b7e10b1ec168d22ff4237e38e6334e0c2bb84aad Mon Sep 17 00:00:00 2001 From: mengff <1198151809@qq.com> Date: Wed, 27 Mar 2024 09:43:30 +0800 Subject: [PATCH 12/27] =?UTF-8?q?--=E8=AE=BE=E5=A4=87=E5=9C=A8=E7=BA=BF?= =?UTF-8?q?=E7=8E=87=E5=AF=BC=E5=87=BA=E5=88=97=E8=A1=A8=E5=8E=BB=E6=8E=89?= =?UTF-8?q?=E5=9E=8B=E5=8F=B7=EF=BC=8C=E6=A3=80=E6=B5=8B=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=97=B6=E5=88=86=E7=A7=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zc-business/src/main/java/com/zc/business/domain/Status.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zc-business/src/main/java/com/zc/business/domain/Status.java b/zc-business/src/main/java/com/zc/business/domain/Status.java index 0ab2a5a6..5e7c74e7 100644 --- a/zc-business/src/main/java/com/zc/business/domain/Status.java +++ b/zc-business/src/main/java/com/zc/business/domain/Status.java @@ -125,7 +125,7 @@ public class Status { private Long deviceId; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern ="yyyy-MM-dd HH:mm:ss") - @Excel(name = "监测时间", width = 30, dateFormat = "yyyy-MM-dd") + @Excel(name = "监测时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") private LocalDateTime time; public String getSuccessRate() { @@ -208,7 +208,7 @@ public class Status { this.deviceId = deviceId; } - @Excel(name = "型号") + // @Excel(name = "型号") private String model; From b3c8d75ca0653a3900fc534ec5de67fc17d9771d Mon Sep 17 00:00:00 2001 From: zhaoxianglong Date: Wed, 27 Mar 2024 14:14:05 +0800 Subject: [PATCH 13/27] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8A=A4=E6=A0=8F?= =?UTF-8?q?=E7=A2=B0=E6=92=9E=E4=BA=8B=E4=BB=B6=E4=B8=8A=E6=8A=A5=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NonAutomaticWarningController.java | 2 ++ .../device/handler/DeviceMessageHandler.java | 17 ++++++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/zc-business/src/main/java/com/zc/business/controller/NonAutomaticWarningController.java b/zc-business/src/main/java/com/zc/business/controller/NonAutomaticWarningController.java index 0663a021..cd286852 100644 --- a/zc-business/src/main/java/com/zc/business/controller/NonAutomaticWarningController.java +++ b/zc-business/src/main/java/com/zc/business/controller/NonAutomaticWarningController.java @@ -14,6 +14,7 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.eclipse.paho.client.mqttv3.*; import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; +import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -32,6 +33,7 @@ import java.util.Objects; */ @Api(tags = "非机预警接口") @RestController +@Component @RequestMapping("/nonAutomaticWarning") public class NonAutomaticWarningController extends BaseController { diff --git a/zc-business/src/main/java/com/zc/business/message/device/handler/DeviceMessageHandler.java b/zc-business/src/main/java/com/zc/business/message/device/handler/DeviceMessageHandler.java index c3209c98..43b77323 100644 --- a/zc-business/src/main/java/com/zc/business/message/device/handler/DeviceMessageHandler.java +++ b/zc-business/src/main/java/com/zc/business/message/device/handler/DeviceMessageHandler.java @@ -378,16 +378,20 @@ public class DeviceMessageHandler { String direction = ""; if (Objects.equals(location, "0")) { dcWarning.setDirection("1"); - direction = "上行右侧"; + dcWarning.setLane("0"); + direction = "菏泽方向右侧护栏"; } else if (Objects.equals(location, "1")) { dcWarning.setDirection("1"); - direction = "上行左侧"; + dcWarning.setLane("1"); + direction = "菏泽方向左侧护栏"; } else if (Objects.equals(location, "10")) { dcWarning.setDirection("0"); - direction = "下行右侧"; + dcWarning.setLane("0"); + direction = "济南方向右侧护栏"; } else if (Objects.equals(location, "11")) { dcWarning.setDirection("0"); - direction = "下行左侧"; + dcWarning.setLane("1"); + direction = "济南方向左侧护栏"; } String eventType = ""; @@ -423,8 +427,11 @@ public class DeviceMessageHandler { dcWarning.setStakeMark(dcDevices.get(0).getStakeMark()); dcWarning.setWarningType(9); + dcWarning.setWarningSubclass("4"); + dcWarning.setWarningState(1); dcWarning.setCreateTime(new Date()); - dcWarning.setWarningTitle("护栏碰撞上报事件:区域号为" + areaCode + "在" + timeOfFireAlarming + direction + "发生" + eventType + "事件"); + dcWarning.setDirection("护栏碰撞上报事件:区域号为" + areaCode + "在20" + timeOfFireAlarming + direction + "发生" + eventType + "事件"); + dcWarning.setWarningTitle("护栏碰撞在20" + timeOfFireAlarming + direction + "发生" + eventType + "事件"); dcWarning.setOtherConfig(dataJsonObject.toJSONString()); dcWarningService.insertDcWarning(dcWarning); } From 1e7d910d1456e47e07d656211adc6400dd40f734 Mon Sep 17 00:00:00 2001 From: wangsixiang <2970484253@qq.com> Date: Wed, 27 Mar 2024 14:26:29 +0800 Subject: [PATCH 14/27] =?UTF-8?q?=E5=91=8A=E8=AD=A6=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=BA=90=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/business/DcPerceivedEventsWarningMapper.xml | 1 + .../src/main/resources/mapper/business/DcWarningMapper.xml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/zc-business/src/main/resources/mapper/business/DcPerceivedEventsWarningMapper.xml b/zc-business/src/main/resources/mapper/business/DcPerceivedEventsWarningMapper.xml index 2891c83f..cee18a76 100644 --- a/zc-business/src/main/resources/mapper/business/DcPerceivedEventsWarningMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcPerceivedEventsWarningMapper.xml @@ -39,6 +39,7 @@ left join dc_facility as facility on facility.stake_mark=warning.stake_mark warning.warning_source !=6 + and warning.warning_source = #{warningSource} and warning.warning_state = #{warningState} and warning.warning_type = #{warningType} and warning.warning_subclass = #{warningSubclass} diff --git a/zc-business/src/main/resources/mapper/business/DcWarningMapper.xml b/zc-business/src/main/resources/mapper/business/DcWarningMapper.xml index 21aff783..71b2db5a 100644 --- a/zc-business/src/main/resources/mapper/business/DcWarningMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcWarningMapper.xml @@ -162,7 +162,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - update dc_warning set other_config=#{otherConfig} where id=#{id} + update dc_warning set other_config=#{otherConfig},update_time=now() where id=#{id} From 91443912a60a8584d90ebe53f829fb1318dd2285 Mon Sep 17 00:00:00 2001 From: wangsixiang <2970484253@qq.com> Date: Wed, 27 Mar 2024 14:39:03 +0800 Subject: [PATCH 15/27] =?UTF-8?q?=E5=91=8A=E8=AD=A6=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/business/DcPerceivedEventsWarningMapper.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zc-business/src/main/resources/mapper/business/DcPerceivedEventsWarningMapper.xml b/zc-business/src/main/resources/mapper/business/DcPerceivedEventsWarningMapper.xml index cee18a76..db76147b 100644 --- a/zc-business/src/main/resources/mapper/business/DcPerceivedEventsWarningMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcPerceivedEventsWarningMapper.xml @@ -38,7 +38,7 @@ left JOIN dc_stake_mark AS mark ON mark.stake_mark=warning.stake_mark and mark.direction=warning.direction left join dc_facility as facility on facility.stake_mark=warning.stake_mark - warning.warning_source !=6 + and warning.warning_source !=6 and warning.warning_source = #{warningSource} and warning.warning_state = #{warningState} and warning.warning_type = #{warningType} From 6ecc33a7638045699690e26df74b6d0223e95067 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=B4=E7=90=B3?= <1911390090@qq.com> Date: Thu, 28 Mar 2024 10:00:33 +0800 Subject: [PATCH 16/27] =?UTF-8?q?=E6=B0=94=E8=B1=A1=E8=AE=BE=E5=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/DcEventController.java | 2 + .../domain/DcMeteorologicalDetectorData.java | 189 +++--------------- .../DcMeteorologicalDetectorDataMapper.java | 6 + .../device/handler/DeviceMessageHandler.java | 20 +- .../IDcMeteorologicalDetectorDataService.java | 6 + ...MeteorologicalDetectorDataServiceImpl.java | 14 ++ .../DcMeteorologicalDetectorDataMapper.xml | 112 +++++++---- 7 files changed, 143 insertions(+), 206 deletions(-) diff --git a/zc-business/src/main/java/com/zc/business/controller/DcEventController.java b/zc-business/src/main/java/com/zc/business/controller/DcEventController.java index 028532e5..f7dcbe6d 100644 --- a/zc-business/src/main/java/com/zc/business/controller/DcEventController.java +++ b/zc-business/src/main/java/com/zc/business/controller/DcEventController.java @@ -162,4 +162,6 @@ public class DcEventController extends BaseController Map map = dcEventService.selectCount(); return map; } + + } diff --git a/zc-business/src/main/java/com/zc/business/domain/DcMeteorologicalDetectorData.java b/zc-business/src/main/java/com/zc/business/domain/DcMeteorologicalDetectorData.java index 627f5f12..46a459ad 100644 --- a/zc-business/src/main/java/com/zc/business/domain/DcMeteorologicalDetectorData.java +++ b/zc-business/src/main/java/com/zc/business/domain/DcMeteorologicalDetectorData.java @@ -1,5 +1,8 @@ package com.zc.business.domain; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; @@ -11,6 +14,9 @@ import com.ruoyi.common.core.domain.BaseEntity; * @author ruoyi * @date 2024-02-01 */ +@Data +@AllArgsConstructor +@NoArgsConstructor public class DcMeteorologicalDetectorData extends BaseEntity { private static final long serialVersionUID = 1L; @@ -73,169 +79,26 @@ public class DcMeteorologicalDetectorData extends BaseEntity /** 水膜厚度 */ @Excel(name = "水膜厚度") private String waterFilmIceSnowValue; + @Excel(name = "设备名称") + private String deviceName; + @Excel(name = "桩号") + private String stakeMark; + @Excel(name = "方向") + private String direction; + +// "rainfall": 0, +// "visibility": "05.000", +// "remoteRoadSurfaceTemperature": 11.5, +// "atmosphericPressure:": 1008.8, +// "precipitationType": 0, +// "wetSlipperyCoefficient": 80, +// "temperature": 12.6, +// "humidity": 63.4, +// "windDirection": 358, +// "windSpeed": 1.5, +// "remoteRoadSurfaceStatus": "01", +// "visibilityType": 4, +// "waterFilmIceSnowValue": 0 - - - - - public void setId(Long id) - { - this.id = id; - } - - public Long getId() - { - return id; - } - public void setIotDeviceId(String iotDeviceId) - { - this.iotDeviceId = iotDeviceId; - } - - public String getIotDeviceId() - { - return iotDeviceId; - } - public void setRainfall(String rainfall) - { - this.rainfall = rainfall; - } - - public String getRainfall() - { - return rainfall; - } - public void setVisibilityType(String visibilityType) - { - this.visibilityType = visibilityType; - } - - public String getVisibilityType() - { - return visibilityType; - } - public void setVisibility(String visibility) - { - this.visibility = visibility; - } - - public String getVisibility() - { - return visibility; - } - public void setAtmosphericPressure(String atmosphericPressure) - { - this.atmosphericPressure = atmosphericPressure; - } - - public String getAtmosphericPressure() - { - return atmosphericPressure; - } - public void setTemperature(String temperature) - { - this.temperature = temperature; - } - - public String getTemperature() - { - return temperature; - } - public void setHumidity(String humidity) - { - this.humidity = humidity; - } - - public String getHumidity() - { - return humidity; - } - public void setWindDirection(String windDirection) - { - this.windDirection = windDirection; - } - - public String getWindDirection() - { - return windDirection; - } - public void setWindSpeed(String windSpeed) - { - this.windSpeed = windSpeed; - } - - public String getWindSpeed() - { - return windSpeed; - } - - public void setPrecipitationType(String precipitationType) - { - this.precipitationType = precipitationType; - } - - public String getPrecipitationType() - { - return precipitationType; - } - public void setWetSlipperyCoefficient(String wetSlipperyCoefficient) - { - this.wetSlipperyCoefficient = wetSlipperyCoefficient; - } - - public String getWetSlipperyCoefficient() - { - return wetSlipperyCoefficient; - } - - public void setRemoteRoadSurfaceTemperature(String remoteRoadSurfaceTemperature) - { - this.remoteRoadSurfaceTemperature = remoteRoadSurfaceTemperature; - } - - public String getRemoteRoadSurfaceTemperature() - { - return remoteRoadSurfaceTemperature; - } - public void setRemoteRoadSurfaceStatus(String remoteRoadSurfaceStatus) - { - this.remoteRoadSurfaceStatus = remoteRoadSurfaceStatus; - } - - public String getRemoteRoadSurfaceStatus() - { - return remoteRoadSurfaceStatus; - } - - public void setWaterFilmIceSnowValue(String waterFilmIceSnowValue) - { - this.waterFilmIceSnowValue = waterFilmIceSnowValue; - } - - public String getWaterFilmIceSnowValue() - { - return waterFilmIceSnowValue; - } - - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("id", getId()) - .append("iotDeviceId", getIotDeviceId()) - .append("rainfall", getRainfall()) - .append("visibilityType", getVisibilityType()) - .append("visibility", getVisibility()) - .append("atmosphericPressure", getAtmosphericPressure()) - .append("temperature", getTemperature()) - .append("humidity", getHumidity()) - .append("windDirection", getWindDirection()) - .append("windSpeed", getWindSpeed()) - .append("precipitationType", getPrecipitationType()) - .append("wetSlipperyCoefficient", getWetSlipperyCoefficient()) - .append("remoteRoadSurfaceTemperature", getRemoteRoadSurfaceTemperature()) - .append("remoteRoadSurfaceStatus", getRemoteRoadSurfaceStatus()) - .append("waterFilmIceSnowValue", getWaterFilmIceSnowValue()) - .toString(); - } } diff --git a/zc-business/src/main/java/com/zc/business/mapper/DcMeteorologicalDetectorDataMapper.java b/zc-business/src/main/java/com/zc/business/mapper/DcMeteorologicalDetectorDataMapper.java index 7788b60e..ebbb2f0a 100644 --- a/zc-business/src/main/java/com/zc/business/mapper/DcMeteorologicalDetectorDataMapper.java +++ b/zc-business/src/main/java/com/zc/business/mapper/DcMeteorologicalDetectorDataMapper.java @@ -1,6 +1,8 @@ package com.zc.business.mapper; import java.util.List; +import java.util.Map; + import com.zc.business.domain.DcMeteorologicalDetectorData; import com.zc.business.domain.MdDeviceData; @@ -59,4 +61,8 @@ public interface DcMeteorologicalDetectorDataMapper * @return 结果 */ int deleteDcMeteorologicalDetectorDataByIds(Long[] ids); +//统计 + List> selectStatistics(String deviceName); + + List selectlistAll(DcMeteorologicalDetectorData dcMeteorologicalDetectorData); } diff --git a/zc-business/src/main/java/com/zc/business/message/device/handler/DeviceMessageHandler.java b/zc-business/src/main/java/com/zc/business/message/device/handler/DeviceMessageHandler.java index 43b77323..690be7b3 100644 --- a/zc-business/src/main/java/com/zc/business/message/device/handler/DeviceMessageHandler.java +++ b/zc-business/src/main/java/com/zc/business/message/device/handler/DeviceMessageHandler.java @@ -445,7 +445,25 @@ public class DeviceMessageHandler { */ private void weatherDetectorMessageHandle(JSONObject msg) { - DcMeteorologicalDetectorData meteorologicalDetectorData = (DcMeteorologicalDetectorData) msg.get("properties"); + // DcMeteorologicalDetectorData meteorologicalDetectorData = (DcMeteorologicalDetectorData) msg.get("properties"); + JSONObject jsonObject = (JSONObject) msg.get("properties"); + DcMeteorologicalDetectorData meteorologicalDetectorData = jsonObject.toJavaObject(DcMeteorologicalDetectorData.class); + + + JSONObject jsonObjectHeaders = (JSONObject)msg.get("headers"); + String parts = jsonObjectHeaders.getString("deviceName"); + String[] strings = parts.split("-"); + String deviceName = strings[0]; + String stakeMark = strings[1]; + String direction = strings[2]; + + //设备名称 + meteorologicalDetectorData.setDeviceName(deviceName); + //位置 + meteorologicalDetectorData.setStakeMark(stakeMark); + //方向 + meteorologicalDetectorData.setDirection(direction); + meteorologicalDetectorData.setIotDeviceId(msg.get("deviceId").toString()); meteorologicalDetectorDataService.insertDcMeteorologicalDetectorData(meteorologicalDetectorData); diff --git a/zc-business/src/main/java/com/zc/business/service/IDcMeteorologicalDetectorDataService.java b/zc-business/src/main/java/com/zc/business/service/IDcMeteorologicalDetectorDataService.java index 4832955c..929f5b67 100644 --- a/zc-business/src/main/java/com/zc/business/service/IDcMeteorologicalDetectorDataService.java +++ b/zc-business/src/main/java/com/zc/business/service/IDcMeteorologicalDetectorDataService.java @@ -1,6 +1,8 @@ package com.zc.business.service; import java.util.List; +import java.util.Map; + import com.zc.business.domain.DcMeteorologicalDetectorData; import com.zc.business.domain.MdDeviceData; @@ -59,4 +61,8 @@ public interface IDcMeteorologicalDetectorDataService * @return 结果 */ int deleteDcMeteorologicalDetectorDataById(Long id); +//统计当天 没小时温度 + List> selectStatistics(String deviceName); + + List selectlistAll(DcMeteorologicalDetectorData dcMeteorologicalDetectorData); } diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcMeteorologicalDetectorDataServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcMeteorologicalDetectorDataServiceImpl.java index 56ed60eb..f63b7667 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcMeteorologicalDetectorDataServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcMeteorologicalDetectorDataServiceImpl.java @@ -1,9 +1,12 @@ package com.zc.business.service.impl; import java.util.List; +import java.util.Map; import com.ruoyi.common.annotation.DataSource; import com.ruoyi.common.enums.DataSourceType; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.SecurityUtils; import com.zc.business.domain.DcDevice; import com.zc.business.domain.MdDeviceData; import org.springframework.beans.factory.annotation.Autowired; @@ -57,6 +60,7 @@ public class DcMeteorologicalDetectorDataServiceImpl implements IDcMeteorologica @Override public int insertDcMeteorologicalDetectorData(DcMeteorologicalDetectorData dcMeteorologicalDetectorData) { + dcMeteorologicalDetectorData.setCreateTime(DateUtils.getNowDate()); return dcMeteorologicalDetectorDataMapper.insertDcMeteorologicalDetectorData(dcMeteorologicalDetectorData); } @@ -95,4 +99,14 @@ public class DcMeteorologicalDetectorDataServiceImpl implements IDcMeteorologica { return dcMeteorologicalDetectorDataMapper.deleteDcMeteorologicalDetectorDataById(id); } + + @Override + public List> selectStatistics(String deviceName) { + return dcMeteorologicalDetectorDataMapper.selectStatistics(deviceName); + } + + @Override + public List selectlistAll(DcMeteorologicalDetectorData dcMeteorologicalDetectorData) { + return dcMeteorologicalDetectorDataMapper.selectlistAll(dcMeteorologicalDetectorData); + } } diff --git a/zc-business/src/main/resources/mapper/business/DcMeteorologicalDetectorDataMapper.xml b/zc-business/src/main/resources/mapper/business/DcMeteorologicalDetectorDataMapper.xml index 88e7f843..7a5a75f3 100644 --- a/zc-business/src/main/resources/mapper/business/DcMeteorologicalDetectorDataMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcMeteorologicalDetectorDataMapper.xml @@ -4,59 +4,56 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + - - - - - - - + + + + + + + + + - - select id, iot_device_id, rainfall, visibility_type, visibility, road_surface_status, atmospheric_pressure, temperature, humidity, wind_direction, wind_speed, freezing_point_temperature, salinity_value, road_surface_temperature, water_film_thickness, precipitation_type, wet_slippery_coefficient, sensor_temperature, remote_road_surface_temperature, remote_road_surface_status, sub_surface_temperature, water_film_ice_snow_value,create_time from dc_meteorological_detector_data + select id, iot_device_id, rainfall, visibility_type, visibility, atmospheric_pressure, temperature, humidity, wind_direction, wind_speed, precipitation_type, wet_slippery_coefficient,remote_road_surface_temperature, remote_road_surface_status, water_film_ice_snow_value,create_time,stake_mark,device_name,direction from dc_meteorological_detector_data - and iot_device_id = #{iotDeviceId} + and direction = #{direction} + and stake_mark = #{stakeMark} + and device_name = #{deviceName} and rainfall = #{rainfall} and visibility_type = #{visibilityType} and visibility = #{visibility} - and road_surface_status = #{roadSurfaceStatus} and atmospheric_pressure = #{atmosphericPressure} and temperature = #{temperature} and humidity = #{humidity} and wind_direction = #{windDirection} and wind_speed = #{windSpeed} - and freezing_point_temperature = #{freezingPointTemperature} - and salinity_value = #{salinityValue} - and road_surface_temperature = #{roadSurfaceTemperature} - and water_film_thickness = #{waterFilmThickness} and precipitation_type = #{precipitationType} and wet_slippery_coefficient = #{wetSlipperyCoefficient} - and sensor_temperature = #{sensorTemperature} and remote_road_surface_temperature = #{remoteRoadSurfaceTemperature} and remote_road_surface_status = #{remoteRoadSurfaceStatus} - and sub_surface_temperature = #{subSurfaceTemperature} and water_film_ice_snow_value = #{waterFilmIceSnowValue} @@ -66,81 +63,69 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where id = #{id} - + insert into dc_meteorological_detector_data iot_device_id, + direction, + stake_mark, + device_name, rainfall, visibility_type, visibility, - road_surface_status, atmospheric_pressure, temperature, humidity, wind_direction, wind_speed, - freezing_point_temperature, - salinity_value, - road_surface_temperature, - water_film_thickness, precipitation_type, wet_slippery_coefficient, - sensor_temperature, remote_road_surface_temperature, remote_road_surface_status, - sub_surface_temperature, water_film_ice_snow_value, create_time #{iotDeviceId}, + #{direction}, + #{stakeMark}, + #{deviceName}, #{rainfall}, #{visibilityType}, #{visibility}, - #{roadSurfaceStatus}, #{atmosphericPressure}, #{temperature}, #{humidity}, #{windDirection}, #{windSpeed}, - #{freezingPointTemperature}, - #{salinityValue}, - #{roadSurfaceTemperature}, - #{waterFilmThickness}, #{precipitationType}, #{wetSlipperyCoefficient}, - #{sensorTemperature}, #{remoteRoadSurfaceTemperature}, #{remoteRoadSurfaceStatus}, - #{subSurfaceTemperature}, #{waterFilmIceSnowValue}, - current_date + CURRENT_TIMESTAMP - + update dc_meteorological_detector_data iot_device_id = #{iotDeviceId}, + iot_device_id = #{direction}, + device_name = #{deviceName}, + stake_mark = #{stakeMark}, rainfall = #{rainfall}, visibility_type = #{visibilityType}, visibility = #{visibility}, - road_surface_status = #{roadSurfaceStatus}, atmospheric_pressure = #{atmosphericPressure}, temperature = #{temperature}, humidity = #{humidity}, wind_direction = #{windDirection}, wind_speed = #{windSpeed}, - freezing_point_temperature = #{freezingPointTemperature}, - salinity_value = #{salinityValue}, - road_surface_temperature = #{roadSurfaceTemperature}, - water_film_thickness = #{waterFilmThickness}, precipitation_type = #{precipitationType}, wet_slippery_coefficient = #{wetSlipperyCoefficient}, - sensor_temperature = #{sensorTemperature}, remote_road_surface_temperature = #{remoteRoadSurfaceTemperature}, remote_road_surface_status = #{remoteRoadSurfaceStatus}, - sub_surface_temperature = #{subSurfaceTemperature}, water_film_ice_snow_value = #{waterFilmIceSnowValue}, where id = #{id} @@ -156,4 +141,47 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{id} + + + \ No newline at end of file From aa9cfde5fe65e1538f909ad0257c745d78a32aa0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=B4=E7=90=B3?= <1911390090@qq.com> Date: Thu, 28 Mar 2024 10:14:25 +0800 Subject: [PATCH 17/27] =?UTF-8?q?=E6=B0=94=E8=B1=A1=E6=A3=80=E6=B5=8B?= =?UTF-8?q?=E5=99=A8=E6=95=B0=E6=8D=AE=E5=AF=B9=E8=B1=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/DcMeteorologicalDetectorData.java | 38 +++++++++++++++++-- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/zc-business/src/main/java/com/zc/business/domain/DcMeteorologicalDetectorData.java b/zc-business/src/main/java/com/zc/business/domain/DcMeteorologicalDetectorData.java index 46a459ad..e607f38b 100644 --- a/zc-business/src/main/java/com/zc/business/domain/DcMeteorologicalDetectorData.java +++ b/zc-business/src/main/java/com/zc/business/domain/DcMeteorologicalDetectorData.java @@ -1,5 +1,7 @@ package com.zc.business.domain; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -17,72 +19,102 @@ import com.ruoyi.common.core.domain.BaseEntity; @Data @AllArgsConstructor @NoArgsConstructor +@ApiModel("气象检测器数据对象") public class DcMeteorologicalDetectorData extends BaseEntity { private static final long serialVersionUID = 1L; - + @ApiModelProperty("主键") /** 主键 */ private Long id; /** 物联设备id */ + @ApiModelProperty("物联设备id") @Excel(name = "物联设备id") private String iotDeviceId; /** 降雨量毫米 */ + @ApiModelProperty("降雨量毫米") + @Excel(name = "降雨量毫米") private String rainfall; /** 能见度类型 */ + @ApiModelProperty("能见度类型 4 表示能见度良好3表示阴霾 2表示雾 1表示浓雾") @Excel(name = "能见度类型") private String visibilityType; - /** 能见度 */ + @ApiModelProperty("能见度") @Excel(name = "能见度") private String visibility; /** 路面温度 */ + @ApiModelProperty("路面温度") + @Excel(name = "路面温度") private String remoteRoadSurfaceTemperature; /** 气压 */ + @ApiModelProperty("大气压力 单位hPa") + @Excel(name = "气压") private String atmosphericPressure; /** 降水类型 */ + @ApiModelProperty("降水类型 0=无降;1=雨;2=雪;3=毛毛雨;4=雨夹雪") + @Excel(name = "降水类型") private String precipitationType; /** 湿滑系数 */ + @ApiModelProperty("湿滑系数") + @Excel(name = "湿滑系数") private String wetSlipperyCoefficient; /** 气温 */ + @ApiModelProperty("气温") + @Excel(name = "气温") private String temperature; /** 湿度 */ @Excel(name = "湿度") - private String humidity; + @ApiModelProperty("湿度") + private String humidity; /** 风向 */ + @ApiModelProperty("风向") + @Excel(name = "风向") private String windDirection; + /** 风速 */ + @ApiModelProperty("风速 单位m/s") + @Excel(name = "风速") private String windSpeed; /** 路面状态 */ + @ApiModelProperty("路面状态 00=干燥,01=潮湿,02=积水,03=结冰,04=积雪,05=冰水混合物,06=泥泞") + @Excel(name = "路面状态") private String remoteRoadSurfaceStatus; /** 水膜厚度 */ + @ApiModelProperty("水膜厚度 单位mm") @Excel(name = "水膜厚度") private String waterFilmIceSnowValue; @Excel(name = "设备名称") + @ApiModelProperty("设备名称") + private String deviceName; + @Excel(name = "桩号") + @ApiModelProperty("桩号") private String stakeMark; + @ApiModelProperty("方向") + @Excel(name = "方向") private String direction; From 7d49eb8ccb878d2bc5ebd1b9f28946736e99ada4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=B4=E7=90=B3?= <1911390090@qq.com> Date: Thu, 28 Mar 2024 15:03:26 +0800 Subject: [PATCH 18/27] =?UTF-8?q?=E6=B0=94=E8=B1=A1=E6=A3=80=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=20=E6=9F=A5=E8=AF=A2=E5=BD=93=E5=A4=A9=E6=9C=80?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/DcMeteorologicalDetectorData.java | 5 ++- ...MeteorologicalDetectorDataServiceImpl.java | 1 + .../DcMeteorologicalDetectorDataMapper.xml | 40 ++++++++++++++----- 3 files changed, 34 insertions(+), 12 deletions(-) diff --git a/zc-business/src/main/java/com/zc/business/domain/DcMeteorologicalDetectorData.java b/zc-business/src/main/java/com/zc/business/domain/DcMeteorologicalDetectorData.java index e607f38b..2910e341 100644 --- a/zc-business/src/main/java/com/zc/business/domain/DcMeteorologicalDetectorData.java +++ b/zc-business/src/main/java/com/zc/business/domain/DcMeteorologicalDetectorData.java @@ -1,5 +1,6 @@ package com.zc.business.domain; +import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; @@ -117,7 +118,9 @@ public class DcMeteorologicalDetectorData extends BaseEntity @Excel(name = "方向") private String direction; - + @ApiModelProperty("状态") + @TableField(exist = false) + private String deviceState; // "rainfall": 0, // "visibility": "05.000", // "remoteRoadSurfaceTemperature": 11.5, diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcMeteorologicalDetectorDataServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcMeteorologicalDetectorDataServiceImpl.java index f63b7667..dd5d6468 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcMeteorologicalDetectorDataServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcMeteorologicalDetectorDataServiceImpl.java @@ -27,6 +27,7 @@ public class DcMeteorologicalDetectorDataServiceImpl implements IDcMeteorologica @Autowired private DcMeteorologicalDetectorDataMapper dcMeteorologicalDetectorDataMapper; + /** * 查询气象检测器数据 * diff --git a/zc-business/src/main/resources/mapper/business/DcMeteorologicalDetectorDataMapper.xml b/zc-business/src/main/resources/mapper/business/DcMeteorologicalDetectorDataMapper.xml index 7a5a75f3..38a3de69 100644 --- a/zc-business/src/main/resources/mapper/business/DcMeteorologicalDetectorDataMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcMeteorologicalDetectorDataMapper.xml @@ -24,6 +24,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -172,16 +173,33 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" \ No newline at end of file From b3c3c043819a7eab5b4957d86abfed392ffd2c89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=B4=E7=90=B3?= <1911390090@qq.com> Date: Thu, 28 Mar 2024 15:53:12 +0800 Subject: [PATCH 19/27] =?UTF-8?q?=E6=B0=94=E8=B1=A1=E6=A3=80=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=20=E6=9F=A5=E8=AF=A2=E5=BD=93=E5=A4=A9=E6=9C=80?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DcMeteorologicalDetectorController.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 zc-business/src/main/java/com/zc/business/controller/DcMeteorologicalDetectorController.java diff --git a/zc-business/src/main/java/com/zc/business/controller/DcMeteorologicalDetectorController.java b/zc-business/src/main/java/com/zc/business/controller/DcMeteorologicalDetectorController.java new file mode 100644 index 00000000..7fcfdea9 --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/controller/DcMeteorologicalDetectorController.java @@ -0,0 +1,42 @@ +package com.zc.business.controller; + +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.page.TableDataInfo; +import com.zc.business.domain.DcEvent; +import com.zc.business.domain.DcMeteorologicalDetectorData; +import com.zc.business.service.IDcEventService; +import com.zc.business.service.IDcMeteorologicalDetectorDataService; +import com.zc.business.service.impl.DcMeteorologicalDetectorDataServiceImpl; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + * + */ +@Api(tags = "气象设备") +@RestController +@RequestMapping("/dc/system/meteorologicalDetector") +public class DcMeteorologicalDetectorController extends BaseController { + @Autowired + private IDcMeteorologicalDetectorDataService dcMeteorologicalDetectorDataService; + + @ApiOperation("统计气象设备信息列表") + @GetMapping("/{deviceName}") + public TableDataInfo list(@PathVariable("deviceName") String deviceName) + { + List> list = dcMeteorologicalDetectorDataService.selectStatistics(deviceName); + return getDataTable(list); + } + @ApiOperation("统计气象设备当天最新信息列表") + @GetMapping("/listLatest") + public TableDataInfo listAll(DcMeteorologicalDetectorData dcMeteorologicalDetectorData) + { + List list = dcMeteorologicalDetectorDataService.selectlistAll(dcMeteorologicalDetectorData); + return getDataTable(list); + } +} From 82fc1b0f9d35d7e4510f8af1d27a376bd33b70cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=B4=E7=90=B3?= <1911390090@qq.com> Date: Thu, 28 Mar 2024 15:56:34 +0800 Subject: [PATCH 20/27] =?UTF-8?q?=E6=B0=94=E8=B1=A1=E6=A3=80=E8=AE=BE?= =?UTF-8?q?=E5=A4=87map?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DcMeteorologicalDetectorDataMapper.xml | 48 +++++++++++-------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/zc-business/src/main/resources/mapper/business/DcMeteorologicalDetectorDataMapper.xml b/zc-business/src/main/resources/mapper/business/DcMeteorologicalDetectorDataMapper.xml index 38a3de69..5a30cf63 100644 --- a/zc-business/src/main/resources/mapper/business/DcMeteorologicalDetectorDataMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcMeteorologicalDetectorDataMapper.xml @@ -173,31 +173,37 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - WITH hours AS ( - SELECT h AS time_slot - FROM ( - SELECT 0 AS h UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 - UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 - UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 UNION ALL SELECT 13 - UNION ALL SELECT 14 UNION ALL SELECT 15 UNION ALL SELECT 16 UNION ALL SELECT 17 - UNION ALL SELECT 18 UNION ALL SELECT 19 UNION ALL SELECT 20 UNION ALL SELECT 21 - UNION ALL SELECT 22 UNION ALL SELECT 23 - ) AS all_hours - ) SELECT h.time_slot, DATE(dc.create_time) AS date, COALESCE(ROUND(AVG(dc.temperature), 2), 0) AS avg_temperature, COALESCE(ROUND(AVG(dc.visibility), 2), 0) AS avg_visibility FROM - hours h + ( + SELECT 0 AS time_slot UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 + UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 + UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 UNION ALL SELECT 13 + UNION ALL SELECT 14 UNION ALL SELECT 15 UNION ALL SELECT 16 UNION ALL SELECT 17 + UNION ALL SELECT 18 UNION ALL SELECT 19 UNION ALL SELECT 20 UNION ALL SELECT 21 + UNION ALL SELECT 22 UNION ALL SELECT 23 + ) AS h LEFT JOIN dc_meteorological_detector_data dc ON From 97a45da9011f4e2dc32875f852b2199108a24f80 Mon Sep 17 00:00:00 2001 From: wangsixiang <2970484253@qq.com> Date: Fri, 29 Mar 2024 10:34:18 +0800 Subject: [PATCH 22/27] =?UTF-8?q?=E5=80=BC=E7=8F=AD=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/business/DcWarningMapper.xml | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/zc-business/src/main/resources/mapper/business/DcWarningMapper.xml b/zc-business/src/main/resources/mapper/business/DcWarningMapper.xml index 71b2db5a..fe629ad5 100644 --- a/zc-business/src/main/resources/mapper/business/DcWarningMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcWarningMapper.xml @@ -77,8 +77,28 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" warning.`warning_type`,warning.`warning_subclass`,warning.`warning_title`, warning.`other_config` FROM dc_warning AS warning LEFT JOIN dc_stake_mark AS mark ON mark.stake_mark=warning.stake_mark - where warning.warning_source !=6 - + + and warning.warning_source !=6 + and warning.warning_source = #{warningSource} + and warning.warning_state = #{warningState} + and warning.warning_type = #{warningType} + and warning.warning_subclass = + #{warningSubclass} + + and warning.direction = #{direction} + and warning.stake_mark = #{stakeMark} + + and warning.warning_time between #{startTime} and #{completeTime} + + + and CAST(SUBSTRING(SUBSTRING_INDEX(warning.stake_mark,'+',1),2)AS UNSIGNED)*1000 + +CAST(SUBSTRING_INDEX(warning.stake_mark, '+', -1) AS UNSIGNED)>#{startStakeMark} + + + and CAST(SUBSTRING(SUBSTRING_INDEX(warning.stake_mark,'+',1),2)AS UNSIGNED)*1000 + +CAST(SUBSTRING_INDEX(warning.stake_mark, '+', -1) AS UNSIGNED)<#{endStakeMark} + + From 8c08291ebf736ff034dc777c3895bbcdd5797bb7 Mon Sep 17 00:00:00 2001 From: zhaoxianglong Date: Fri, 29 Mar 2024 13:39:41 +0800 Subject: [PATCH 23/27] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/business/StatusMapper.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/zc-business/src/main/resources/mapper/business/StatusMapper.xml b/zc-business/src/main/resources/mapper/business/StatusMapper.xml index 9cf01288..388f6b57 100644 --- a/zc-business/src/main/resources/mapper/business/StatusMapper.xml +++ b/zc-business/src/main/resources/mapper/business/StatusMapper.xml @@ -96,9 +96,9 @@ ELSE '双向' END AS direction, CASE - WHEN s.device_status = 1 THEN '正常' - WHEN s.device_status = 0 THEN '异常' - ELSE '双向' + WHEN s.device_status = 1 THEN '在线' + WHEN s.device_status = 0 THEN '离线' + ELSE '设备未接入' END AS device_status from dc_device d LEFT JOIN status s on (s.device_id = d.id) From ada22920bb42577c59bfe96ad8f7a8abc6bef040 Mon Sep 17 00:00:00 2001 From: wangsixiang <2970484253@qq.com> Date: Sat, 30 Mar 2024 09:07:57 +0800 Subject: [PATCH 24/27] =?UTF-8?q?=E5=91=8A=E8=AD=A6=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/business/DcWarningMapper.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zc-business/src/main/resources/mapper/business/DcWarningMapper.xml b/zc-business/src/main/resources/mapper/business/DcWarningMapper.xml index fe629ad5..9aa85077 100644 --- a/zc-business/src/main/resources/mapper/business/DcWarningMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcWarningMapper.xml @@ -70,13 +70,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/zc-business/src/main/resources/wordTemplate/chartTemplate.docx b/zc-business/src/main/resources/wordTemplate/chartTemplate.docx new file mode 100644 index 0000000000000000000000000000000000000000..2f9a8f6510de6f4a5c7f790c4b888573ade6fe8f GIT binary patch literal 71251 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 literal 0 HcmV?d00001 diff --git a/zc-business/src/main/resources/wordTemplate/chartTemplate2.docx b/zc-business/src/main/resources/wordTemplate/chartTemplate2.docx new file mode 100644 index 0000000000000000000000000000000000000000..c0a398ea1337f0caef0ac34a06baf44ac98acbcb GIT binary patch literal 28097 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 Xczg+tqB6XJJfEmV+K%p7pCkScqOE;K literal 0 HcmV?d00001 diff --git a/zc-business/src/main/resources/wordTemplate/wordTemplate.docx b/zc-business/src/main/resources/wordTemplate/wordTemplate.docx new file mode 100644 index 0000000000000000000000000000000000000000..5c48a30b7e1253872a38144bb66ee52689f23431 GIT binary patch literal 16605 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 literal 0 HcmV?d00001 From 1c1000465ecf30c2e66cf2fd5ea6d98c303055ed Mon Sep 17 00:00:00 2001 From: lau572 <1010031226@qq.com> Date: Sat, 30 Mar 2024 17:44:47 +0800 Subject: [PATCH 27/27] =?UTF-8?q?=E9=89=B4=E6=9D=83=E8=8E=B7=E5=8F=96ip?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/ruoyi/framework/config/SecurityConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java index 9d288e65..046648e7 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java @@ -69,7 +69,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override public boolean matches(HttpServletRequest request) { // 获取请求的IP - String requestIP = request.getRemoteAddr(); + String requestIP = request.getHeader("X-Forwarded-For"); // 将配置文件中的IP字符串分割为数组 String[] ips = allowedIPs.split(","); // 检查请求的IP是否在允许的IP数组中