diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java new file mode 100644 index 0000000..88baf61 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java @@ -0,0 +1,174 @@ +package com.casic.missiles.cache; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.model.Device; +import com.casic.missiles.model.DeviceData; +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.pojo.ProcessEventTask; +import com.casic.missiles.service.IDeviceDataService; +import com.casic.missiles.service.impl.DeviceDataServiceImpl; +import com.casic.missiles.util.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 流程节点事件监听器 + */ +public class ProtocolProcessEventListener { + + private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); + + /** + * 异步生成缓存 + * + * @param processEventTask + */ + public static void asynAddTask(ProcessEventTask processEventTask) { + if (StringUtils.isNotEmpty(processEventTask.getDevcode())) { + GuavaCacheUtil.putCache(processEventTask.getDevcode(), processEventTask); + } + } + + /** + * 异步设置缓存 + * + * @param key + * @param json + */ + public static void setTask(String key, Object json, Integer node) { + //如果key为空,则直接返回 + if (StringUtils.isEmpty(key) || ObjectUtil.isEmpty(json)) { + return; + } + ProcessEventTask processEventTask = null; + switch (node) { + //解密前的数据 + case 1: + //如果为空可以补救 +// if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { +// processEventTask = ProcessEventTask.builder() +// .devcode(key) +// .decryptSoureData((String) json) +// .decryptBeforeData((String) json) +// .build(); +// asynAddTask(processEventTask); +// } else { +// processEventTask.setDecryptBeforeData((String) json); +// } +// break; + //解密后的数据 + case 2: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .decryptAfterData((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setDecryptAfterData((String) json); + } + break; + //解析的数据 + case 3: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .bizDataList((List) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setBizDataList((List) json); + } + break; + case 4: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .exceptionMsg((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setExceptionMsg((String) json); + } + break; + default: + return; + } + } + + /** + * 异步设置缓存 + * + * @param key + */ + public static ProcessEventTask getTask(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + return (ProcessEventTask) GuavaCacheUtil.getCache(key); + } + + /** + * 存库操作 + * + * @param devcode + */ + public static void saveData(String devcode, ParseResult result) { + //添加到线程池执行,异步存库 + threadPool.execute( + () -> { + ProcessEventTask processEventTask; + if (ObjectUtil.isNotEmpty(getTask(devcode))) { + synchronized (processEventTask = getTask(devcode)) { + IDeviceDataService deviceDataService = SpringContextUtil.getBean(DeviceDataServiceImpl.class); + if (ObjectUtil.isNotEmpty(processEventTask)) { + List deviceDataList = new ArrayList<>(); + for (Map BizDataMap : processEventTask.getBizDataList()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDevcode(processEventTask.getDevcode()); + deviceData.setDeviceType((Integer) BizDataMap.get("deviceType")); + deviceData.setUptime((String) BizDataMap.get("uptime")); + deviceData.setLogtime(new Date()); + deviceData.setDataJson(JSON.toJSONString(BizDataMap)); + deviceData.setDecryptBeforeData(processEventTask.getDecryptSoureData()); + deviceData.setDecryptAfterData(processEventTask.getDecryptAfterData()); + if (BizDataMap.containsKey("cell")) { + //电量不一定每次都有 + deviceData.setCell((Integer) BizDataMap.get("cell")); + } + if (BizDataMap.containsKey("dataValue")) { + //电量不一定每次都有 + deviceData.setDataValue((float) BizDataMap.get("dataValue")); + } + deviceData.setExceptionMsg(processEventTask.getExceptionMsg()); + deviceDataList.add(deviceData); + } + //批量保存 + deviceDataService.saveBatch(deviceDataList); + } + } + //移除缓存 + GuavaCacheUtil.remove(devcode); + } + } + ); + } + + //暂时不做设备的更新 + public void setDevice(String status) { + Device device = new Device(); + } + +} diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java new file mode 100644 index 0000000..88baf61 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java @@ -0,0 +1,174 @@ +package com.casic.missiles.cache; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.model.Device; +import com.casic.missiles.model.DeviceData; +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.pojo.ProcessEventTask; +import com.casic.missiles.service.IDeviceDataService; +import com.casic.missiles.service.impl.DeviceDataServiceImpl; +import com.casic.missiles.util.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 流程节点事件监听器 + */ +public class ProtocolProcessEventListener { + + private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); + + /** + * 异步生成缓存 + * + * @param processEventTask + */ + public static void asynAddTask(ProcessEventTask processEventTask) { + if (StringUtils.isNotEmpty(processEventTask.getDevcode())) { + GuavaCacheUtil.putCache(processEventTask.getDevcode(), processEventTask); + } + } + + /** + * 异步设置缓存 + * + * @param key + * @param json + */ + public static void setTask(String key, Object json, Integer node) { + //如果key为空,则直接返回 + if (StringUtils.isEmpty(key) || ObjectUtil.isEmpty(json)) { + return; + } + ProcessEventTask processEventTask = null; + switch (node) { + //解密前的数据 + case 1: + //如果为空可以补救 +// if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { +// processEventTask = ProcessEventTask.builder() +// .devcode(key) +// .decryptSoureData((String) json) +// .decryptBeforeData((String) json) +// .build(); +// asynAddTask(processEventTask); +// } else { +// processEventTask.setDecryptBeforeData((String) json); +// } +// break; + //解密后的数据 + case 2: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .decryptAfterData((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setDecryptAfterData((String) json); + } + break; + //解析的数据 + case 3: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .bizDataList((List) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setBizDataList((List) json); + } + break; + case 4: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .exceptionMsg((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setExceptionMsg((String) json); + } + break; + default: + return; + } + } + + /** + * 异步设置缓存 + * + * @param key + */ + public static ProcessEventTask getTask(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + return (ProcessEventTask) GuavaCacheUtil.getCache(key); + } + + /** + * 存库操作 + * + * @param devcode + */ + public static void saveData(String devcode, ParseResult result) { + //添加到线程池执行,异步存库 + threadPool.execute( + () -> { + ProcessEventTask processEventTask; + if (ObjectUtil.isNotEmpty(getTask(devcode))) { + synchronized (processEventTask = getTask(devcode)) { + IDeviceDataService deviceDataService = SpringContextUtil.getBean(DeviceDataServiceImpl.class); + if (ObjectUtil.isNotEmpty(processEventTask)) { + List deviceDataList = new ArrayList<>(); + for (Map BizDataMap : processEventTask.getBizDataList()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDevcode(processEventTask.getDevcode()); + deviceData.setDeviceType((Integer) BizDataMap.get("deviceType")); + deviceData.setUptime((String) BizDataMap.get("uptime")); + deviceData.setLogtime(new Date()); + deviceData.setDataJson(JSON.toJSONString(BizDataMap)); + deviceData.setDecryptBeforeData(processEventTask.getDecryptSoureData()); + deviceData.setDecryptAfterData(processEventTask.getDecryptAfterData()); + if (BizDataMap.containsKey("cell")) { + //电量不一定每次都有 + deviceData.setCell((Integer) BizDataMap.get("cell")); + } + if (BizDataMap.containsKey("dataValue")) { + //电量不一定每次都有 + deviceData.setDataValue((float) BizDataMap.get("dataValue")); + } + deviceData.setExceptionMsg(processEventTask.getExceptionMsg()); + deviceDataList.add(deviceData); + } + //批量保存 + deviceDataService.saveBatch(deviceDataList); + } + } + //移除缓存 + GuavaCacheUtil.remove(devcode); + } + } + ); + } + + //暂时不做设备的更新 + public void setDevice(String status) { + Device device = new Device(); + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java deleted file mode 100644 index 2f9c711..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.cache; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - - -public class listenerEvent { - - private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, - TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); - - /** - * 异步生成缓存 - * - * @param key - * @param json - */ - public void asynCreateLogCache(String key, String json) { - - - } - - -} diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java new file mode 100644 index 0000000..88baf61 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java @@ -0,0 +1,174 @@ +package com.casic.missiles.cache; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.model.Device; +import com.casic.missiles.model.DeviceData; +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.pojo.ProcessEventTask; +import com.casic.missiles.service.IDeviceDataService; +import com.casic.missiles.service.impl.DeviceDataServiceImpl; +import com.casic.missiles.util.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 流程节点事件监听器 + */ +public class ProtocolProcessEventListener { + + private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); + + /** + * 异步生成缓存 + * + * @param processEventTask + */ + public static void asynAddTask(ProcessEventTask processEventTask) { + if (StringUtils.isNotEmpty(processEventTask.getDevcode())) { + GuavaCacheUtil.putCache(processEventTask.getDevcode(), processEventTask); + } + } + + /** + * 异步设置缓存 + * + * @param key + * @param json + */ + public static void setTask(String key, Object json, Integer node) { + //如果key为空,则直接返回 + if (StringUtils.isEmpty(key) || ObjectUtil.isEmpty(json)) { + return; + } + ProcessEventTask processEventTask = null; + switch (node) { + //解密前的数据 + case 1: + //如果为空可以补救 +// if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { +// processEventTask = ProcessEventTask.builder() +// .devcode(key) +// .decryptSoureData((String) json) +// .decryptBeforeData((String) json) +// .build(); +// asynAddTask(processEventTask); +// } else { +// processEventTask.setDecryptBeforeData((String) json); +// } +// break; + //解密后的数据 + case 2: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .decryptAfterData((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setDecryptAfterData((String) json); + } + break; + //解析的数据 + case 3: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .bizDataList((List) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setBizDataList((List) json); + } + break; + case 4: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .exceptionMsg((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setExceptionMsg((String) json); + } + break; + default: + return; + } + } + + /** + * 异步设置缓存 + * + * @param key + */ + public static ProcessEventTask getTask(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + return (ProcessEventTask) GuavaCacheUtil.getCache(key); + } + + /** + * 存库操作 + * + * @param devcode + */ + public static void saveData(String devcode, ParseResult result) { + //添加到线程池执行,异步存库 + threadPool.execute( + () -> { + ProcessEventTask processEventTask; + if (ObjectUtil.isNotEmpty(getTask(devcode))) { + synchronized (processEventTask = getTask(devcode)) { + IDeviceDataService deviceDataService = SpringContextUtil.getBean(DeviceDataServiceImpl.class); + if (ObjectUtil.isNotEmpty(processEventTask)) { + List deviceDataList = new ArrayList<>(); + for (Map BizDataMap : processEventTask.getBizDataList()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDevcode(processEventTask.getDevcode()); + deviceData.setDeviceType((Integer) BizDataMap.get("deviceType")); + deviceData.setUptime((String) BizDataMap.get("uptime")); + deviceData.setLogtime(new Date()); + deviceData.setDataJson(JSON.toJSONString(BizDataMap)); + deviceData.setDecryptBeforeData(processEventTask.getDecryptSoureData()); + deviceData.setDecryptAfterData(processEventTask.getDecryptAfterData()); + if (BizDataMap.containsKey("cell")) { + //电量不一定每次都有 + deviceData.setCell((Integer) BizDataMap.get("cell")); + } + if (BizDataMap.containsKey("dataValue")) { + //电量不一定每次都有 + deviceData.setDataValue((float) BizDataMap.get("dataValue")); + } + deviceData.setExceptionMsg(processEventTask.getExceptionMsg()); + deviceDataList.add(deviceData); + } + //批量保存 + deviceDataService.saveBatch(deviceDataList); + } + } + //移除缓存 + GuavaCacheUtil.remove(devcode); + } + } + ); + } + + //暂时不做设备的更新 + public void setDevice(String status) { + Device device = new Device(); + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java deleted file mode 100644 index 2f9c711..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.cache; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - - -public class listenerEvent { - - private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, - TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); - - /** - * 异步生成缓存 - * - * @param key - * @param json - */ - public void asynCreateLogCache(String key, String json) { - - - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 4e6beea..01b20f5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.cache.GuavaCacheUtil; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; import com.casic.missiles.exception.EngineException; @@ -56,12 +56,16 @@ } ParseResult result = null; + String devcode = null; try { //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + devcode = (String) parseFixedDataMap.get("devcode"); // 通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); + RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); if (ObjectUtil.isEmpty(ruleConfig)) { + //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); byteBuf.readBytes(protocolConfig.getPreFix().length()); @@ -94,10 +98,14 @@ } //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); - log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); + //解密前的报文 + log.debug("解析的密文是----------" + ByteBufUtil.hexDump(bizDataByteBuf)); +// ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(bizDataByteBuf), 1); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); - log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + //解密后报文 //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); @@ -112,16 +120,19 @@ for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); } - //数据发送,异步 + ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); + //存储数据 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - result=null; + //数据发送,异步,异常拦截 + ProtocolProcessEventListener.setTask(devcode, rex.getMessage(), 4); + result = null; frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); - }finally { -// GuavaCacheUtil.putCache("licValid",validLicResult); -// ValidateResult validLicResult = (ValidateResult) GuavaCacheUtil.getCache("licValid"); + } finally { + //数据发送,异步,转存整体数据 + ProtocolProcessEventListener.saveData(devcode, result); return result; } } diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java new file mode 100644 index 0000000..88baf61 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java @@ -0,0 +1,174 @@ +package com.casic.missiles.cache; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.model.Device; +import com.casic.missiles.model.DeviceData; +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.pojo.ProcessEventTask; +import com.casic.missiles.service.IDeviceDataService; +import com.casic.missiles.service.impl.DeviceDataServiceImpl; +import com.casic.missiles.util.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 流程节点事件监听器 + */ +public class ProtocolProcessEventListener { + + private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); + + /** + * 异步生成缓存 + * + * @param processEventTask + */ + public static void asynAddTask(ProcessEventTask processEventTask) { + if (StringUtils.isNotEmpty(processEventTask.getDevcode())) { + GuavaCacheUtil.putCache(processEventTask.getDevcode(), processEventTask); + } + } + + /** + * 异步设置缓存 + * + * @param key + * @param json + */ + public static void setTask(String key, Object json, Integer node) { + //如果key为空,则直接返回 + if (StringUtils.isEmpty(key) || ObjectUtil.isEmpty(json)) { + return; + } + ProcessEventTask processEventTask = null; + switch (node) { + //解密前的数据 + case 1: + //如果为空可以补救 +// if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { +// processEventTask = ProcessEventTask.builder() +// .devcode(key) +// .decryptSoureData((String) json) +// .decryptBeforeData((String) json) +// .build(); +// asynAddTask(processEventTask); +// } else { +// processEventTask.setDecryptBeforeData((String) json); +// } +// break; + //解密后的数据 + case 2: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .decryptAfterData((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setDecryptAfterData((String) json); + } + break; + //解析的数据 + case 3: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .bizDataList((List) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setBizDataList((List) json); + } + break; + case 4: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .exceptionMsg((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setExceptionMsg((String) json); + } + break; + default: + return; + } + } + + /** + * 异步设置缓存 + * + * @param key + */ + public static ProcessEventTask getTask(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + return (ProcessEventTask) GuavaCacheUtil.getCache(key); + } + + /** + * 存库操作 + * + * @param devcode + */ + public static void saveData(String devcode, ParseResult result) { + //添加到线程池执行,异步存库 + threadPool.execute( + () -> { + ProcessEventTask processEventTask; + if (ObjectUtil.isNotEmpty(getTask(devcode))) { + synchronized (processEventTask = getTask(devcode)) { + IDeviceDataService deviceDataService = SpringContextUtil.getBean(DeviceDataServiceImpl.class); + if (ObjectUtil.isNotEmpty(processEventTask)) { + List deviceDataList = new ArrayList<>(); + for (Map BizDataMap : processEventTask.getBizDataList()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDevcode(processEventTask.getDevcode()); + deviceData.setDeviceType((Integer) BizDataMap.get("deviceType")); + deviceData.setUptime((String) BizDataMap.get("uptime")); + deviceData.setLogtime(new Date()); + deviceData.setDataJson(JSON.toJSONString(BizDataMap)); + deviceData.setDecryptBeforeData(processEventTask.getDecryptSoureData()); + deviceData.setDecryptAfterData(processEventTask.getDecryptAfterData()); + if (BizDataMap.containsKey("cell")) { + //电量不一定每次都有 + deviceData.setCell((Integer) BizDataMap.get("cell")); + } + if (BizDataMap.containsKey("dataValue")) { + //电量不一定每次都有 + deviceData.setDataValue((float) BizDataMap.get("dataValue")); + } + deviceData.setExceptionMsg(processEventTask.getExceptionMsg()); + deviceDataList.add(deviceData); + } + //批量保存 + deviceDataService.saveBatch(deviceDataList); + } + } + //移除缓存 + GuavaCacheUtil.remove(devcode); + } + } + ); + } + + //暂时不做设备的更新 + public void setDevice(String status) { + Device device = new Device(); + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java deleted file mode 100644 index 2f9c711..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.cache; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - - -public class listenerEvent { - - private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, - TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); - - /** - * 异步生成缓存 - * - * @param key - * @param json - */ - public void asynCreateLogCache(String key, String json) { - - - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 4e6beea..01b20f5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.cache.GuavaCacheUtil; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; import com.casic.missiles.exception.EngineException; @@ -56,12 +56,16 @@ } ParseResult result = null; + String devcode = null; try { //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + devcode = (String) parseFixedDataMap.get("devcode"); // 通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); + RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); if (ObjectUtil.isEmpty(ruleConfig)) { + //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); byteBuf.readBytes(protocolConfig.getPreFix().length()); @@ -94,10 +98,14 @@ } //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); - log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); + //解密前的报文 + log.debug("解析的密文是----------" + ByteBufUtil.hexDump(bizDataByteBuf)); +// ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(bizDataByteBuf), 1); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); - log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + //解密后报文 //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); @@ -112,16 +120,19 @@ for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); } - //数据发送,异步 + ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); + //存储数据 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - result=null; + //数据发送,异步,异常拦截 + ProtocolProcessEventListener.setTask(devcode, rex.getMessage(), 4); + result = null; frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); - }finally { -// GuavaCacheUtil.putCache("licValid",validLicResult); -// ValidateResult validLicResult = (ValidateResult) GuavaCacheUtil.getCache("licValid"); + } finally { + //数据发送,异步,转存整体数据 + ProtocolProcessEventListener.saveData(devcode, result); return result; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 8af55a6..e4a79ae 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -1,10 +1,13 @@ package com.casic.missiles.parser; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; +import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; @@ -12,6 +15,7 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -25,10 +29,28 @@ public class ProtocolParserSupport { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; + } + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + //打印源数据,设备编号 + ProcessEventTask processEventTask = ProcessEventTask.builder() + .devcode((String) parseFixedDataMap.get("devcode")) + .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte)) + .build(); + ProtocolProcessEventListener.asynAddTask(processEventTask); + return parseFixedDataMap; + } + /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -39,10 +61,8 @@ } String rulePrepareFields = protocolConfig.getRulePrepareFields(); //固定字段 - if (StringUtils.isNotEmpty(rulePrepareFields)) { - //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + if (StringUtils.isNotEmpty(rulePrepareFields) && ObjectUtil.isNotEmpty(parseFixedDataMap)) { + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap)); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java new file mode 100644 index 0000000..88baf61 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java @@ -0,0 +1,174 @@ +package com.casic.missiles.cache; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.model.Device; +import com.casic.missiles.model.DeviceData; +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.pojo.ProcessEventTask; +import com.casic.missiles.service.IDeviceDataService; +import com.casic.missiles.service.impl.DeviceDataServiceImpl; +import com.casic.missiles.util.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 流程节点事件监听器 + */ +public class ProtocolProcessEventListener { + + private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); + + /** + * 异步生成缓存 + * + * @param processEventTask + */ + public static void asynAddTask(ProcessEventTask processEventTask) { + if (StringUtils.isNotEmpty(processEventTask.getDevcode())) { + GuavaCacheUtil.putCache(processEventTask.getDevcode(), processEventTask); + } + } + + /** + * 异步设置缓存 + * + * @param key + * @param json + */ + public static void setTask(String key, Object json, Integer node) { + //如果key为空,则直接返回 + if (StringUtils.isEmpty(key) || ObjectUtil.isEmpty(json)) { + return; + } + ProcessEventTask processEventTask = null; + switch (node) { + //解密前的数据 + case 1: + //如果为空可以补救 +// if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { +// processEventTask = ProcessEventTask.builder() +// .devcode(key) +// .decryptSoureData((String) json) +// .decryptBeforeData((String) json) +// .build(); +// asynAddTask(processEventTask); +// } else { +// processEventTask.setDecryptBeforeData((String) json); +// } +// break; + //解密后的数据 + case 2: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .decryptAfterData((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setDecryptAfterData((String) json); + } + break; + //解析的数据 + case 3: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .bizDataList((List) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setBizDataList((List) json); + } + break; + case 4: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .exceptionMsg((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setExceptionMsg((String) json); + } + break; + default: + return; + } + } + + /** + * 异步设置缓存 + * + * @param key + */ + public static ProcessEventTask getTask(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + return (ProcessEventTask) GuavaCacheUtil.getCache(key); + } + + /** + * 存库操作 + * + * @param devcode + */ + public static void saveData(String devcode, ParseResult result) { + //添加到线程池执行,异步存库 + threadPool.execute( + () -> { + ProcessEventTask processEventTask; + if (ObjectUtil.isNotEmpty(getTask(devcode))) { + synchronized (processEventTask = getTask(devcode)) { + IDeviceDataService deviceDataService = SpringContextUtil.getBean(DeviceDataServiceImpl.class); + if (ObjectUtil.isNotEmpty(processEventTask)) { + List deviceDataList = new ArrayList<>(); + for (Map BizDataMap : processEventTask.getBizDataList()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDevcode(processEventTask.getDevcode()); + deviceData.setDeviceType((Integer) BizDataMap.get("deviceType")); + deviceData.setUptime((String) BizDataMap.get("uptime")); + deviceData.setLogtime(new Date()); + deviceData.setDataJson(JSON.toJSONString(BizDataMap)); + deviceData.setDecryptBeforeData(processEventTask.getDecryptSoureData()); + deviceData.setDecryptAfterData(processEventTask.getDecryptAfterData()); + if (BizDataMap.containsKey("cell")) { + //电量不一定每次都有 + deviceData.setCell((Integer) BizDataMap.get("cell")); + } + if (BizDataMap.containsKey("dataValue")) { + //电量不一定每次都有 + deviceData.setDataValue((float) BizDataMap.get("dataValue")); + } + deviceData.setExceptionMsg(processEventTask.getExceptionMsg()); + deviceDataList.add(deviceData); + } + //批量保存 + deviceDataService.saveBatch(deviceDataList); + } + } + //移除缓存 + GuavaCacheUtil.remove(devcode); + } + } + ); + } + + //暂时不做设备的更新 + public void setDevice(String status) { + Device device = new Device(); + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java deleted file mode 100644 index 2f9c711..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.cache; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - - -public class listenerEvent { - - private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, - TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); - - /** - * 异步生成缓存 - * - * @param key - * @param json - */ - public void asynCreateLogCache(String key, String json) { - - - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 4e6beea..01b20f5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.cache.GuavaCacheUtil; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; import com.casic.missiles.exception.EngineException; @@ -56,12 +56,16 @@ } ParseResult result = null; + String devcode = null; try { //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + devcode = (String) parseFixedDataMap.get("devcode"); // 通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); + RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); if (ObjectUtil.isEmpty(ruleConfig)) { + //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); byteBuf.readBytes(protocolConfig.getPreFix().length()); @@ -94,10 +98,14 @@ } //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); - log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); + //解密前的报文 + log.debug("解析的密文是----------" + ByteBufUtil.hexDump(bizDataByteBuf)); +// ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(bizDataByteBuf), 1); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); - log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + //解密后报文 //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); @@ -112,16 +120,19 @@ for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); } - //数据发送,异步 + ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); + //存储数据 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - result=null; + //数据发送,异步,异常拦截 + ProtocolProcessEventListener.setTask(devcode, rex.getMessage(), 4); + result = null; frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); - }finally { -// GuavaCacheUtil.putCache("licValid",validLicResult); -// ValidateResult validLicResult = (ValidateResult) GuavaCacheUtil.getCache("licValid"); + } finally { + //数据发送,异步,转存整体数据 + ProtocolProcessEventListener.saveData(devcode, result); return result; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 8af55a6..e4a79ae 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -1,10 +1,13 @@ package com.casic.missiles.parser; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; +import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; @@ -12,6 +15,7 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -25,10 +29,28 @@ public class ProtocolParserSupport { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; + } + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + //打印源数据,设备编号 + ProcessEventTask processEventTask = ProcessEventTask.builder() + .devcode((String) parseFixedDataMap.get("devcode")) + .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte)) + .build(); + ProtocolProcessEventListener.asynAddTask(processEventTask); + return parseFixedDataMap; + } + /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -39,10 +61,8 @@ } String rulePrepareFields = protocolConfig.getRulePrepareFields(); //固定字段 - if (StringUtils.isNotEmpty(rulePrepareFields)) { - //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + if (StringUtils.isNotEmpty(rulePrepareFields) && ObjectUtil.isNotEmpty(parseFixedDataMap)) { + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap)); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index b162def..9c413ed 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,13 +1,13 @@ package com.casic.missiles.parser.matcher; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.*; diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java new file mode 100644 index 0000000..88baf61 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java @@ -0,0 +1,174 @@ +package com.casic.missiles.cache; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.model.Device; +import com.casic.missiles.model.DeviceData; +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.pojo.ProcessEventTask; +import com.casic.missiles.service.IDeviceDataService; +import com.casic.missiles.service.impl.DeviceDataServiceImpl; +import com.casic.missiles.util.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 流程节点事件监听器 + */ +public class ProtocolProcessEventListener { + + private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); + + /** + * 异步生成缓存 + * + * @param processEventTask + */ + public static void asynAddTask(ProcessEventTask processEventTask) { + if (StringUtils.isNotEmpty(processEventTask.getDevcode())) { + GuavaCacheUtil.putCache(processEventTask.getDevcode(), processEventTask); + } + } + + /** + * 异步设置缓存 + * + * @param key + * @param json + */ + public static void setTask(String key, Object json, Integer node) { + //如果key为空,则直接返回 + if (StringUtils.isEmpty(key) || ObjectUtil.isEmpty(json)) { + return; + } + ProcessEventTask processEventTask = null; + switch (node) { + //解密前的数据 + case 1: + //如果为空可以补救 +// if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { +// processEventTask = ProcessEventTask.builder() +// .devcode(key) +// .decryptSoureData((String) json) +// .decryptBeforeData((String) json) +// .build(); +// asynAddTask(processEventTask); +// } else { +// processEventTask.setDecryptBeforeData((String) json); +// } +// break; + //解密后的数据 + case 2: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .decryptAfterData((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setDecryptAfterData((String) json); + } + break; + //解析的数据 + case 3: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .bizDataList((List) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setBizDataList((List) json); + } + break; + case 4: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .exceptionMsg((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setExceptionMsg((String) json); + } + break; + default: + return; + } + } + + /** + * 异步设置缓存 + * + * @param key + */ + public static ProcessEventTask getTask(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + return (ProcessEventTask) GuavaCacheUtil.getCache(key); + } + + /** + * 存库操作 + * + * @param devcode + */ + public static void saveData(String devcode, ParseResult result) { + //添加到线程池执行,异步存库 + threadPool.execute( + () -> { + ProcessEventTask processEventTask; + if (ObjectUtil.isNotEmpty(getTask(devcode))) { + synchronized (processEventTask = getTask(devcode)) { + IDeviceDataService deviceDataService = SpringContextUtil.getBean(DeviceDataServiceImpl.class); + if (ObjectUtil.isNotEmpty(processEventTask)) { + List deviceDataList = new ArrayList<>(); + for (Map BizDataMap : processEventTask.getBizDataList()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDevcode(processEventTask.getDevcode()); + deviceData.setDeviceType((Integer) BizDataMap.get("deviceType")); + deviceData.setUptime((String) BizDataMap.get("uptime")); + deviceData.setLogtime(new Date()); + deviceData.setDataJson(JSON.toJSONString(BizDataMap)); + deviceData.setDecryptBeforeData(processEventTask.getDecryptSoureData()); + deviceData.setDecryptAfterData(processEventTask.getDecryptAfterData()); + if (BizDataMap.containsKey("cell")) { + //电量不一定每次都有 + deviceData.setCell((Integer) BizDataMap.get("cell")); + } + if (BizDataMap.containsKey("dataValue")) { + //电量不一定每次都有 + deviceData.setDataValue((float) BizDataMap.get("dataValue")); + } + deviceData.setExceptionMsg(processEventTask.getExceptionMsg()); + deviceDataList.add(deviceData); + } + //批量保存 + deviceDataService.saveBatch(deviceDataList); + } + } + //移除缓存 + GuavaCacheUtil.remove(devcode); + } + } + ); + } + + //暂时不做设备的更新 + public void setDevice(String status) { + Device device = new Device(); + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java deleted file mode 100644 index 2f9c711..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.cache; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - - -public class listenerEvent { - - private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, - TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); - - /** - * 异步生成缓存 - * - * @param key - * @param json - */ - public void asynCreateLogCache(String key, String json) { - - - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 4e6beea..01b20f5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.cache.GuavaCacheUtil; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; import com.casic.missiles.exception.EngineException; @@ -56,12 +56,16 @@ } ParseResult result = null; + String devcode = null; try { //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + devcode = (String) parseFixedDataMap.get("devcode"); // 通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); + RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); if (ObjectUtil.isEmpty(ruleConfig)) { + //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); byteBuf.readBytes(protocolConfig.getPreFix().length()); @@ -94,10 +98,14 @@ } //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); - log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); + //解密前的报文 + log.debug("解析的密文是----------" + ByteBufUtil.hexDump(bizDataByteBuf)); +// ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(bizDataByteBuf), 1); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); - log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + //解密后报文 //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); @@ -112,16 +120,19 @@ for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); } - //数据发送,异步 + ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); + //存储数据 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - result=null; + //数据发送,异步,异常拦截 + ProtocolProcessEventListener.setTask(devcode, rex.getMessage(), 4); + result = null; frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); - }finally { -// GuavaCacheUtil.putCache("licValid",validLicResult); -// ValidateResult validLicResult = (ValidateResult) GuavaCacheUtil.getCache("licValid"); + } finally { + //数据发送,异步,转存整体数据 + ProtocolProcessEventListener.saveData(devcode, result); return result; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 8af55a6..e4a79ae 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -1,10 +1,13 @@ package com.casic.missiles.parser; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; +import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; @@ -12,6 +15,7 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -25,10 +29,28 @@ public class ProtocolParserSupport { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; + } + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + //打印源数据,设备编号 + ProcessEventTask processEventTask = ProcessEventTask.builder() + .devcode((String) parseFixedDataMap.get("devcode")) + .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte)) + .build(); + ProtocolProcessEventListener.asynAddTask(processEventTask); + return parseFixedDataMap; + } + /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -39,10 +61,8 @@ } String rulePrepareFields = protocolConfig.getRulePrepareFields(); //固定字段 - if (StringUtils.isNotEmpty(rulePrepareFields)) { - //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + if (StringUtils.isNotEmpty(rulePrepareFields) && ObjectUtil.isNotEmpty(parseFixedDataMap)) { + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap)); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index b162def..9c413ed 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,13 +1,13 @@ package com.casic.missiles.parser.matcher; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.*; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 8eb0682..23d1e4c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java new file mode 100644 index 0000000..88baf61 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java @@ -0,0 +1,174 @@ +package com.casic.missiles.cache; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.model.Device; +import com.casic.missiles.model.DeviceData; +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.pojo.ProcessEventTask; +import com.casic.missiles.service.IDeviceDataService; +import com.casic.missiles.service.impl.DeviceDataServiceImpl; +import com.casic.missiles.util.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 流程节点事件监听器 + */ +public class ProtocolProcessEventListener { + + private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); + + /** + * 异步生成缓存 + * + * @param processEventTask + */ + public static void asynAddTask(ProcessEventTask processEventTask) { + if (StringUtils.isNotEmpty(processEventTask.getDevcode())) { + GuavaCacheUtil.putCache(processEventTask.getDevcode(), processEventTask); + } + } + + /** + * 异步设置缓存 + * + * @param key + * @param json + */ + public static void setTask(String key, Object json, Integer node) { + //如果key为空,则直接返回 + if (StringUtils.isEmpty(key) || ObjectUtil.isEmpty(json)) { + return; + } + ProcessEventTask processEventTask = null; + switch (node) { + //解密前的数据 + case 1: + //如果为空可以补救 +// if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { +// processEventTask = ProcessEventTask.builder() +// .devcode(key) +// .decryptSoureData((String) json) +// .decryptBeforeData((String) json) +// .build(); +// asynAddTask(processEventTask); +// } else { +// processEventTask.setDecryptBeforeData((String) json); +// } +// break; + //解密后的数据 + case 2: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .decryptAfterData((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setDecryptAfterData((String) json); + } + break; + //解析的数据 + case 3: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .bizDataList((List) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setBizDataList((List) json); + } + break; + case 4: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .exceptionMsg((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setExceptionMsg((String) json); + } + break; + default: + return; + } + } + + /** + * 异步设置缓存 + * + * @param key + */ + public static ProcessEventTask getTask(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + return (ProcessEventTask) GuavaCacheUtil.getCache(key); + } + + /** + * 存库操作 + * + * @param devcode + */ + public static void saveData(String devcode, ParseResult result) { + //添加到线程池执行,异步存库 + threadPool.execute( + () -> { + ProcessEventTask processEventTask; + if (ObjectUtil.isNotEmpty(getTask(devcode))) { + synchronized (processEventTask = getTask(devcode)) { + IDeviceDataService deviceDataService = SpringContextUtil.getBean(DeviceDataServiceImpl.class); + if (ObjectUtil.isNotEmpty(processEventTask)) { + List deviceDataList = new ArrayList<>(); + for (Map BizDataMap : processEventTask.getBizDataList()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDevcode(processEventTask.getDevcode()); + deviceData.setDeviceType((Integer) BizDataMap.get("deviceType")); + deviceData.setUptime((String) BizDataMap.get("uptime")); + deviceData.setLogtime(new Date()); + deviceData.setDataJson(JSON.toJSONString(BizDataMap)); + deviceData.setDecryptBeforeData(processEventTask.getDecryptSoureData()); + deviceData.setDecryptAfterData(processEventTask.getDecryptAfterData()); + if (BizDataMap.containsKey("cell")) { + //电量不一定每次都有 + deviceData.setCell((Integer) BizDataMap.get("cell")); + } + if (BizDataMap.containsKey("dataValue")) { + //电量不一定每次都有 + deviceData.setDataValue((float) BizDataMap.get("dataValue")); + } + deviceData.setExceptionMsg(processEventTask.getExceptionMsg()); + deviceDataList.add(deviceData); + } + //批量保存 + deviceDataService.saveBatch(deviceDataList); + } + } + //移除缓存 + GuavaCacheUtil.remove(devcode); + } + } + ); + } + + //暂时不做设备的更新 + public void setDevice(String status) { + Device device = new Device(); + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java deleted file mode 100644 index 2f9c711..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.cache; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - - -public class listenerEvent { - - private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, - TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); - - /** - * 异步生成缓存 - * - * @param key - * @param json - */ - public void asynCreateLogCache(String key, String json) { - - - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 4e6beea..01b20f5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.cache.GuavaCacheUtil; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; import com.casic.missiles.exception.EngineException; @@ -56,12 +56,16 @@ } ParseResult result = null; + String devcode = null; try { //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + devcode = (String) parseFixedDataMap.get("devcode"); // 通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); + RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); if (ObjectUtil.isEmpty(ruleConfig)) { + //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); byteBuf.readBytes(protocolConfig.getPreFix().length()); @@ -94,10 +98,14 @@ } //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); - log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); + //解密前的报文 + log.debug("解析的密文是----------" + ByteBufUtil.hexDump(bizDataByteBuf)); +// ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(bizDataByteBuf), 1); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); - log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + //解密后报文 //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); @@ -112,16 +120,19 @@ for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); } - //数据发送,异步 + ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); + //存储数据 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - result=null; + //数据发送,异步,异常拦截 + ProtocolProcessEventListener.setTask(devcode, rex.getMessage(), 4); + result = null; frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); - }finally { -// GuavaCacheUtil.putCache("licValid",validLicResult); -// ValidateResult validLicResult = (ValidateResult) GuavaCacheUtil.getCache("licValid"); + } finally { + //数据发送,异步,转存整体数据 + ProtocolProcessEventListener.saveData(devcode, result); return result; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 8af55a6..e4a79ae 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -1,10 +1,13 @@ package com.casic.missiles.parser; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; +import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; @@ -12,6 +15,7 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -25,10 +29,28 @@ public class ProtocolParserSupport { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; + } + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + //打印源数据,设备编号 + ProcessEventTask processEventTask = ProcessEventTask.builder() + .devcode((String) parseFixedDataMap.get("devcode")) + .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte)) + .build(); + ProtocolProcessEventListener.asynAddTask(processEventTask); + return parseFixedDataMap; + } + /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -39,10 +61,8 @@ } String rulePrepareFields = protocolConfig.getRulePrepareFields(); //固定字段 - if (StringUtils.isNotEmpty(rulePrepareFields)) { - //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + if (StringUtils.isNotEmpty(rulePrepareFields) && ObjectUtil.isNotEmpty(parseFixedDataMap)) { + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap)); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index b162def..9c413ed 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,13 +1,13 @@ package com.casic.missiles.parser.matcher; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.*; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 8eb0682..23d1e4c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 4c02a81..e8506e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -1,10 +1,10 @@ package com.casic.missiles.parser.resolver.fields; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import java.util.Map; diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java new file mode 100644 index 0000000..88baf61 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java @@ -0,0 +1,174 @@ +package com.casic.missiles.cache; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.model.Device; +import com.casic.missiles.model.DeviceData; +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.pojo.ProcessEventTask; +import com.casic.missiles.service.IDeviceDataService; +import com.casic.missiles.service.impl.DeviceDataServiceImpl; +import com.casic.missiles.util.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 流程节点事件监听器 + */ +public class ProtocolProcessEventListener { + + private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); + + /** + * 异步生成缓存 + * + * @param processEventTask + */ + public static void asynAddTask(ProcessEventTask processEventTask) { + if (StringUtils.isNotEmpty(processEventTask.getDevcode())) { + GuavaCacheUtil.putCache(processEventTask.getDevcode(), processEventTask); + } + } + + /** + * 异步设置缓存 + * + * @param key + * @param json + */ + public static void setTask(String key, Object json, Integer node) { + //如果key为空,则直接返回 + if (StringUtils.isEmpty(key) || ObjectUtil.isEmpty(json)) { + return; + } + ProcessEventTask processEventTask = null; + switch (node) { + //解密前的数据 + case 1: + //如果为空可以补救 +// if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { +// processEventTask = ProcessEventTask.builder() +// .devcode(key) +// .decryptSoureData((String) json) +// .decryptBeforeData((String) json) +// .build(); +// asynAddTask(processEventTask); +// } else { +// processEventTask.setDecryptBeforeData((String) json); +// } +// break; + //解密后的数据 + case 2: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .decryptAfterData((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setDecryptAfterData((String) json); + } + break; + //解析的数据 + case 3: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .bizDataList((List) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setBizDataList((List) json); + } + break; + case 4: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .exceptionMsg((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setExceptionMsg((String) json); + } + break; + default: + return; + } + } + + /** + * 异步设置缓存 + * + * @param key + */ + public static ProcessEventTask getTask(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + return (ProcessEventTask) GuavaCacheUtil.getCache(key); + } + + /** + * 存库操作 + * + * @param devcode + */ + public static void saveData(String devcode, ParseResult result) { + //添加到线程池执行,异步存库 + threadPool.execute( + () -> { + ProcessEventTask processEventTask; + if (ObjectUtil.isNotEmpty(getTask(devcode))) { + synchronized (processEventTask = getTask(devcode)) { + IDeviceDataService deviceDataService = SpringContextUtil.getBean(DeviceDataServiceImpl.class); + if (ObjectUtil.isNotEmpty(processEventTask)) { + List deviceDataList = new ArrayList<>(); + for (Map BizDataMap : processEventTask.getBizDataList()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDevcode(processEventTask.getDevcode()); + deviceData.setDeviceType((Integer) BizDataMap.get("deviceType")); + deviceData.setUptime((String) BizDataMap.get("uptime")); + deviceData.setLogtime(new Date()); + deviceData.setDataJson(JSON.toJSONString(BizDataMap)); + deviceData.setDecryptBeforeData(processEventTask.getDecryptSoureData()); + deviceData.setDecryptAfterData(processEventTask.getDecryptAfterData()); + if (BizDataMap.containsKey("cell")) { + //电量不一定每次都有 + deviceData.setCell((Integer) BizDataMap.get("cell")); + } + if (BizDataMap.containsKey("dataValue")) { + //电量不一定每次都有 + deviceData.setDataValue((float) BizDataMap.get("dataValue")); + } + deviceData.setExceptionMsg(processEventTask.getExceptionMsg()); + deviceDataList.add(deviceData); + } + //批量保存 + deviceDataService.saveBatch(deviceDataList); + } + } + //移除缓存 + GuavaCacheUtil.remove(devcode); + } + } + ); + } + + //暂时不做设备的更新 + public void setDevice(String status) { + Device device = new Device(); + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java deleted file mode 100644 index 2f9c711..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.cache; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - - -public class listenerEvent { - - private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, - TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); - - /** - * 异步生成缓存 - * - * @param key - * @param json - */ - public void asynCreateLogCache(String key, String json) { - - - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 4e6beea..01b20f5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.cache.GuavaCacheUtil; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; import com.casic.missiles.exception.EngineException; @@ -56,12 +56,16 @@ } ParseResult result = null; + String devcode = null; try { //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + devcode = (String) parseFixedDataMap.get("devcode"); // 通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); + RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); if (ObjectUtil.isEmpty(ruleConfig)) { + //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); byteBuf.readBytes(protocolConfig.getPreFix().length()); @@ -94,10 +98,14 @@ } //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); - log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); + //解密前的报文 + log.debug("解析的密文是----------" + ByteBufUtil.hexDump(bizDataByteBuf)); +// ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(bizDataByteBuf), 1); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); - log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + //解密后报文 //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); @@ -112,16 +120,19 @@ for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); } - //数据发送,异步 + ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); + //存储数据 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - result=null; + //数据发送,异步,异常拦截 + ProtocolProcessEventListener.setTask(devcode, rex.getMessage(), 4); + result = null; frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); - }finally { -// GuavaCacheUtil.putCache("licValid",validLicResult); -// ValidateResult validLicResult = (ValidateResult) GuavaCacheUtil.getCache("licValid"); + } finally { + //数据发送,异步,转存整体数据 + ProtocolProcessEventListener.saveData(devcode, result); return result; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 8af55a6..e4a79ae 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -1,10 +1,13 @@ package com.casic.missiles.parser; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; +import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; @@ -12,6 +15,7 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -25,10 +29,28 @@ public class ProtocolParserSupport { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; + } + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + //打印源数据,设备编号 + ProcessEventTask processEventTask = ProcessEventTask.builder() + .devcode((String) parseFixedDataMap.get("devcode")) + .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte)) + .build(); + ProtocolProcessEventListener.asynAddTask(processEventTask); + return parseFixedDataMap; + } + /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -39,10 +61,8 @@ } String rulePrepareFields = protocolConfig.getRulePrepareFields(); //固定字段 - if (StringUtils.isNotEmpty(rulePrepareFields)) { - //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + if (StringUtils.isNotEmpty(rulePrepareFields) && ObjectUtil.isNotEmpty(parseFixedDataMap)) { + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap)); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index b162def..9c413ed 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,13 +1,13 @@ package com.casic.missiles.parser.matcher; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.*; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 8eb0682..23d1e4c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 4c02a81..e8506e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -1,10 +1,10 @@ package com.casic.missiles.parser.resolver.fields; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 204b4dc..54b4e58 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.rule; import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.pojo.RuleConfig; import lombok.extern.slf4j.Slf4j; diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java new file mode 100644 index 0000000..88baf61 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java @@ -0,0 +1,174 @@ +package com.casic.missiles.cache; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.model.Device; +import com.casic.missiles.model.DeviceData; +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.pojo.ProcessEventTask; +import com.casic.missiles.service.IDeviceDataService; +import com.casic.missiles.service.impl.DeviceDataServiceImpl; +import com.casic.missiles.util.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 流程节点事件监听器 + */ +public class ProtocolProcessEventListener { + + private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); + + /** + * 异步生成缓存 + * + * @param processEventTask + */ + public static void asynAddTask(ProcessEventTask processEventTask) { + if (StringUtils.isNotEmpty(processEventTask.getDevcode())) { + GuavaCacheUtil.putCache(processEventTask.getDevcode(), processEventTask); + } + } + + /** + * 异步设置缓存 + * + * @param key + * @param json + */ + public static void setTask(String key, Object json, Integer node) { + //如果key为空,则直接返回 + if (StringUtils.isEmpty(key) || ObjectUtil.isEmpty(json)) { + return; + } + ProcessEventTask processEventTask = null; + switch (node) { + //解密前的数据 + case 1: + //如果为空可以补救 +// if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { +// processEventTask = ProcessEventTask.builder() +// .devcode(key) +// .decryptSoureData((String) json) +// .decryptBeforeData((String) json) +// .build(); +// asynAddTask(processEventTask); +// } else { +// processEventTask.setDecryptBeforeData((String) json); +// } +// break; + //解密后的数据 + case 2: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .decryptAfterData((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setDecryptAfterData((String) json); + } + break; + //解析的数据 + case 3: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .bizDataList((List) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setBizDataList((List) json); + } + break; + case 4: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .exceptionMsg((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setExceptionMsg((String) json); + } + break; + default: + return; + } + } + + /** + * 异步设置缓存 + * + * @param key + */ + public static ProcessEventTask getTask(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + return (ProcessEventTask) GuavaCacheUtil.getCache(key); + } + + /** + * 存库操作 + * + * @param devcode + */ + public static void saveData(String devcode, ParseResult result) { + //添加到线程池执行,异步存库 + threadPool.execute( + () -> { + ProcessEventTask processEventTask; + if (ObjectUtil.isNotEmpty(getTask(devcode))) { + synchronized (processEventTask = getTask(devcode)) { + IDeviceDataService deviceDataService = SpringContextUtil.getBean(DeviceDataServiceImpl.class); + if (ObjectUtil.isNotEmpty(processEventTask)) { + List deviceDataList = new ArrayList<>(); + for (Map BizDataMap : processEventTask.getBizDataList()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDevcode(processEventTask.getDevcode()); + deviceData.setDeviceType((Integer) BizDataMap.get("deviceType")); + deviceData.setUptime((String) BizDataMap.get("uptime")); + deviceData.setLogtime(new Date()); + deviceData.setDataJson(JSON.toJSONString(BizDataMap)); + deviceData.setDecryptBeforeData(processEventTask.getDecryptSoureData()); + deviceData.setDecryptAfterData(processEventTask.getDecryptAfterData()); + if (BizDataMap.containsKey("cell")) { + //电量不一定每次都有 + deviceData.setCell((Integer) BizDataMap.get("cell")); + } + if (BizDataMap.containsKey("dataValue")) { + //电量不一定每次都有 + deviceData.setDataValue((float) BizDataMap.get("dataValue")); + } + deviceData.setExceptionMsg(processEventTask.getExceptionMsg()); + deviceDataList.add(deviceData); + } + //批量保存 + deviceDataService.saveBatch(deviceDataList); + } + } + //移除缓存 + GuavaCacheUtil.remove(devcode); + } + } + ); + } + + //暂时不做设备的更新 + public void setDevice(String status) { + Device device = new Device(); + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java deleted file mode 100644 index 2f9c711..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.cache; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - - -public class listenerEvent { - - private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, - TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); - - /** - * 异步生成缓存 - * - * @param key - * @param json - */ - public void asynCreateLogCache(String key, String json) { - - - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 4e6beea..01b20f5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.cache.GuavaCacheUtil; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; import com.casic.missiles.exception.EngineException; @@ -56,12 +56,16 @@ } ParseResult result = null; + String devcode = null; try { //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + devcode = (String) parseFixedDataMap.get("devcode"); // 通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); + RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); if (ObjectUtil.isEmpty(ruleConfig)) { + //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); byteBuf.readBytes(protocolConfig.getPreFix().length()); @@ -94,10 +98,14 @@ } //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); - log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); + //解密前的报文 + log.debug("解析的密文是----------" + ByteBufUtil.hexDump(bizDataByteBuf)); +// ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(bizDataByteBuf), 1); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); - log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + //解密后报文 //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); @@ -112,16 +120,19 @@ for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); } - //数据发送,异步 + ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); + //存储数据 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - result=null; + //数据发送,异步,异常拦截 + ProtocolProcessEventListener.setTask(devcode, rex.getMessage(), 4); + result = null; frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); - }finally { -// GuavaCacheUtil.putCache("licValid",validLicResult); -// ValidateResult validLicResult = (ValidateResult) GuavaCacheUtil.getCache("licValid"); + } finally { + //数据发送,异步,转存整体数据 + ProtocolProcessEventListener.saveData(devcode, result); return result; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 8af55a6..e4a79ae 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -1,10 +1,13 @@ package com.casic.missiles.parser; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; +import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; @@ -12,6 +15,7 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -25,10 +29,28 @@ public class ProtocolParserSupport { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; + } + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + //打印源数据,设备编号 + ProcessEventTask processEventTask = ProcessEventTask.builder() + .devcode((String) parseFixedDataMap.get("devcode")) + .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte)) + .build(); + ProtocolProcessEventListener.asynAddTask(processEventTask); + return parseFixedDataMap; + } + /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -39,10 +61,8 @@ } String rulePrepareFields = protocolConfig.getRulePrepareFields(); //固定字段 - if (StringUtils.isNotEmpty(rulePrepareFields)) { - //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + if (StringUtils.isNotEmpty(rulePrepareFields) && ObjectUtil.isNotEmpty(parseFixedDataMap)) { + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap)); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index b162def..9c413ed 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,13 +1,13 @@ package com.casic.missiles.parser.matcher; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.*; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 8eb0682..23d1e4c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 4c02a81..e8506e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -1,10 +1,10 @@ package com.casic.missiles.parser.resolver.fields; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 204b4dc..54b4e58 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.rule; import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.pojo.RuleConfig; import lombok.extern.slf4j.Slf4j; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index 7c6350b..3d89d0d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.impl.KafkaSubscribe; diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java new file mode 100644 index 0000000..88baf61 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java @@ -0,0 +1,174 @@ +package com.casic.missiles.cache; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.model.Device; +import com.casic.missiles.model.DeviceData; +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.pojo.ProcessEventTask; +import com.casic.missiles.service.IDeviceDataService; +import com.casic.missiles.service.impl.DeviceDataServiceImpl; +import com.casic.missiles.util.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 流程节点事件监听器 + */ +public class ProtocolProcessEventListener { + + private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); + + /** + * 异步生成缓存 + * + * @param processEventTask + */ + public static void asynAddTask(ProcessEventTask processEventTask) { + if (StringUtils.isNotEmpty(processEventTask.getDevcode())) { + GuavaCacheUtil.putCache(processEventTask.getDevcode(), processEventTask); + } + } + + /** + * 异步设置缓存 + * + * @param key + * @param json + */ + public static void setTask(String key, Object json, Integer node) { + //如果key为空,则直接返回 + if (StringUtils.isEmpty(key) || ObjectUtil.isEmpty(json)) { + return; + } + ProcessEventTask processEventTask = null; + switch (node) { + //解密前的数据 + case 1: + //如果为空可以补救 +// if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { +// processEventTask = ProcessEventTask.builder() +// .devcode(key) +// .decryptSoureData((String) json) +// .decryptBeforeData((String) json) +// .build(); +// asynAddTask(processEventTask); +// } else { +// processEventTask.setDecryptBeforeData((String) json); +// } +// break; + //解密后的数据 + case 2: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .decryptAfterData((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setDecryptAfterData((String) json); + } + break; + //解析的数据 + case 3: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .bizDataList((List) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setBizDataList((List) json); + } + break; + case 4: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .exceptionMsg((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setExceptionMsg((String) json); + } + break; + default: + return; + } + } + + /** + * 异步设置缓存 + * + * @param key + */ + public static ProcessEventTask getTask(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + return (ProcessEventTask) GuavaCacheUtil.getCache(key); + } + + /** + * 存库操作 + * + * @param devcode + */ + public static void saveData(String devcode, ParseResult result) { + //添加到线程池执行,异步存库 + threadPool.execute( + () -> { + ProcessEventTask processEventTask; + if (ObjectUtil.isNotEmpty(getTask(devcode))) { + synchronized (processEventTask = getTask(devcode)) { + IDeviceDataService deviceDataService = SpringContextUtil.getBean(DeviceDataServiceImpl.class); + if (ObjectUtil.isNotEmpty(processEventTask)) { + List deviceDataList = new ArrayList<>(); + for (Map BizDataMap : processEventTask.getBizDataList()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDevcode(processEventTask.getDevcode()); + deviceData.setDeviceType((Integer) BizDataMap.get("deviceType")); + deviceData.setUptime((String) BizDataMap.get("uptime")); + deviceData.setLogtime(new Date()); + deviceData.setDataJson(JSON.toJSONString(BizDataMap)); + deviceData.setDecryptBeforeData(processEventTask.getDecryptSoureData()); + deviceData.setDecryptAfterData(processEventTask.getDecryptAfterData()); + if (BizDataMap.containsKey("cell")) { + //电量不一定每次都有 + deviceData.setCell((Integer) BizDataMap.get("cell")); + } + if (BizDataMap.containsKey("dataValue")) { + //电量不一定每次都有 + deviceData.setDataValue((float) BizDataMap.get("dataValue")); + } + deviceData.setExceptionMsg(processEventTask.getExceptionMsg()); + deviceDataList.add(deviceData); + } + //批量保存 + deviceDataService.saveBatch(deviceDataList); + } + } + //移除缓存 + GuavaCacheUtil.remove(devcode); + } + } + ); + } + + //暂时不做设备的更新 + public void setDevice(String status) { + Device device = new Device(); + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java deleted file mode 100644 index 2f9c711..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.cache; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - - -public class listenerEvent { - - private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, - TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); - - /** - * 异步生成缓存 - * - * @param key - * @param json - */ - public void asynCreateLogCache(String key, String json) { - - - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 4e6beea..01b20f5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.cache.GuavaCacheUtil; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; import com.casic.missiles.exception.EngineException; @@ -56,12 +56,16 @@ } ParseResult result = null; + String devcode = null; try { //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + devcode = (String) parseFixedDataMap.get("devcode"); // 通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); + RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); if (ObjectUtil.isEmpty(ruleConfig)) { + //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); byteBuf.readBytes(protocolConfig.getPreFix().length()); @@ -94,10 +98,14 @@ } //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); - log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); + //解密前的报文 + log.debug("解析的密文是----------" + ByteBufUtil.hexDump(bizDataByteBuf)); +// ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(bizDataByteBuf), 1); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); - log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + //解密后报文 //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); @@ -112,16 +120,19 @@ for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); } - //数据发送,异步 + ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); + //存储数据 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - result=null; + //数据发送,异步,异常拦截 + ProtocolProcessEventListener.setTask(devcode, rex.getMessage(), 4); + result = null; frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); - }finally { -// GuavaCacheUtil.putCache("licValid",validLicResult); -// ValidateResult validLicResult = (ValidateResult) GuavaCacheUtil.getCache("licValid"); + } finally { + //数据发送,异步,转存整体数据 + ProtocolProcessEventListener.saveData(devcode, result); return result; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 8af55a6..e4a79ae 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -1,10 +1,13 @@ package com.casic.missiles.parser; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; +import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; @@ -12,6 +15,7 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -25,10 +29,28 @@ public class ProtocolParserSupport { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; + } + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + //打印源数据,设备编号 + ProcessEventTask processEventTask = ProcessEventTask.builder() + .devcode((String) parseFixedDataMap.get("devcode")) + .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte)) + .build(); + ProtocolProcessEventListener.asynAddTask(processEventTask); + return parseFixedDataMap; + } + /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -39,10 +61,8 @@ } String rulePrepareFields = protocolConfig.getRulePrepareFields(); //固定字段 - if (StringUtils.isNotEmpty(rulePrepareFields)) { - //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + if (StringUtils.isNotEmpty(rulePrepareFields) && ObjectUtil.isNotEmpty(parseFixedDataMap)) { + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap)); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index b162def..9c413ed 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,13 +1,13 @@ package com.casic.missiles.parser.matcher; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.*; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 8eb0682..23d1e4c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 4c02a81..e8506e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -1,10 +1,10 @@ package com.casic.missiles.parser.resolver.fields; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 204b4dc..54b4e58 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.rule; import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.pojo.RuleConfig; import lombok.extern.slf4j.Slf4j; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index 7c6350b..3d89d0d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.impl.KafkaSubscribe; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 68aca0e..81644ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -271,7 +271,7 @@ if (showSkip()) { return null; } - //获取缓存 + //缓存命中 if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { return (Map) singleObjects.get(FIXED_FIELD_DS); } diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java new file mode 100644 index 0000000..88baf61 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java @@ -0,0 +1,174 @@ +package com.casic.missiles.cache; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.model.Device; +import com.casic.missiles.model.DeviceData; +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.pojo.ProcessEventTask; +import com.casic.missiles.service.IDeviceDataService; +import com.casic.missiles.service.impl.DeviceDataServiceImpl; +import com.casic.missiles.util.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 流程节点事件监听器 + */ +public class ProtocolProcessEventListener { + + private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); + + /** + * 异步生成缓存 + * + * @param processEventTask + */ + public static void asynAddTask(ProcessEventTask processEventTask) { + if (StringUtils.isNotEmpty(processEventTask.getDevcode())) { + GuavaCacheUtil.putCache(processEventTask.getDevcode(), processEventTask); + } + } + + /** + * 异步设置缓存 + * + * @param key + * @param json + */ + public static void setTask(String key, Object json, Integer node) { + //如果key为空,则直接返回 + if (StringUtils.isEmpty(key) || ObjectUtil.isEmpty(json)) { + return; + } + ProcessEventTask processEventTask = null; + switch (node) { + //解密前的数据 + case 1: + //如果为空可以补救 +// if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { +// processEventTask = ProcessEventTask.builder() +// .devcode(key) +// .decryptSoureData((String) json) +// .decryptBeforeData((String) json) +// .build(); +// asynAddTask(processEventTask); +// } else { +// processEventTask.setDecryptBeforeData((String) json); +// } +// break; + //解密后的数据 + case 2: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .decryptAfterData((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setDecryptAfterData((String) json); + } + break; + //解析的数据 + case 3: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .bizDataList((List) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setBizDataList((List) json); + } + break; + case 4: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .exceptionMsg((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setExceptionMsg((String) json); + } + break; + default: + return; + } + } + + /** + * 异步设置缓存 + * + * @param key + */ + public static ProcessEventTask getTask(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + return (ProcessEventTask) GuavaCacheUtil.getCache(key); + } + + /** + * 存库操作 + * + * @param devcode + */ + public static void saveData(String devcode, ParseResult result) { + //添加到线程池执行,异步存库 + threadPool.execute( + () -> { + ProcessEventTask processEventTask; + if (ObjectUtil.isNotEmpty(getTask(devcode))) { + synchronized (processEventTask = getTask(devcode)) { + IDeviceDataService deviceDataService = SpringContextUtil.getBean(DeviceDataServiceImpl.class); + if (ObjectUtil.isNotEmpty(processEventTask)) { + List deviceDataList = new ArrayList<>(); + for (Map BizDataMap : processEventTask.getBizDataList()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDevcode(processEventTask.getDevcode()); + deviceData.setDeviceType((Integer) BizDataMap.get("deviceType")); + deviceData.setUptime((String) BizDataMap.get("uptime")); + deviceData.setLogtime(new Date()); + deviceData.setDataJson(JSON.toJSONString(BizDataMap)); + deviceData.setDecryptBeforeData(processEventTask.getDecryptSoureData()); + deviceData.setDecryptAfterData(processEventTask.getDecryptAfterData()); + if (BizDataMap.containsKey("cell")) { + //电量不一定每次都有 + deviceData.setCell((Integer) BizDataMap.get("cell")); + } + if (BizDataMap.containsKey("dataValue")) { + //电量不一定每次都有 + deviceData.setDataValue((float) BizDataMap.get("dataValue")); + } + deviceData.setExceptionMsg(processEventTask.getExceptionMsg()); + deviceDataList.add(deviceData); + } + //批量保存 + deviceDataService.saveBatch(deviceDataList); + } + } + //移除缓存 + GuavaCacheUtil.remove(devcode); + } + } + ); + } + + //暂时不做设备的更新 + public void setDevice(String status) { + Device device = new Device(); + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java deleted file mode 100644 index 2f9c711..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.cache; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - - -public class listenerEvent { - - private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, - TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); - - /** - * 异步生成缓存 - * - * @param key - * @param json - */ - public void asynCreateLogCache(String key, String json) { - - - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 4e6beea..01b20f5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.cache.GuavaCacheUtil; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; import com.casic.missiles.exception.EngineException; @@ -56,12 +56,16 @@ } ParseResult result = null; + String devcode = null; try { //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + devcode = (String) parseFixedDataMap.get("devcode"); // 通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); + RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); if (ObjectUtil.isEmpty(ruleConfig)) { + //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); byteBuf.readBytes(protocolConfig.getPreFix().length()); @@ -94,10 +98,14 @@ } //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); - log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); + //解密前的报文 + log.debug("解析的密文是----------" + ByteBufUtil.hexDump(bizDataByteBuf)); +// ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(bizDataByteBuf), 1); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); - log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + //解密后报文 //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); @@ -112,16 +120,19 @@ for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); } - //数据发送,异步 + ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); + //存储数据 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - result=null; + //数据发送,异步,异常拦截 + ProtocolProcessEventListener.setTask(devcode, rex.getMessage(), 4); + result = null; frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); - }finally { -// GuavaCacheUtil.putCache("licValid",validLicResult); -// ValidateResult validLicResult = (ValidateResult) GuavaCacheUtil.getCache("licValid"); + } finally { + //数据发送,异步,转存整体数据 + ProtocolProcessEventListener.saveData(devcode, result); return result; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 8af55a6..e4a79ae 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -1,10 +1,13 @@ package com.casic.missiles.parser; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; +import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; @@ -12,6 +15,7 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -25,10 +29,28 @@ public class ProtocolParserSupport { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; + } + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + //打印源数据,设备编号 + ProcessEventTask processEventTask = ProcessEventTask.builder() + .devcode((String) parseFixedDataMap.get("devcode")) + .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte)) + .build(); + ProtocolProcessEventListener.asynAddTask(processEventTask); + return parseFixedDataMap; + } + /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -39,10 +61,8 @@ } String rulePrepareFields = protocolConfig.getRulePrepareFields(); //固定字段 - if (StringUtils.isNotEmpty(rulePrepareFields)) { - //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + if (StringUtils.isNotEmpty(rulePrepareFields) && ObjectUtil.isNotEmpty(parseFixedDataMap)) { + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap)); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index b162def..9c413ed 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,13 +1,13 @@ package com.casic.missiles.parser.matcher; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.*; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 8eb0682..23d1e4c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 4c02a81..e8506e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -1,10 +1,10 @@ package com.casic.missiles.parser.resolver.fields; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 204b4dc..54b4e58 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.rule; import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.pojo.RuleConfig; import lombok.extern.slf4j.Slf4j; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index 7c6350b..3d89d0d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.impl.KafkaSubscribe; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 68aca0e..81644ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -271,7 +271,7 @@ if (showSkip()) { return null; } - //获取缓存 + //缓存命中 if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { return (Map) singleObjects.get(FIXED_FIELD_DS); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java index 0523447..9dc64f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java @@ -1,7 +1,7 @@ package com.casic.missiles.provider; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FileNameEnums; import com.casic.missiles.parser.crc.CRC16; import com.casic.missiles.pojo.UpgradeFileResult; diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java new file mode 100644 index 0000000..88baf61 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java @@ -0,0 +1,174 @@ +package com.casic.missiles.cache; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.model.Device; +import com.casic.missiles.model.DeviceData; +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.pojo.ProcessEventTask; +import com.casic.missiles.service.IDeviceDataService; +import com.casic.missiles.service.impl.DeviceDataServiceImpl; +import com.casic.missiles.util.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 流程节点事件监听器 + */ +public class ProtocolProcessEventListener { + + private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); + + /** + * 异步生成缓存 + * + * @param processEventTask + */ + public static void asynAddTask(ProcessEventTask processEventTask) { + if (StringUtils.isNotEmpty(processEventTask.getDevcode())) { + GuavaCacheUtil.putCache(processEventTask.getDevcode(), processEventTask); + } + } + + /** + * 异步设置缓存 + * + * @param key + * @param json + */ + public static void setTask(String key, Object json, Integer node) { + //如果key为空,则直接返回 + if (StringUtils.isEmpty(key) || ObjectUtil.isEmpty(json)) { + return; + } + ProcessEventTask processEventTask = null; + switch (node) { + //解密前的数据 + case 1: + //如果为空可以补救 +// if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { +// processEventTask = ProcessEventTask.builder() +// .devcode(key) +// .decryptSoureData((String) json) +// .decryptBeforeData((String) json) +// .build(); +// asynAddTask(processEventTask); +// } else { +// processEventTask.setDecryptBeforeData((String) json); +// } +// break; + //解密后的数据 + case 2: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .decryptAfterData((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setDecryptAfterData((String) json); + } + break; + //解析的数据 + case 3: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .bizDataList((List) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setBizDataList((List) json); + } + break; + case 4: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .exceptionMsg((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setExceptionMsg((String) json); + } + break; + default: + return; + } + } + + /** + * 异步设置缓存 + * + * @param key + */ + public static ProcessEventTask getTask(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + return (ProcessEventTask) GuavaCacheUtil.getCache(key); + } + + /** + * 存库操作 + * + * @param devcode + */ + public static void saveData(String devcode, ParseResult result) { + //添加到线程池执行,异步存库 + threadPool.execute( + () -> { + ProcessEventTask processEventTask; + if (ObjectUtil.isNotEmpty(getTask(devcode))) { + synchronized (processEventTask = getTask(devcode)) { + IDeviceDataService deviceDataService = SpringContextUtil.getBean(DeviceDataServiceImpl.class); + if (ObjectUtil.isNotEmpty(processEventTask)) { + List deviceDataList = new ArrayList<>(); + for (Map BizDataMap : processEventTask.getBizDataList()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDevcode(processEventTask.getDevcode()); + deviceData.setDeviceType((Integer) BizDataMap.get("deviceType")); + deviceData.setUptime((String) BizDataMap.get("uptime")); + deviceData.setLogtime(new Date()); + deviceData.setDataJson(JSON.toJSONString(BizDataMap)); + deviceData.setDecryptBeforeData(processEventTask.getDecryptSoureData()); + deviceData.setDecryptAfterData(processEventTask.getDecryptAfterData()); + if (BizDataMap.containsKey("cell")) { + //电量不一定每次都有 + deviceData.setCell((Integer) BizDataMap.get("cell")); + } + if (BizDataMap.containsKey("dataValue")) { + //电量不一定每次都有 + deviceData.setDataValue((float) BizDataMap.get("dataValue")); + } + deviceData.setExceptionMsg(processEventTask.getExceptionMsg()); + deviceDataList.add(deviceData); + } + //批量保存 + deviceDataService.saveBatch(deviceDataList); + } + } + //移除缓存 + GuavaCacheUtil.remove(devcode); + } + } + ); + } + + //暂时不做设备的更新 + public void setDevice(String status) { + Device device = new Device(); + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java deleted file mode 100644 index 2f9c711..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.cache; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - - -public class listenerEvent { - - private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, - TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); - - /** - * 异步生成缓存 - * - * @param key - * @param json - */ - public void asynCreateLogCache(String key, String json) { - - - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 4e6beea..01b20f5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.cache.GuavaCacheUtil; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; import com.casic.missiles.exception.EngineException; @@ -56,12 +56,16 @@ } ParseResult result = null; + String devcode = null; try { //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + devcode = (String) parseFixedDataMap.get("devcode"); // 通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); + RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); if (ObjectUtil.isEmpty(ruleConfig)) { + //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); byteBuf.readBytes(protocolConfig.getPreFix().length()); @@ -94,10 +98,14 @@ } //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); - log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); + //解密前的报文 + log.debug("解析的密文是----------" + ByteBufUtil.hexDump(bizDataByteBuf)); +// ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(bizDataByteBuf), 1); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); - log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + //解密后报文 //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); @@ -112,16 +120,19 @@ for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); } - //数据发送,异步 + ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); + //存储数据 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - result=null; + //数据发送,异步,异常拦截 + ProtocolProcessEventListener.setTask(devcode, rex.getMessage(), 4); + result = null; frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); - }finally { -// GuavaCacheUtil.putCache("licValid",validLicResult); -// ValidateResult validLicResult = (ValidateResult) GuavaCacheUtil.getCache("licValid"); + } finally { + //数据发送,异步,转存整体数据 + ProtocolProcessEventListener.saveData(devcode, result); return result; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 8af55a6..e4a79ae 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -1,10 +1,13 @@ package com.casic.missiles.parser; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; +import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; @@ -12,6 +15,7 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -25,10 +29,28 @@ public class ProtocolParserSupport { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; + } + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + //打印源数据,设备编号 + ProcessEventTask processEventTask = ProcessEventTask.builder() + .devcode((String) parseFixedDataMap.get("devcode")) + .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte)) + .build(); + ProtocolProcessEventListener.asynAddTask(processEventTask); + return parseFixedDataMap; + } + /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -39,10 +61,8 @@ } String rulePrepareFields = protocolConfig.getRulePrepareFields(); //固定字段 - if (StringUtils.isNotEmpty(rulePrepareFields)) { - //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + if (StringUtils.isNotEmpty(rulePrepareFields) && ObjectUtil.isNotEmpty(parseFixedDataMap)) { + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap)); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index b162def..9c413ed 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,13 +1,13 @@ package com.casic.missiles.parser.matcher; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.*; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 8eb0682..23d1e4c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 4c02a81..e8506e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -1,10 +1,10 @@ package com.casic.missiles.parser.resolver.fields; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 204b4dc..54b4e58 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.rule; import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.pojo.RuleConfig; import lombok.extern.slf4j.Slf4j; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index 7c6350b..3d89d0d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.impl.KafkaSubscribe; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 68aca0e..81644ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -271,7 +271,7 @@ if (showSkip()) { return null; } - //获取缓存 + //缓存命中 if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { return (Map) singleObjects.get(FIXED_FIELD_DS); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java index 0523447..9dc64f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java @@ -1,7 +1,7 @@ package com.casic.missiles.provider; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FileNameEnums; import com.casic.missiles.parser.crc.CRC16; import com.casic.missiles.pojo.UpgradeFileResult; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index ddaadbe..c3a00ce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java new file mode 100644 index 0000000..88baf61 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java @@ -0,0 +1,174 @@ +package com.casic.missiles.cache; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.model.Device; +import com.casic.missiles.model.DeviceData; +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.pojo.ProcessEventTask; +import com.casic.missiles.service.IDeviceDataService; +import com.casic.missiles.service.impl.DeviceDataServiceImpl; +import com.casic.missiles.util.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 流程节点事件监听器 + */ +public class ProtocolProcessEventListener { + + private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); + + /** + * 异步生成缓存 + * + * @param processEventTask + */ + public static void asynAddTask(ProcessEventTask processEventTask) { + if (StringUtils.isNotEmpty(processEventTask.getDevcode())) { + GuavaCacheUtil.putCache(processEventTask.getDevcode(), processEventTask); + } + } + + /** + * 异步设置缓存 + * + * @param key + * @param json + */ + public static void setTask(String key, Object json, Integer node) { + //如果key为空,则直接返回 + if (StringUtils.isEmpty(key) || ObjectUtil.isEmpty(json)) { + return; + } + ProcessEventTask processEventTask = null; + switch (node) { + //解密前的数据 + case 1: + //如果为空可以补救 +// if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { +// processEventTask = ProcessEventTask.builder() +// .devcode(key) +// .decryptSoureData((String) json) +// .decryptBeforeData((String) json) +// .build(); +// asynAddTask(processEventTask); +// } else { +// processEventTask.setDecryptBeforeData((String) json); +// } +// break; + //解密后的数据 + case 2: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .decryptAfterData((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setDecryptAfterData((String) json); + } + break; + //解析的数据 + case 3: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .bizDataList((List) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setBizDataList((List) json); + } + break; + case 4: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .exceptionMsg((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setExceptionMsg((String) json); + } + break; + default: + return; + } + } + + /** + * 异步设置缓存 + * + * @param key + */ + public static ProcessEventTask getTask(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + return (ProcessEventTask) GuavaCacheUtil.getCache(key); + } + + /** + * 存库操作 + * + * @param devcode + */ + public static void saveData(String devcode, ParseResult result) { + //添加到线程池执行,异步存库 + threadPool.execute( + () -> { + ProcessEventTask processEventTask; + if (ObjectUtil.isNotEmpty(getTask(devcode))) { + synchronized (processEventTask = getTask(devcode)) { + IDeviceDataService deviceDataService = SpringContextUtil.getBean(DeviceDataServiceImpl.class); + if (ObjectUtil.isNotEmpty(processEventTask)) { + List deviceDataList = new ArrayList<>(); + for (Map BizDataMap : processEventTask.getBizDataList()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDevcode(processEventTask.getDevcode()); + deviceData.setDeviceType((Integer) BizDataMap.get("deviceType")); + deviceData.setUptime((String) BizDataMap.get("uptime")); + deviceData.setLogtime(new Date()); + deviceData.setDataJson(JSON.toJSONString(BizDataMap)); + deviceData.setDecryptBeforeData(processEventTask.getDecryptSoureData()); + deviceData.setDecryptAfterData(processEventTask.getDecryptAfterData()); + if (BizDataMap.containsKey("cell")) { + //电量不一定每次都有 + deviceData.setCell((Integer) BizDataMap.get("cell")); + } + if (BizDataMap.containsKey("dataValue")) { + //电量不一定每次都有 + deviceData.setDataValue((float) BizDataMap.get("dataValue")); + } + deviceData.setExceptionMsg(processEventTask.getExceptionMsg()); + deviceDataList.add(deviceData); + } + //批量保存 + deviceDataService.saveBatch(deviceDataList); + } + } + //移除缓存 + GuavaCacheUtil.remove(devcode); + } + } + ); + } + + //暂时不做设备的更新 + public void setDevice(String status) { + Device device = new Device(); + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java deleted file mode 100644 index 2f9c711..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.cache; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - - -public class listenerEvent { - - private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, - TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); - - /** - * 异步生成缓存 - * - * @param key - * @param json - */ - public void asynCreateLogCache(String key, String json) { - - - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 4e6beea..01b20f5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.cache.GuavaCacheUtil; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; import com.casic.missiles.exception.EngineException; @@ -56,12 +56,16 @@ } ParseResult result = null; + String devcode = null; try { //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + devcode = (String) parseFixedDataMap.get("devcode"); // 通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); + RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); if (ObjectUtil.isEmpty(ruleConfig)) { + //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); byteBuf.readBytes(protocolConfig.getPreFix().length()); @@ -94,10 +98,14 @@ } //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); - log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); + //解密前的报文 + log.debug("解析的密文是----------" + ByteBufUtil.hexDump(bizDataByteBuf)); +// ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(bizDataByteBuf), 1); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); - log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + //解密后报文 //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); @@ -112,16 +120,19 @@ for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); } - //数据发送,异步 + ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); + //存储数据 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - result=null; + //数据发送,异步,异常拦截 + ProtocolProcessEventListener.setTask(devcode, rex.getMessage(), 4); + result = null; frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); - }finally { -// GuavaCacheUtil.putCache("licValid",validLicResult); -// ValidateResult validLicResult = (ValidateResult) GuavaCacheUtil.getCache("licValid"); + } finally { + //数据发送,异步,转存整体数据 + ProtocolProcessEventListener.saveData(devcode, result); return result; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 8af55a6..e4a79ae 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -1,10 +1,13 @@ package com.casic.missiles.parser; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; +import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; @@ -12,6 +15,7 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -25,10 +29,28 @@ public class ProtocolParserSupport { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; + } + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + //打印源数据,设备编号 + ProcessEventTask processEventTask = ProcessEventTask.builder() + .devcode((String) parseFixedDataMap.get("devcode")) + .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte)) + .build(); + ProtocolProcessEventListener.asynAddTask(processEventTask); + return parseFixedDataMap; + } + /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -39,10 +61,8 @@ } String rulePrepareFields = protocolConfig.getRulePrepareFields(); //固定字段 - if (StringUtils.isNotEmpty(rulePrepareFields)) { - //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + if (StringUtils.isNotEmpty(rulePrepareFields) && ObjectUtil.isNotEmpty(parseFixedDataMap)) { + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap)); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index b162def..9c413ed 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,13 +1,13 @@ package com.casic.missiles.parser.matcher; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.*; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 8eb0682..23d1e4c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 4c02a81..e8506e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -1,10 +1,10 @@ package com.casic.missiles.parser.resolver.fields; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 204b4dc..54b4e58 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.rule; import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.pojo.RuleConfig; import lombok.extern.slf4j.Slf4j; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index 7c6350b..3d89d0d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.impl.KafkaSubscribe; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 68aca0e..81644ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -271,7 +271,7 @@ if (showSkip()) { return null; } - //获取缓存 + //缓存命中 if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { return (Map) singleObjects.get(FIXED_FIELD_DS); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java index 0523447..9dc64f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java @@ -1,7 +1,7 @@ package com.casic.missiles.provider; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FileNameEnums; import com.casic.missiles.parser.crc.CRC16; import com.casic.missiles.pojo.UpgradeFileResult; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index ddaadbe..c3a00ce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java index fe9fb77..d6fad15 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java @@ -1,6 +1,6 @@ package com.casic.missiles.replier.decorator; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import io.netty.buffer.ByteBuf; import org.bouncycastle.util.encoders.Hex; diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java new file mode 100644 index 0000000..88baf61 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java @@ -0,0 +1,174 @@ +package com.casic.missiles.cache; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.model.Device; +import com.casic.missiles.model.DeviceData; +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.pojo.ProcessEventTask; +import com.casic.missiles.service.IDeviceDataService; +import com.casic.missiles.service.impl.DeviceDataServiceImpl; +import com.casic.missiles.util.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 流程节点事件监听器 + */ +public class ProtocolProcessEventListener { + + private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); + + /** + * 异步生成缓存 + * + * @param processEventTask + */ + public static void asynAddTask(ProcessEventTask processEventTask) { + if (StringUtils.isNotEmpty(processEventTask.getDevcode())) { + GuavaCacheUtil.putCache(processEventTask.getDevcode(), processEventTask); + } + } + + /** + * 异步设置缓存 + * + * @param key + * @param json + */ + public static void setTask(String key, Object json, Integer node) { + //如果key为空,则直接返回 + if (StringUtils.isEmpty(key) || ObjectUtil.isEmpty(json)) { + return; + } + ProcessEventTask processEventTask = null; + switch (node) { + //解密前的数据 + case 1: + //如果为空可以补救 +// if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { +// processEventTask = ProcessEventTask.builder() +// .devcode(key) +// .decryptSoureData((String) json) +// .decryptBeforeData((String) json) +// .build(); +// asynAddTask(processEventTask); +// } else { +// processEventTask.setDecryptBeforeData((String) json); +// } +// break; + //解密后的数据 + case 2: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .decryptAfterData((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setDecryptAfterData((String) json); + } + break; + //解析的数据 + case 3: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .bizDataList((List) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setBizDataList((List) json); + } + break; + case 4: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .exceptionMsg((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setExceptionMsg((String) json); + } + break; + default: + return; + } + } + + /** + * 异步设置缓存 + * + * @param key + */ + public static ProcessEventTask getTask(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + return (ProcessEventTask) GuavaCacheUtil.getCache(key); + } + + /** + * 存库操作 + * + * @param devcode + */ + public static void saveData(String devcode, ParseResult result) { + //添加到线程池执行,异步存库 + threadPool.execute( + () -> { + ProcessEventTask processEventTask; + if (ObjectUtil.isNotEmpty(getTask(devcode))) { + synchronized (processEventTask = getTask(devcode)) { + IDeviceDataService deviceDataService = SpringContextUtil.getBean(DeviceDataServiceImpl.class); + if (ObjectUtil.isNotEmpty(processEventTask)) { + List deviceDataList = new ArrayList<>(); + for (Map BizDataMap : processEventTask.getBizDataList()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDevcode(processEventTask.getDevcode()); + deviceData.setDeviceType((Integer) BizDataMap.get("deviceType")); + deviceData.setUptime((String) BizDataMap.get("uptime")); + deviceData.setLogtime(new Date()); + deviceData.setDataJson(JSON.toJSONString(BizDataMap)); + deviceData.setDecryptBeforeData(processEventTask.getDecryptSoureData()); + deviceData.setDecryptAfterData(processEventTask.getDecryptAfterData()); + if (BizDataMap.containsKey("cell")) { + //电量不一定每次都有 + deviceData.setCell((Integer) BizDataMap.get("cell")); + } + if (BizDataMap.containsKey("dataValue")) { + //电量不一定每次都有 + deviceData.setDataValue((float) BizDataMap.get("dataValue")); + } + deviceData.setExceptionMsg(processEventTask.getExceptionMsg()); + deviceDataList.add(deviceData); + } + //批量保存 + deviceDataService.saveBatch(deviceDataList); + } + } + //移除缓存 + GuavaCacheUtil.remove(devcode); + } + } + ); + } + + //暂时不做设备的更新 + public void setDevice(String status) { + Device device = new Device(); + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java deleted file mode 100644 index 2f9c711..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.cache; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - - -public class listenerEvent { - - private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, - TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); - - /** - * 异步生成缓存 - * - * @param key - * @param json - */ - public void asynCreateLogCache(String key, String json) { - - - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 4e6beea..01b20f5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.cache.GuavaCacheUtil; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; import com.casic.missiles.exception.EngineException; @@ -56,12 +56,16 @@ } ParseResult result = null; + String devcode = null; try { //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + devcode = (String) parseFixedDataMap.get("devcode"); // 通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); + RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); if (ObjectUtil.isEmpty(ruleConfig)) { + //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); byteBuf.readBytes(protocolConfig.getPreFix().length()); @@ -94,10 +98,14 @@ } //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); - log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); + //解密前的报文 + log.debug("解析的密文是----------" + ByteBufUtil.hexDump(bizDataByteBuf)); +// ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(bizDataByteBuf), 1); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); - log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + //解密后报文 //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); @@ -112,16 +120,19 @@ for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); } - //数据发送,异步 + ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); + //存储数据 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - result=null; + //数据发送,异步,异常拦截 + ProtocolProcessEventListener.setTask(devcode, rex.getMessage(), 4); + result = null; frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); - }finally { -// GuavaCacheUtil.putCache("licValid",validLicResult); -// ValidateResult validLicResult = (ValidateResult) GuavaCacheUtil.getCache("licValid"); + } finally { + //数据发送,异步,转存整体数据 + ProtocolProcessEventListener.saveData(devcode, result); return result; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 8af55a6..e4a79ae 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -1,10 +1,13 @@ package com.casic.missiles.parser; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; +import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; @@ -12,6 +15,7 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -25,10 +29,28 @@ public class ProtocolParserSupport { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; + } + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + //打印源数据,设备编号 + ProcessEventTask processEventTask = ProcessEventTask.builder() + .devcode((String) parseFixedDataMap.get("devcode")) + .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte)) + .build(); + ProtocolProcessEventListener.asynAddTask(processEventTask); + return parseFixedDataMap; + } + /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -39,10 +61,8 @@ } String rulePrepareFields = protocolConfig.getRulePrepareFields(); //固定字段 - if (StringUtils.isNotEmpty(rulePrepareFields)) { - //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + if (StringUtils.isNotEmpty(rulePrepareFields) && ObjectUtil.isNotEmpty(parseFixedDataMap)) { + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap)); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index b162def..9c413ed 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,13 +1,13 @@ package com.casic.missiles.parser.matcher; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.*; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 8eb0682..23d1e4c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 4c02a81..e8506e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -1,10 +1,10 @@ package com.casic.missiles.parser.resolver.fields; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 204b4dc..54b4e58 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.rule; import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.pojo.RuleConfig; import lombok.extern.slf4j.Slf4j; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index 7c6350b..3d89d0d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.impl.KafkaSubscribe; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 68aca0e..81644ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -271,7 +271,7 @@ if (showSkip()) { return null; } - //获取缓存 + //缓存命中 if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { return (Map) singleObjects.get(FIXED_FIELD_DS); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java index 0523447..9dc64f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java @@ -1,7 +1,7 @@ package com.casic.missiles.provider; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FileNameEnums; import com.casic.missiles.parser.crc.CRC16; import com.casic.missiles.pojo.UpgradeFileResult; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index ddaadbe..c3a00ce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java index fe9fb77..d6fad15 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java @@ -1,6 +1,6 @@ package com.casic.missiles.replier.decorator; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import io.netty.buffer.ByteBuf; import org.bouncycastle.util.encoders.Hex; diff --git a/sensorhub-core/src/main/resources/config/application-bd.yml b/sensorhub-core/src/main/resources/config/application-bd.yml deleted file mode 100644 index 0a78bf1..0000000 --- a/sensorhub-core/src/main/resources/config/application-bd.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7080 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java new file mode 100644 index 0000000..88baf61 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java @@ -0,0 +1,174 @@ +package com.casic.missiles.cache; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.model.Device; +import com.casic.missiles.model.DeviceData; +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.pojo.ProcessEventTask; +import com.casic.missiles.service.IDeviceDataService; +import com.casic.missiles.service.impl.DeviceDataServiceImpl; +import com.casic.missiles.util.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 流程节点事件监听器 + */ +public class ProtocolProcessEventListener { + + private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); + + /** + * 异步生成缓存 + * + * @param processEventTask + */ + public static void asynAddTask(ProcessEventTask processEventTask) { + if (StringUtils.isNotEmpty(processEventTask.getDevcode())) { + GuavaCacheUtil.putCache(processEventTask.getDevcode(), processEventTask); + } + } + + /** + * 异步设置缓存 + * + * @param key + * @param json + */ + public static void setTask(String key, Object json, Integer node) { + //如果key为空,则直接返回 + if (StringUtils.isEmpty(key) || ObjectUtil.isEmpty(json)) { + return; + } + ProcessEventTask processEventTask = null; + switch (node) { + //解密前的数据 + case 1: + //如果为空可以补救 +// if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { +// processEventTask = ProcessEventTask.builder() +// .devcode(key) +// .decryptSoureData((String) json) +// .decryptBeforeData((String) json) +// .build(); +// asynAddTask(processEventTask); +// } else { +// processEventTask.setDecryptBeforeData((String) json); +// } +// break; + //解密后的数据 + case 2: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .decryptAfterData((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setDecryptAfterData((String) json); + } + break; + //解析的数据 + case 3: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .bizDataList((List) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setBizDataList((List) json); + } + break; + case 4: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .exceptionMsg((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setExceptionMsg((String) json); + } + break; + default: + return; + } + } + + /** + * 异步设置缓存 + * + * @param key + */ + public static ProcessEventTask getTask(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + return (ProcessEventTask) GuavaCacheUtil.getCache(key); + } + + /** + * 存库操作 + * + * @param devcode + */ + public static void saveData(String devcode, ParseResult result) { + //添加到线程池执行,异步存库 + threadPool.execute( + () -> { + ProcessEventTask processEventTask; + if (ObjectUtil.isNotEmpty(getTask(devcode))) { + synchronized (processEventTask = getTask(devcode)) { + IDeviceDataService deviceDataService = SpringContextUtil.getBean(DeviceDataServiceImpl.class); + if (ObjectUtil.isNotEmpty(processEventTask)) { + List deviceDataList = new ArrayList<>(); + for (Map BizDataMap : processEventTask.getBizDataList()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDevcode(processEventTask.getDevcode()); + deviceData.setDeviceType((Integer) BizDataMap.get("deviceType")); + deviceData.setUptime((String) BizDataMap.get("uptime")); + deviceData.setLogtime(new Date()); + deviceData.setDataJson(JSON.toJSONString(BizDataMap)); + deviceData.setDecryptBeforeData(processEventTask.getDecryptSoureData()); + deviceData.setDecryptAfterData(processEventTask.getDecryptAfterData()); + if (BizDataMap.containsKey("cell")) { + //电量不一定每次都有 + deviceData.setCell((Integer) BizDataMap.get("cell")); + } + if (BizDataMap.containsKey("dataValue")) { + //电量不一定每次都有 + deviceData.setDataValue((float) BizDataMap.get("dataValue")); + } + deviceData.setExceptionMsg(processEventTask.getExceptionMsg()); + deviceDataList.add(deviceData); + } + //批量保存 + deviceDataService.saveBatch(deviceDataList); + } + } + //移除缓存 + GuavaCacheUtil.remove(devcode); + } + } + ); + } + + //暂时不做设备的更新 + public void setDevice(String status) { + Device device = new Device(); + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java deleted file mode 100644 index 2f9c711..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.cache; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - - -public class listenerEvent { - - private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, - TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); - - /** - * 异步生成缓存 - * - * @param key - * @param json - */ - public void asynCreateLogCache(String key, String json) { - - - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 4e6beea..01b20f5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.cache.GuavaCacheUtil; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; import com.casic.missiles.exception.EngineException; @@ -56,12 +56,16 @@ } ParseResult result = null; + String devcode = null; try { //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + devcode = (String) parseFixedDataMap.get("devcode"); // 通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); + RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); if (ObjectUtil.isEmpty(ruleConfig)) { + //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); byteBuf.readBytes(protocolConfig.getPreFix().length()); @@ -94,10 +98,14 @@ } //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); - log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); + //解密前的报文 + log.debug("解析的密文是----------" + ByteBufUtil.hexDump(bizDataByteBuf)); +// ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(bizDataByteBuf), 1); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); - log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + //解密后报文 //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); @@ -112,16 +120,19 @@ for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); } - //数据发送,异步 + ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); + //存储数据 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - result=null; + //数据发送,异步,异常拦截 + ProtocolProcessEventListener.setTask(devcode, rex.getMessage(), 4); + result = null; frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); - }finally { -// GuavaCacheUtil.putCache("licValid",validLicResult); -// ValidateResult validLicResult = (ValidateResult) GuavaCacheUtil.getCache("licValid"); + } finally { + //数据发送,异步,转存整体数据 + ProtocolProcessEventListener.saveData(devcode, result); return result; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 8af55a6..e4a79ae 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -1,10 +1,13 @@ package com.casic.missiles.parser; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; +import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; @@ -12,6 +15,7 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -25,10 +29,28 @@ public class ProtocolParserSupport { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; + } + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + //打印源数据,设备编号 + ProcessEventTask processEventTask = ProcessEventTask.builder() + .devcode((String) parseFixedDataMap.get("devcode")) + .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte)) + .build(); + ProtocolProcessEventListener.asynAddTask(processEventTask); + return parseFixedDataMap; + } + /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -39,10 +61,8 @@ } String rulePrepareFields = protocolConfig.getRulePrepareFields(); //固定字段 - if (StringUtils.isNotEmpty(rulePrepareFields)) { - //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + if (StringUtils.isNotEmpty(rulePrepareFields) && ObjectUtil.isNotEmpty(parseFixedDataMap)) { + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap)); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index b162def..9c413ed 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,13 +1,13 @@ package com.casic.missiles.parser.matcher; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.*; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 8eb0682..23d1e4c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 4c02a81..e8506e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -1,10 +1,10 @@ package com.casic.missiles.parser.resolver.fields; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 204b4dc..54b4e58 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.rule; import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.pojo.RuleConfig; import lombok.extern.slf4j.Slf4j; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index 7c6350b..3d89d0d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.impl.KafkaSubscribe; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 68aca0e..81644ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -271,7 +271,7 @@ if (showSkip()) { return null; } - //获取缓存 + //缓存命中 if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { return (Map) singleObjects.get(FIXED_FIELD_DS); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java index 0523447..9dc64f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java @@ -1,7 +1,7 @@ package com.casic.missiles.provider; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FileNameEnums; import com.casic.missiles.parser.crc.CRC16; import com.casic.missiles.pojo.UpgradeFileResult; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index ddaadbe..c3a00ce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java index fe9fb77..d6fad15 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java @@ -1,6 +1,6 @@ package com.casic.missiles.replier.decorator; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import io.netty.buffer.ByteBuf; import org.bouncycastle.util.encoders.Hex; diff --git a/sensorhub-core/src/main/resources/config/application-bd.yml b/sensorhub-core/src/main/resources/config/application-bd.yml deleted file mode 100644 index 0a78bf1..0000000 --- a/sensorhub-core/src/main/resources/config/application-bd.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7080 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml deleted file mode 100644 index ec8d4b6..0000000 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7093 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java new file mode 100644 index 0000000..88baf61 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java @@ -0,0 +1,174 @@ +package com.casic.missiles.cache; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.model.Device; +import com.casic.missiles.model.DeviceData; +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.pojo.ProcessEventTask; +import com.casic.missiles.service.IDeviceDataService; +import com.casic.missiles.service.impl.DeviceDataServiceImpl; +import com.casic.missiles.util.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 流程节点事件监听器 + */ +public class ProtocolProcessEventListener { + + private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); + + /** + * 异步生成缓存 + * + * @param processEventTask + */ + public static void asynAddTask(ProcessEventTask processEventTask) { + if (StringUtils.isNotEmpty(processEventTask.getDevcode())) { + GuavaCacheUtil.putCache(processEventTask.getDevcode(), processEventTask); + } + } + + /** + * 异步设置缓存 + * + * @param key + * @param json + */ + public static void setTask(String key, Object json, Integer node) { + //如果key为空,则直接返回 + if (StringUtils.isEmpty(key) || ObjectUtil.isEmpty(json)) { + return; + } + ProcessEventTask processEventTask = null; + switch (node) { + //解密前的数据 + case 1: + //如果为空可以补救 +// if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { +// processEventTask = ProcessEventTask.builder() +// .devcode(key) +// .decryptSoureData((String) json) +// .decryptBeforeData((String) json) +// .build(); +// asynAddTask(processEventTask); +// } else { +// processEventTask.setDecryptBeforeData((String) json); +// } +// break; + //解密后的数据 + case 2: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .decryptAfterData((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setDecryptAfterData((String) json); + } + break; + //解析的数据 + case 3: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .bizDataList((List) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setBizDataList((List) json); + } + break; + case 4: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .exceptionMsg((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setExceptionMsg((String) json); + } + break; + default: + return; + } + } + + /** + * 异步设置缓存 + * + * @param key + */ + public static ProcessEventTask getTask(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + return (ProcessEventTask) GuavaCacheUtil.getCache(key); + } + + /** + * 存库操作 + * + * @param devcode + */ + public static void saveData(String devcode, ParseResult result) { + //添加到线程池执行,异步存库 + threadPool.execute( + () -> { + ProcessEventTask processEventTask; + if (ObjectUtil.isNotEmpty(getTask(devcode))) { + synchronized (processEventTask = getTask(devcode)) { + IDeviceDataService deviceDataService = SpringContextUtil.getBean(DeviceDataServiceImpl.class); + if (ObjectUtil.isNotEmpty(processEventTask)) { + List deviceDataList = new ArrayList<>(); + for (Map BizDataMap : processEventTask.getBizDataList()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDevcode(processEventTask.getDevcode()); + deviceData.setDeviceType((Integer) BizDataMap.get("deviceType")); + deviceData.setUptime((String) BizDataMap.get("uptime")); + deviceData.setLogtime(new Date()); + deviceData.setDataJson(JSON.toJSONString(BizDataMap)); + deviceData.setDecryptBeforeData(processEventTask.getDecryptSoureData()); + deviceData.setDecryptAfterData(processEventTask.getDecryptAfterData()); + if (BizDataMap.containsKey("cell")) { + //电量不一定每次都有 + deviceData.setCell((Integer) BizDataMap.get("cell")); + } + if (BizDataMap.containsKey("dataValue")) { + //电量不一定每次都有 + deviceData.setDataValue((float) BizDataMap.get("dataValue")); + } + deviceData.setExceptionMsg(processEventTask.getExceptionMsg()); + deviceDataList.add(deviceData); + } + //批量保存 + deviceDataService.saveBatch(deviceDataList); + } + } + //移除缓存 + GuavaCacheUtil.remove(devcode); + } + } + ); + } + + //暂时不做设备的更新 + public void setDevice(String status) { + Device device = new Device(); + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java deleted file mode 100644 index 2f9c711..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.cache; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - - -public class listenerEvent { - - private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, - TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); - - /** - * 异步生成缓存 - * - * @param key - * @param json - */ - public void asynCreateLogCache(String key, String json) { - - - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 4e6beea..01b20f5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.cache.GuavaCacheUtil; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; import com.casic.missiles.exception.EngineException; @@ -56,12 +56,16 @@ } ParseResult result = null; + String devcode = null; try { //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + devcode = (String) parseFixedDataMap.get("devcode"); // 通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); + RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); if (ObjectUtil.isEmpty(ruleConfig)) { + //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); byteBuf.readBytes(protocolConfig.getPreFix().length()); @@ -94,10 +98,14 @@ } //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); - log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); + //解密前的报文 + log.debug("解析的密文是----------" + ByteBufUtil.hexDump(bizDataByteBuf)); +// ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(bizDataByteBuf), 1); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); - log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + //解密后报文 //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); @@ -112,16 +120,19 @@ for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); } - //数据发送,异步 + ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); + //存储数据 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - result=null; + //数据发送,异步,异常拦截 + ProtocolProcessEventListener.setTask(devcode, rex.getMessage(), 4); + result = null; frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); - }finally { -// GuavaCacheUtil.putCache("licValid",validLicResult); -// ValidateResult validLicResult = (ValidateResult) GuavaCacheUtil.getCache("licValid"); + } finally { + //数据发送,异步,转存整体数据 + ProtocolProcessEventListener.saveData(devcode, result); return result; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 8af55a6..e4a79ae 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -1,10 +1,13 @@ package com.casic.missiles.parser; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; +import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; @@ -12,6 +15,7 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -25,10 +29,28 @@ public class ProtocolParserSupport { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; + } + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + //打印源数据,设备编号 + ProcessEventTask processEventTask = ProcessEventTask.builder() + .devcode((String) parseFixedDataMap.get("devcode")) + .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte)) + .build(); + ProtocolProcessEventListener.asynAddTask(processEventTask); + return parseFixedDataMap; + } + /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -39,10 +61,8 @@ } String rulePrepareFields = protocolConfig.getRulePrepareFields(); //固定字段 - if (StringUtils.isNotEmpty(rulePrepareFields)) { - //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + if (StringUtils.isNotEmpty(rulePrepareFields) && ObjectUtil.isNotEmpty(parseFixedDataMap)) { + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap)); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index b162def..9c413ed 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,13 +1,13 @@ package com.casic.missiles.parser.matcher; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.*; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 8eb0682..23d1e4c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 4c02a81..e8506e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -1,10 +1,10 @@ package com.casic.missiles.parser.resolver.fields; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 204b4dc..54b4e58 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.rule; import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.pojo.RuleConfig; import lombok.extern.slf4j.Slf4j; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index 7c6350b..3d89d0d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.impl.KafkaSubscribe; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 68aca0e..81644ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -271,7 +271,7 @@ if (showSkip()) { return null; } - //获取缓存 + //缓存命中 if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { return (Map) singleObjects.get(FIXED_FIELD_DS); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java index 0523447..9dc64f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java @@ -1,7 +1,7 @@ package com.casic.missiles.provider; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FileNameEnums; import com.casic.missiles.parser.crc.CRC16; import com.casic.missiles.pojo.UpgradeFileResult; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index ddaadbe..c3a00ce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java index fe9fb77..d6fad15 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java @@ -1,6 +1,6 @@ package com.casic.missiles.replier.decorator; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import io.netty.buffer.ByteBuf; import org.bouncycastle.util.encoders.Hex; diff --git a/sensorhub-core/src/main/resources/config/application-bd.yml b/sensorhub-core/src/main/resources/config/application-bd.yml deleted file mode 100644 index 0a78bf1..0000000 --- a/sensorhub-core/src/main/resources/config/application-bd.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7080 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml deleted file mode 100644 index ec8d4b6..0000000 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7093 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml deleted file mode 100644 index 4dfc9ee..0000000 --- a/sensorhub-core/src/main/resources/config/application.yml +++ /dev/null @@ -1,78 +0,0 @@ -########################################################## -spring: - profiles: - active: dev - servlet: - multipart: - max-file-size: 50MB - max-request-size: 80MB - mvc: - pathmatch: - matching-strategy: ant_path_matcher - kafka: - #kafka配置 - producer: - # Kafka服务器 - bootstrap-servers: '111.198.10.15:12502' - transaction-id-prefix: kafkaTx- - retries: 3 - acks: all - batch-size: 16384 - buffer-memory: 1024000 - consumer: - # Kafka服务器 - bootstrap-servers: '111.198.10.15:12502' - group-id: 1 - auto-offset-reset: latest - enable-auto-commit: false - max-poll-records: 3 - properties: - max: - poll: - interval: - ms: 600000 - session: - timeout: - ms: 10000 - listener: - concurrency: 4 - ack-mode: manual_immediate - missing-topics-fatal: false - cache: - redis: - time-to-live: 600000 # 缓存默认有效时长,以毫秒为单位 - type: redis #指定使用redis作为缓存 -mybatis-plus: - global-config: - enable-sql-runner: true - #关闭配置数据库下划线字段转驼峰 - configuration: - map-underscore-to-camel-case: true - # 配置结果集属性为空时 是否映射返回结果 - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 - mapper-locations: classpath*:mapper/*.xml -mybatis: - mapper-locations: classpath*:mapper/*.xml -#mybatis-plus: -# sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector -casic: - device: - redis: - invalid-time: 86400 - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - config-prefix: 'Casic:' - serializer: org.springframework.data.redis.serializer.StringRedisSerializer - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -#代码生成器配置 -code: - generate: - #作者 - author: cz - #待生成对象表名 - table-name: bussiness_field_config,combined_field_config -sensorhub: - config: - port: 7092 - secret: \ No newline at end of file diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java new file mode 100644 index 0000000..88baf61 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java @@ -0,0 +1,174 @@ +package com.casic.missiles.cache; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.model.Device; +import com.casic.missiles.model.DeviceData; +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.pojo.ProcessEventTask; +import com.casic.missiles.service.IDeviceDataService; +import com.casic.missiles.service.impl.DeviceDataServiceImpl; +import com.casic.missiles.util.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 流程节点事件监听器 + */ +public class ProtocolProcessEventListener { + + private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); + + /** + * 异步生成缓存 + * + * @param processEventTask + */ + public static void asynAddTask(ProcessEventTask processEventTask) { + if (StringUtils.isNotEmpty(processEventTask.getDevcode())) { + GuavaCacheUtil.putCache(processEventTask.getDevcode(), processEventTask); + } + } + + /** + * 异步设置缓存 + * + * @param key + * @param json + */ + public static void setTask(String key, Object json, Integer node) { + //如果key为空,则直接返回 + if (StringUtils.isEmpty(key) || ObjectUtil.isEmpty(json)) { + return; + } + ProcessEventTask processEventTask = null; + switch (node) { + //解密前的数据 + case 1: + //如果为空可以补救 +// if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { +// processEventTask = ProcessEventTask.builder() +// .devcode(key) +// .decryptSoureData((String) json) +// .decryptBeforeData((String) json) +// .build(); +// asynAddTask(processEventTask); +// } else { +// processEventTask.setDecryptBeforeData((String) json); +// } +// break; + //解密后的数据 + case 2: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .decryptAfterData((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setDecryptAfterData((String) json); + } + break; + //解析的数据 + case 3: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .bizDataList((List) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setBizDataList((List) json); + } + break; + case 4: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .exceptionMsg((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setExceptionMsg((String) json); + } + break; + default: + return; + } + } + + /** + * 异步设置缓存 + * + * @param key + */ + public static ProcessEventTask getTask(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + return (ProcessEventTask) GuavaCacheUtil.getCache(key); + } + + /** + * 存库操作 + * + * @param devcode + */ + public static void saveData(String devcode, ParseResult result) { + //添加到线程池执行,异步存库 + threadPool.execute( + () -> { + ProcessEventTask processEventTask; + if (ObjectUtil.isNotEmpty(getTask(devcode))) { + synchronized (processEventTask = getTask(devcode)) { + IDeviceDataService deviceDataService = SpringContextUtil.getBean(DeviceDataServiceImpl.class); + if (ObjectUtil.isNotEmpty(processEventTask)) { + List deviceDataList = new ArrayList<>(); + for (Map BizDataMap : processEventTask.getBizDataList()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDevcode(processEventTask.getDevcode()); + deviceData.setDeviceType((Integer) BizDataMap.get("deviceType")); + deviceData.setUptime((String) BizDataMap.get("uptime")); + deviceData.setLogtime(new Date()); + deviceData.setDataJson(JSON.toJSONString(BizDataMap)); + deviceData.setDecryptBeforeData(processEventTask.getDecryptSoureData()); + deviceData.setDecryptAfterData(processEventTask.getDecryptAfterData()); + if (BizDataMap.containsKey("cell")) { + //电量不一定每次都有 + deviceData.setCell((Integer) BizDataMap.get("cell")); + } + if (BizDataMap.containsKey("dataValue")) { + //电量不一定每次都有 + deviceData.setDataValue((float) BizDataMap.get("dataValue")); + } + deviceData.setExceptionMsg(processEventTask.getExceptionMsg()); + deviceDataList.add(deviceData); + } + //批量保存 + deviceDataService.saveBatch(deviceDataList); + } + } + //移除缓存 + GuavaCacheUtil.remove(devcode); + } + } + ); + } + + //暂时不做设备的更新 + public void setDevice(String status) { + Device device = new Device(); + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java deleted file mode 100644 index 2f9c711..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.cache; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - - -public class listenerEvent { - - private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, - TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); - - /** - * 异步生成缓存 - * - * @param key - * @param json - */ - public void asynCreateLogCache(String key, String json) { - - - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 4e6beea..01b20f5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.cache.GuavaCacheUtil; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; import com.casic.missiles.exception.EngineException; @@ -56,12 +56,16 @@ } ParseResult result = null; + String devcode = null; try { //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + devcode = (String) parseFixedDataMap.get("devcode"); // 通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); + RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); if (ObjectUtil.isEmpty(ruleConfig)) { + //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); byteBuf.readBytes(protocolConfig.getPreFix().length()); @@ -94,10 +98,14 @@ } //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); - log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); + //解密前的报文 + log.debug("解析的密文是----------" + ByteBufUtil.hexDump(bizDataByteBuf)); +// ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(bizDataByteBuf), 1); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); - log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + //解密后报文 //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); @@ -112,16 +120,19 @@ for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); } - //数据发送,异步 + ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); + //存储数据 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - result=null; + //数据发送,异步,异常拦截 + ProtocolProcessEventListener.setTask(devcode, rex.getMessage(), 4); + result = null; frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); - }finally { -// GuavaCacheUtil.putCache("licValid",validLicResult); -// ValidateResult validLicResult = (ValidateResult) GuavaCacheUtil.getCache("licValid"); + } finally { + //数据发送,异步,转存整体数据 + ProtocolProcessEventListener.saveData(devcode, result); return result; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 8af55a6..e4a79ae 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -1,10 +1,13 @@ package com.casic.missiles.parser; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; +import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; @@ -12,6 +15,7 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -25,10 +29,28 @@ public class ProtocolParserSupport { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; + } + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + //打印源数据,设备编号 + ProcessEventTask processEventTask = ProcessEventTask.builder() + .devcode((String) parseFixedDataMap.get("devcode")) + .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte)) + .build(); + ProtocolProcessEventListener.asynAddTask(processEventTask); + return parseFixedDataMap; + } + /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -39,10 +61,8 @@ } String rulePrepareFields = protocolConfig.getRulePrepareFields(); //固定字段 - if (StringUtils.isNotEmpty(rulePrepareFields)) { - //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + if (StringUtils.isNotEmpty(rulePrepareFields) && ObjectUtil.isNotEmpty(parseFixedDataMap)) { + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap)); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index b162def..9c413ed 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,13 +1,13 @@ package com.casic.missiles.parser.matcher; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.*; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 8eb0682..23d1e4c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 4c02a81..e8506e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -1,10 +1,10 @@ package com.casic.missiles.parser.resolver.fields; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 204b4dc..54b4e58 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.rule; import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.pojo.RuleConfig; import lombok.extern.slf4j.Slf4j; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index 7c6350b..3d89d0d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.impl.KafkaSubscribe; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 68aca0e..81644ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -271,7 +271,7 @@ if (showSkip()) { return null; } - //获取缓存 + //缓存命中 if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { return (Map) singleObjects.get(FIXED_FIELD_DS); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java index 0523447..9dc64f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java @@ -1,7 +1,7 @@ package com.casic.missiles.provider; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FileNameEnums; import com.casic.missiles.parser.crc.CRC16; import com.casic.missiles.pojo.UpgradeFileResult; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index ddaadbe..c3a00ce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java index fe9fb77..d6fad15 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java @@ -1,6 +1,6 @@ package com.casic.missiles.replier.decorator; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import io.netty.buffer.ByteBuf; import org.bouncycastle.util.encoders.Hex; diff --git a/sensorhub-core/src/main/resources/config/application-bd.yml b/sensorhub-core/src/main/resources/config/application-bd.yml deleted file mode 100644 index 0a78bf1..0000000 --- a/sensorhub-core/src/main/resources/config/application-bd.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7080 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml deleted file mode 100644 index ec8d4b6..0000000 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7093 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml deleted file mode 100644 index 4dfc9ee..0000000 --- a/sensorhub-core/src/main/resources/config/application.yml +++ /dev/null @@ -1,78 +0,0 @@ -########################################################## -spring: - profiles: - active: dev - servlet: - multipart: - max-file-size: 50MB - max-request-size: 80MB - mvc: - pathmatch: - matching-strategy: ant_path_matcher - kafka: - #kafka配置 - producer: - # Kafka服务器 - bootstrap-servers: '111.198.10.15:12502' - transaction-id-prefix: kafkaTx- - retries: 3 - acks: all - batch-size: 16384 - buffer-memory: 1024000 - consumer: - # Kafka服务器 - bootstrap-servers: '111.198.10.15:12502' - group-id: 1 - auto-offset-reset: latest - enable-auto-commit: false - max-poll-records: 3 - properties: - max: - poll: - interval: - ms: 600000 - session: - timeout: - ms: 10000 - listener: - concurrency: 4 - ack-mode: manual_immediate - missing-topics-fatal: false - cache: - redis: - time-to-live: 600000 # 缓存默认有效时长,以毫秒为单位 - type: redis #指定使用redis作为缓存 -mybatis-plus: - global-config: - enable-sql-runner: true - #关闭配置数据库下划线字段转驼峰 - configuration: - map-underscore-to-camel-case: true - # 配置结果集属性为空时 是否映射返回结果 - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 - mapper-locations: classpath*:mapper/*.xml -mybatis: - mapper-locations: classpath*:mapper/*.xml -#mybatis-plus: -# sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector -casic: - device: - redis: - invalid-time: 86400 - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - config-prefix: 'Casic:' - serializer: org.springframework.data.redis.serializer.StringRedisSerializer - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -#代码生成器配置 -code: - generate: - #作者 - author: cz - #待生成对象表名 - table-name: bussiness_field_config,combined_field_config -sensorhub: - config: - port: 7092 - secret: \ No newline at end of file diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index bfbec51..ff24f09 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -18,6 +18,7 @@ spring-boot-starter-web ${boot.version} + org.springframework.boot spring-boot-starter-test @@ -63,16 +64,6 @@ 1.71 - - - org.springframework.boot - spring-boot-starter-cache - - - - org.apache.commons - commons-pool2 - org.springframework.boot diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java new file mode 100644 index 0000000..88baf61 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java @@ -0,0 +1,174 @@ +package com.casic.missiles.cache; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.model.Device; +import com.casic.missiles.model.DeviceData; +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.pojo.ProcessEventTask; +import com.casic.missiles.service.IDeviceDataService; +import com.casic.missiles.service.impl.DeviceDataServiceImpl; +import com.casic.missiles.util.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 流程节点事件监听器 + */ +public class ProtocolProcessEventListener { + + private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); + + /** + * 异步生成缓存 + * + * @param processEventTask + */ + public static void asynAddTask(ProcessEventTask processEventTask) { + if (StringUtils.isNotEmpty(processEventTask.getDevcode())) { + GuavaCacheUtil.putCache(processEventTask.getDevcode(), processEventTask); + } + } + + /** + * 异步设置缓存 + * + * @param key + * @param json + */ + public static void setTask(String key, Object json, Integer node) { + //如果key为空,则直接返回 + if (StringUtils.isEmpty(key) || ObjectUtil.isEmpty(json)) { + return; + } + ProcessEventTask processEventTask = null; + switch (node) { + //解密前的数据 + case 1: + //如果为空可以补救 +// if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { +// processEventTask = ProcessEventTask.builder() +// .devcode(key) +// .decryptSoureData((String) json) +// .decryptBeforeData((String) json) +// .build(); +// asynAddTask(processEventTask); +// } else { +// processEventTask.setDecryptBeforeData((String) json); +// } +// break; + //解密后的数据 + case 2: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .decryptAfterData((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setDecryptAfterData((String) json); + } + break; + //解析的数据 + case 3: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .bizDataList((List) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setBizDataList((List) json); + } + break; + case 4: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .exceptionMsg((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setExceptionMsg((String) json); + } + break; + default: + return; + } + } + + /** + * 异步设置缓存 + * + * @param key + */ + public static ProcessEventTask getTask(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + return (ProcessEventTask) GuavaCacheUtil.getCache(key); + } + + /** + * 存库操作 + * + * @param devcode + */ + public static void saveData(String devcode, ParseResult result) { + //添加到线程池执行,异步存库 + threadPool.execute( + () -> { + ProcessEventTask processEventTask; + if (ObjectUtil.isNotEmpty(getTask(devcode))) { + synchronized (processEventTask = getTask(devcode)) { + IDeviceDataService deviceDataService = SpringContextUtil.getBean(DeviceDataServiceImpl.class); + if (ObjectUtil.isNotEmpty(processEventTask)) { + List deviceDataList = new ArrayList<>(); + for (Map BizDataMap : processEventTask.getBizDataList()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDevcode(processEventTask.getDevcode()); + deviceData.setDeviceType((Integer) BizDataMap.get("deviceType")); + deviceData.setUptime((String) BizDataMap.get("uptime")); + deviceData.setLogtime(new Date()); + deviceData.setDataJson(JSON.toJSONString(BizDataMap)); + deviceData.setDecryptBeforeData(processEventTask.getDecryptSoureData()); + deviceData.setDecryptAfterData(processEventTask.getDecryptAfterData()); + if (BizDataMap.containsKey("cell")) { + //电量不一定每次都有 + deviceData.setCell((Integer) BizDataMap.get("cell")); + } + if (BizDataMap.containsKey("dataValue")) { + //电量不一定每次都有 + deviceData.setDataValue((float) BizDataMap.get("dataValue")); + } + deviceData.setExceptionMsg(processEventTask.getExceptionMsg()); + deviceDataList.add(deviceData); + } + //批量保存 + deviceDataService.saveBatch(deviceDataList); + } + } + //移除缓存 + GuavaCacheUtil.remove(devcode); + } + } + ); + } + + //暂时不做设备的更新 + public void setDevice(String status) { + Device device = new Device(); + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java deleted file mode 100644 index 2f9c711..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.cache; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - - -public class listenerEvent { - - private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, - TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); - - /** - * 异步生成缓存 - * - * @param key - * @param json - */ - public void asynCreateLogCache(String key, String json) { - - - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 4e6beea..01b20f5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.cache.GuavaCacheUtil; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; import com.casic.missiles.exception.EngineException; @@ -56,12 +56,16 @@ } ParseResult result = null; + String devcode = null; try { //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + devcode = (String) parseFixedDataMap.get("devcode"); // 通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); + RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); if (ObjectUtil.isEmpty(ruleConfig)) { + //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); byteBuf.readBytes(protocolConfig.getPreFix().length()); @@ -94,10 +98,14 @@ } //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); - log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); + //解密前的报文 + log.debug("解析的密文是----------" + ByteBufUtil.hexDump(bizDataByteBuf)); +// ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(bizDataByteBuf), 1); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); - log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + //解密后报文 //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); @@ -112,16 +120,19 @@ for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); } - //数据发送,异步 + ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); + //存储数据 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - result=null; + //数据发送,异步,异常拦截 + ProtocolProcessEventListener.setTask(devcode, rex.getMessage(), 4); + result = null; frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); - }finally { -// GuavaCacheUtil.putCache("licValid",validLicResult); -// ValidateResult validLicResult = (ValidateResult) GuavaCacheUtil.getCache("licValid"); + } finally { + //数据发送,异步,转存整体数据 + ProtocolProcessEventListener.saveData(devcode, result); return result; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 8af55a6..e4a79ae 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -1,10 +1,13 @@ package com.casic.missiles.parser; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; +import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; @@ -12,6 +15,7 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -25,10 +29,28 @@ public class ProtocolParserSupport { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; + } + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + //打印源数据,设备编号 + ProcessEventTask processEventTask = ProcessEventTask.builder() + .devcode((String) parseFixedDataMap.get("devcode")) + .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte)) + .build(); + ProtocolProcessEventListener.asynAddTask(processEventTask); + return parseFixedDataMap; + } + /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -39,10 +61,8 @@ } String rulePrepareFields = protocolConfig.getRulePrepareFields(); //固定字段 - if (StringUtils.isNotEmpty(rulePrepareFields)) { - //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + if (StringUtils.isNotEmpty(rulePrepareFields) && ObjectUtil.isNotEmpty(parseFixedDataMap)) { + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap)); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index b162def..9c413ed 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,13 +1,13 @@ package com.casic.missiles.parser.matcher; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.*; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 8eb0682..23d1e4c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 4c02a81..e8506e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -1,10 +1,10 @@ package com.casic.missiles.parser.resolver.fields; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 204b4dc..54b4e58 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.rule; import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.pojo.RuleConfig; import lombok.extern.slf4j.Slf4j; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index 7c6350b..3d89d0d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.impl.KafkaSubscribe; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 68aca0e..81644ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -271,7 +271,7 @@ if (showSkip()) { return null; } - //获取缓存 + //缓存命中 if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { return (Map) singleObjects.get(FIXED_FIELD_DS); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java index 0523447..9dc64f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java @@ -1,7 +1,7 @@ package com.casic.missiles.provider; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FileNameEnums; import com.casic.missiles.parser.crc.CRC16; import com.casic.missiles.pojo.UpgradeFileResult; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index ddaadbe..c3a00ce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java index fe9fb77..d6fad15 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java @@ -1,6 +1,6 @@ package com.casic.missiles.replier.decorator; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import io.netty.buffer.ByteBuf; import org.bouncycastle.util.encoders.Hex; diff --git a/sensorhub-core/src/main/resources/config/application-bd.yml b/sensorhub-core/src/main/resources/config/application-bd.yml deleted file mode 100644 index 0a78bf1..0000000 --- a/sensorhub-core/src/main/resources/config/application-bd.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7080 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml deleted file mode 100644 index ec8d4b6..0000000 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7093 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml deleted file mode 100644 index 4dfc9ee..0000000 --- a/sensorhub-core/src/main/resources/config/application.yml +++ /dev/null @@ -1,78 +0,0 @@ -########################################################## -spring: - profiles: - active: dev - servlet: - multipart: - max-file-size: 50MB - max-request-size: 80MB - mvc: - pathmatch: - matching-strategy: ant_path_matcher - kafka: - #kafka配置 - producer: - # Kafka服务器 - bootstrap-servers: '111.198.10.15:12502' - transaction-id-prefix: kafkaTx- - retries: 3 - acks: all - batch-size: 16384 - buffer-memory: 1024000 - consumer: - # Kafka服务器 - bootstrap-servers: '111.198.10.15:12502' - group-id: 1 - auto-offset-reset: latest - enable-auto-commit: false - max-poll-records: 3 - properties: - max: - poll: - interval: - ms: 600000 - session: - timeout: - ms: 10000 - listener: - concurrency: 4 - ack-mode: manual_immediate - missing-topics-fatal: false - cache: - redis: - time-to-live: 600000 # 缓存默认有效时长,以毫秒为单位 - type: redis #指定使用redis作为缓存 -mybatis-plus: - global-config: - enable-sql-runner: true - #关闭配置数据库下划线字段转驼峰 - configuration: - map-underscore-to-camel-case: true - # 配置结果集属性为空时 是否映射返回结果 - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 - mapper-locations: classpath*:mapper/*.xml -mybatis: - mapper-locations: classpath*:mapper/*.xml -#mybatis-plus: -# sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector -casic: - device: - redis: - invalid-time: 86400 - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - config-prefix: 'Casic:' - serializer: org.springframework.data.redis.serializer.StringRedisSerializer - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -#代码生成器配置 -code: - generate: - #作者 - author: cz - #待生成对象表名 - table-name: bussiness_field_config,combined_field_config -sensorhub: - config: - port: 7092 - secret: \ No newline at end of file diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index bfbec51..ff24f09 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -18,6 +18,7 @@ spring-boot-starter-web ${boot.version} + org.springframework.boot spring-boot-starter-test @@ -63,16 +64,6 @@ 1.71 - - - org.springframework.boot - spring-boot-starter-cache - - - - org.apache.commons - commons-pool2 - org.springframework.boot diff --git a/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java index f0ebbbc..fcbde85 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java @@ -50,7 +50,7 @@ * 指定使用哪一种缓存 * @return */ - @Bean + @Bean("redisCacheManager") @Override public CacheManager cacheManager() { RedisSerializer redisSerializer = new StringRedisSerializer(); diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java new file mode 100644 index 0000000..88baf61 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java @@ -0,0 +1,174 @@ +package com.casic.missiles.cache; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.model.Device; +import com.casic.missiles.model.DeviceData; +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.pojo.ProcessEventTask; +import com.casic.missiles.service.IDeviceDataService; +import com.casic.missiles.service.impl.DeviceDataServiceImpl; +import com.casic.missiles.util.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 流程节点事件监听器 + */ +public class ProtocolProcessEventListener { + + private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); + + /** + * 异步生成缓存 + * + * @param processEventTask + */ + public static void asynAddTask(ProcessEventTask processEventTask) { + if (StringUtils.isNotEmpty(processEventTask.getDevcode())) { + GuavaCacheUtil.putCache(processEventTask.getDevcode(), processEventTask); + } + } + + /** + * 异步设置缓存 + * + * @param key + * @param json + */ + public static void setTask(String key, Object json, Integer node) { + //如果key为空,则直接返回 + if (StringUtils.isEmpty(key) || ObjectUtil.isEmpty(json)) { + return; + } + ProcessEventTask processEventTask = null; + switch (node) { + //解密前的数据 + case 1: + //如果为空可以补救 +// if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { +// processEventTask = ProcessEventTask.builder() +// .devcode(key) +// .decryptSoureData((String) json) +// .decryptBeforeData((String) json) +// .build(); +// asynAddTask(processEventTask); +// } else { +// processEventTask.setDecryptBeforeData((String) json); +// } +// break; + //解密后的数据 + case 2: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .decryptAfterData((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setDecryptAfterData((String) json); + } + break; + //解析的数据 + case 3: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .bizDataList((List) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setBizDataList((List) json); + } + break; + case 4: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .exceptionMsg((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setExceptionMsg((String) json); + } + break; + default: + return; + } + } + + /** + * 异步设置缓存 + * + * @param key + */ + public static ProcessEventTask getTask(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + return (ProcessEventTask) GuavaCacheUtil.getCache(key); + } + + /** + * 存库操作 + * + * @param devcode + */ + public static void saveData(String devcode, ParseResult result) { + //添加到线程池执行,异步存库 + threadPool.execute( + () -> { + ProcessEventTask processEventTask; + if (ObjectUtil.isNotEmpty(getTask(devcode))) { + synchronized (processEventTask = getTask(devcode)) { + IDeviceDataService deviceDataService = SpringContextUtil.getBean(DeviceDataServiceImpl.class); + if (ObjectUtil.isNotEmpty(processEventTask)) { + List deviceDataList = new ArrayList<>(); + for (Map BizDataMap : processEventTask.getBizDataList()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDevcode(processEventTask.getDevcode()); + deviceData.setDeviceType((Integer) BizDataMap.get("deviceType")); + deviceData.setUptime((String) BizDataMap.get("uptime")); + deviceData.setLogtime(new Date()); + deviceData.setDataJson(JSON.toJSONString(BizDataMap)); + deviceData.setDecryptBeforeData(processEventTask.getDecryptSoureData()); + deviceData.setDecryptAfterData(processEventTask.getDecryptAfterData()); + if (BizDataMap.containsKey("cell")) { + //电量不一定每次都有 + deviceData.setCell((Integer) BizDataMap.get("cell")); + } + if (BizDataMap.containsKey("dataValue")) { + //电量不一定每次都有 + deviceData.setDataValue((float) BizDataMap.get("dataValue")); + } + deviceData.setExceptionMsg(processEventTask.getExceptionMsg()); + deviceDataList.add(deviceData); + } + //批量保存 + deviceDataService.saveBatch(deviceDataList); + } + } + //移除缓存 + GuavaCacheUtil.remove(devcode); + } + } + ); + } + + //暂时不做设备的更新 + public void setDevice(String status) { + Device device = new Device(); + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java deleted file mode 100644 index 2f9c711..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.cache; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - - -public class listenerEvent { - - private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, - TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); - - /** - * 异步生成缓存 - * - * @param key - * @param json - */ - public void asynCreateLogCache(String key, String json) { - - - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 4e6beea..01b20f5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.cache.GuavaCacheUtil; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; import com.casic.missiles.exception.EngineException; @@ -56,12 +56,16 @@ } ParseResult result = null; + String devcode = null; try { //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + devcode = (String) parseFixedDataMap.get("devcode"); // 通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); + RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); if (ObjectUtil.isEmpty(ruleConfig)) { + //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); byteBuf.readBytes(protocolConfig.getPreFix().length()); @@ -94,10 +98,14 @@ } //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); - log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); + //解密前的报文 + log.debug("解析的密文是----------" + ByteBufUtil.hexDump(bizDataByteBuf)); +// ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(bizDataByteBuf), 1); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); - log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + //解密后报文 //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); @@ -112,16 +120,19 @@ for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); } - //数据发送,异步 + ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); + //存储数据 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - result=null; + //数据发送,异步,异常拦截 + ProtocolProcessEventListener.setTask(devcode, rex.getMessage(), 4); + result = null; frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); - }finally { -// GuavaCacheUtil.putCache("licValid",validLicResult); -// ValidateResult validLicResult = (ValidateResult) GuavaCacheUtil.getCache("licValid"); + } finally { + //数据发送,异步,转存整体数据 + ProtocolProcessEventListener.saveData(devcode, result); return result; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 8af55a6..e4a79ae 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -1,10 +1,13 @@ package com.casic.missiles.parser; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; +import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; @@ -12,6 +15,7 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -25,10 +29,28 @@ public class ProtocolParserSupport { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; + } + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + //打印源数据,设备编号 + ProcessEventTask processEventTask = ProcessEventTask.builder() + .devcode((String) parseFixedDataMap.get("devcode")) + .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte)) + .build(); + ProtocolProcessEventListener.asynAddTask(processEventTask); + return parseFixedDataMap; + } + /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -39,10 +61,8 @@ } String rulePrepareFields = protocolConfig.getRulePrepareFields(); //固定字段 - if (StringUtils.isNotEmpty(rulePrepareFields)) { - //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + if (StringUtils.isNotEmpty(rulePrepareFields) && ObjectUtil.isNotEmpty(parseFixedDataMap)) { + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap)); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index b162def..9c413ed 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,13 +1,13 @@ package com.casic.missiles.parser.matcher; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.*; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 8eb0682..23d1e4c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 4c02a81..e8506e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -1,10 +1,10 @@ package com.casic.missiles.parser.resolver.fields; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 204b4dc..54b4e58 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.rule; import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.pojo.RuleConfig; import lombok.extern.slf4j.Slf4j; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index 7c6350b..3d89d0d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.impl.KafkaSubscribe; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 68aca0e..81644ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -271,7 +271,7 @@ if (showSkip()) { return null; } - //获取缓存 + //缓存命中 if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { return (Map) singleObjects.get(FIXED_FIELD_DS); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java index 0523447..9dc64f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java @@ -1,7 +1,7 @@ package com.casic.missiles.provider; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FileNameEnums; import com.casic.missiles.parser.crc.CRC16; import com.casic.missiles.pojo.UpgradeFileResult; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index ddaadbe..c3a00ce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java index fe9fb77..d6fad15 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java @@ -1,6 +1,6 @@ package com.casic.missiles.replier.decorator; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import io.netty.buffer.ByteBuf; import org.bouncycastle.util.encoders.Hex; diff --git a/sensorhub-core/src/main/resources/config/application-bd.yml b/sensorhub-core/src/main/resources/config/application-bd.yml deleted file mode 100644 index 0a78bf1..0000000 --- a/sensorhub-core/src/main/resources/config/application-bd.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7080 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml deleted file mode 100644 index ec8d4b6..0000000 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7093 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml deleted file mode 100644 index 4dfc9ee..0000000 --- a/sensorhub-core/src/main/resources/config/application.yml +++ /dev/null @@ -1,78 +0,0 @@ -########################################################## -spring: - profiles: - active: dev - servlet: - multipart: - max-file-size: 50MB - max-request-size: 80MB - mvc: - pathmatch: - matching-strategy: ant_path_matcher - kafka: - #kafka配置 - producer: - # Kafka服务器 - bootstrap-servers: '111.198.10.15:12502' - transaction-id-prefix: kafkaTx- - retries: 3 - acks: all - batch-size: 16384 - buffer-memory: 1024000 - consumer: - # Kafka服务器 - bootstrap-servers: '111.198.10.15:12502' - group-id: 1 - auto-offset-reset: latest - enable-auto-commit: false - max-poll-records: 3 - properties: - max: - poll: - interval: - ms: 600000 - session: - timeout: - ms: 10000 - listener: - concurrency: 4 - ack-mode: manual_immediate - missing-topics-fatal: false - cache: - redis: - time-to-live: 600000 # 缓存默认有效时长,以毫秒为单位 - type: redis #指定使用redis作为缓存 -mybatis-plus: - global-config: - enable-sql-runner: true - #关闭配置数据库下划线字段转驼峰 - configuration: - map-underscore-to-camel-case: true - # 配置结果集属性为空时 是否映射返回结果 - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 - mapper-locations: classpath*:mapper/*.xml -mybatis: - mapper-locations: classpath*:mapper/*.xml -#mybatis-plus: -# sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector -casic: - device: - redis: - invalid-time: 86400 - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - config-prefix: 'Casic:' - serializer: org.springframework.data.redis.serializer.StringRedisSerializer - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -#代码生成器配置 -code: - generate: - #作者 - author: cz - #待生成对象表名 - table-name: bussiness_field_config,combined_field_config -sensorhub: - config: - port: 7092 - secret: \ No newline at end of file diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index bfbec51..ff24f09 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -18,6 +18,7 @@ spring-boot-starter-web ${boot.version} + org.springframework.boot spring-boot-starter-test @@ -63,16 +64,6 @@ 1.71 - - - org.springframework.boot - spring-boot-starter-cache - - - - org.apache.commons - commons-pool2 - org.springframework.boot diff --git a/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java index f0ebbbc..fcbde85 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java @@ -50,7 +50,7 @@ * 指定使用哪一种缓存 * @return */ - @Bean + @Bean("redisCacheManager") @Override public CacheManager cacheManager() { RedisSerializer redisSerializer = new StringRedisSerializer(); diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java index 31b0bdd..623eeb1 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java @@ -1,5 +1,6 @@ package com.casic.missiles.mapper; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.pojo.SubscribeConfig; import org.apache.ibatis.annotations.Mapper; @@ -8,9 +9,7 @@ * @author cz * */ -@Mapper public interface SubscribeConfigMapper extends BaseMapper { - } diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java new file mode 100644 index 0000000..88baf61 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java @@ -0,0 +1,174 @@ +package com.casic.missiles.cache; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.model.Device; +import com.casic.missiles.model.DeviceData; +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.pojo.ProcessEventTask; +import com.casic.missiles.service.IDeviceDataService; +import com.casic.missiles.service.impl.DeviceDataServiceImpl; +import com.casic.missiles.util.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 流程节点事件监听器 + */ +public class ProtocolProcessEventListener { + + private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); + + /** + * 异步生成缓存 + * + * @param processEventTask + */ + public static void asynAddTask(ProcessEventTask processEventTask) { + if (StringUtils.isNotEmpty(processEventTask.getDevcode())) { + GuavaCacheUtil.putCache(processEventTask.getDevcode(), processEventTask); + } + } + + /** + * 异步设置缓存 + * + * @param key + * @param json + */ + public static void setTask(String key, Object json, Integer node) { + //如果key为空,则直接返回 + if (StringUtils.isEmpty(key) || ObjectUtil.isEmpty(json)) { + return; + } + ProcessEventTask processEventTask = null; + switch (node) { + //解密前的数据 + case 1: + //如果为空可以补救 +// if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { +// processEventTask = ProcessEventTask.builder() +// .devcode(key) +// .decryptSoureData((String) json) +// .decryptBeforeData((String) json) +// .build(); +// asynAddTask(processEventTask); +// } else { +// processEventTask.setDecryptBeforeData((String) json); +// } +// break; + //解密后的数据 + case 2: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .decryptAfterData((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setDecryptAfterData((String) json); + } + break; + //解析的数据 + case 3: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .bizDataList((List) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setBizDataList((List) json); + } + break; + case 4: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .exceptionMsg((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setExceptionMsg((String) json); + } + break; + default: + return; + } + } + + /** + * 异步设置缓存 + * + * @param key + */ + public static ProcessEventTask getTask(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + return (ProcessEventTask) GuavaCacheUtil.getCache(key); + } + + /** + * 存库操作 + * + * @param devcode + */ + public static void saveData(String devcode, ParseResult result) { + //添加到线程池执行,异步存库 + threadPool.execute( + () -> { + ProcessEventTask processEventTask; + if (ObjectUtil.isNotEmpty(getTask(devcode))) { + synchronized (processEventTask = getTask(devcode)) { + IDeviceDataService deviceDataService = SpringContextUtil.getBean(DeviceDataServiceImpl.class); + if (ObjectUtil.isNotEmpty(processEventTask)) { + List deviceDataList = new ArrayList<>(); + for (Map BizDataMap : processEventTask.getBizDataList()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDevcode(processEventTask.getDevcode()); + deviceData.setDeviceType((Integer) BizDataMap.get("deviceType")); + deviceData.setUptime((String) BizDataMap.get("uptime")); + deviceData.setLogtime(new Date()); + deviceData.setDataJson(JSON.toJSONString(BizDataMap)); + deviceData.setDecryptBeforeData(processEventTask.getDecryptSoureData()); + deviceData.setDecryptAfterData(processEventTask.getDecryptAfterData()); + if (BizDataMap.containsKey("cell")) { + //电量不一定每次都有 + deviceData.setCell((Integer) BizDataMap.get("cell")); + } + if (BizDataMap.containsKey("dataValue")) { + //电量不一定每次都有 + deviceData.setDataValue((float) BizDataMap.get("dataValue")); + } + deviceData.setExceptionMsg(processEventTask.getExceptionMsg()); + deviceDataList.add(deviceData); + } + //批量保存 + deviceDataService.saveBatch(deviceDataList); + } + } + //移除缓存 + GuavaCacheUtil.remove(devcode); + } + } + ); + } + + //暂时不做设备的更新 + public void setDevice(String status) { + Device device = new Device(); + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java deleted file mode 100644 index 2f9c711..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.cache; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - - -public class listenerEvent { - - private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, - TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); - - /** - * 异步生成缓存 - * - * @param key - * @param json - */ - public void asynCreateLogCache(String key, String json) { - - - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 4e6beea..01b20f5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.cache.GuavaCacheUtil; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; import com.casic.missiles.exception.EngineException; @@ -56,12 +56,16 @@ } ParseResult result = null; + String devcode = null; try { //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + devcode = (String) parseFixedDataMap.get("devcode"); // 通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); + RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); if (ObjectUtil.isEmpty(ruleConfig)) { + //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); byteBuf.readBytes(protocolConfig.getPreFix().length()); @@ -94,10 +98,14 @@ } //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); - log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); + //解密前的报文 + log.debug("解析的密文是----------" + ByteBufUtil.hexDump(bizDataByteBuf)); +// ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(bizDataByteBuf), 1); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); - log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + //解密后报文 //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); @@ -112,16 +120,19 @@ for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); } - //数据发送,异步 + ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); + //存储数据 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - result=null; + //数据发送,异步,异常拦截 + ProtocolProcessEventListener.setTask(devcode, rex.getMessage(), 4); + result = null; frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); - }finally { -// GuavaCacheUtil.putCache("licValid",validLicResult); -// ValidateResult validLicResult = (ValidateResult) GuavaCacheUtil.getCache("licValid"); + } finally { + //数据发送,异步,转存整体数据 + ProtocolProcessEventListener.saveData(devcode, result); return result; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 8af55a6..e4a79ae 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -1,10 +1,13 @@ package com.casic.missiles.parser; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; +import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; @@ -12,6 +15,7 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -25,10 +29,28 @@ public class ProtocolParserSupport { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; + } + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + //打印源数据,设备编号 + ProcessEventTask processEventTask = ProcessEventTask.builder() + .devcode((String) parseFixedDataMap.get("devcode")) + .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte)) + .build(); + ProtocolProcessEventListener.asynAddTask(processEventTask); + return parseFixedDataMap; + } + /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -39,10 +61,8 @@ } String rulePrepareFields = protocolConfig.getRulePrepareFields(); //固定字段 - if (StringUtils.isNotEmpty(rulePrepareFields)) { - //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + if (StringUtils.isNotEmpty(rulePrepareFields) && ObjectUtil.isNotEmpty(parseFixedDataMap)) { + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap)); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index b162def..9c413ed 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,13 +1,13 @@ package com.casic.missiles.parser.matcher; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.*; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 8eb0682..23d1e4c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 4c02a81..e8506e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -1,10 +1,10 @@ package com.casic.missiles.parser.resolver.fields; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 204b4dc..54b4e58 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.rule; import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.pojo.RuleConfig; import lombok.extern.slf4j.Slf4j; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index 7c6350b..3d89d0d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.impl.KafkaSubscribe; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 68aca0e..81644ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -271,7 +271,7 @@ if (showSkip()) { return null; } - //获取缓存 + //缓存命中 if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { return (Map) singleObjects.get(FIXED_FIELD_DS); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java index 0523447..9dc64f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java @@ -1,7 +1,7 @@ package com.casic.missiles.provider; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FileNameEnums; import com.casic.missiles.parser.crc.CRC16; import com.casic.missiles.pojo.UpgradeFileResult; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index ddaadbe..c3a00ce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java index fe9fb77..d6fad15 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java @@ -1,6 +1,6 @@ package com.casic.missiles.replier.decorator; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import io.netty.buffer.ByteBuf; import org.bouncycastle.util.encoders.Hex; diff --git a/sensorhub-core/src/main/resources/config/application-bd.yml b/sensorhub-core/src/main/resources/config/application-bd.yml deleted file mode 100644 index 0a78bf1..0000000 --- a/sensorhub-core/src/main/resources/config/application-bd.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7080 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml deleted file mode 100644 index ec8d4b6..0000000 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7093 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml deleted file mode 100644 index 4dfc9ee..0000000 --- a/sensorhub-core/src/main/resources/config/application.yml +++ /dev/null @@ -1,78 +0,0 @@ -########################################################## -spring: - profiles: - active: dev - servlet: - multipart: - max-file-size: 50MB - max-request-size: 80MB - mvc: - pathmatch: - matching-strategy: ant_path_matcher - kafka: - #kafka配置 - producer: - # Kafka服务器 - bootstrap-servers: '111.198.10.15:12502' - transaction-id-prefix: kafkaTx- - retries: 3 - acks: all - batch-size: 16384 - buffer-memory: 1024000 - consumer: - # Kafka服务器 - bootstrap-servers: '111.198.10.15:12502' - group-id: 1 - auto-offset-reset: latest - enable-auto-commit: false - max-poll-records: 3 - properties: - max: - poll: - interval: - ms: 600000 - session: - timeout: - ms: 10000 - listener: - concurrency: 4 - ack-mode: manual_immediate - missing-topics-fatal: false - cache: - redis: - time-to-live: 600000 # 缓存默认有效时长,以毫秒为单位 - type: redis #指定使用redis作为缓存 -mybatis-plus: - global-config: - enable-sql-runner: true - #关闭配置数据库下划线字段转驼峰 - configuration: - map-underscore-to-camel-case: true - # 配置结果集属性为空时 是否映射返回结果 - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 - mapper-locations: classpath*:mapper/*.xml -mybatis: - mapper-locations: classpath*:mapper/*.xml -#mybatis-plus: -# sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector -casic: - device: - redis: - invalid-time: 86400 - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - config-prefix: 'Casic:' - serializer: org.springframework.data.redis.serializer.StringRedisSerializer - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -#代码生成器配置 -code: - generate: - #作者 - author: cz - #待生成对象表名 - table-name: bussiness_field_config,combined_field_config -sensorhub: - config: - port: 7092 - secret: \ No newline at end of file diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index bfbec51..ff24f09 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -18,6 +18,7 @@ spring-boot-starter-web ${boot.version} + org.springframework.boot spring-boot-starter-test @@ -63,16 +64,6 @@ 1.71 - - - org.springframework.boot - spring-boot-starter-cache - - - - org.apache.commons - commons-pool2 - org.springframework.boot diff --git a/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java index f0ebbbc..fcbde85 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java @@ -50,7 +50,7 @@ * 指定使用哪一种缓存 * @return */ - @Bean + @Bean("redisCacheManager") @Override public CacheManager cacheManager() { RedisSerializer redisSerializer = new StringRedisSerializer(); diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java index 31b0bdd..623eeb1 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java @@ -1,5 +1,6 @@ package com.casic.missiles.mapper; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.pojo.SubscribeConfig; import org.apache.ibatis.annotations.Mapper; @@ -8,9 +9,7 @@ * @author cz * */ -@Mapper public interface SubscribeConfigMapper extends BaseMapper { - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java new file mode 100644 index 0000000..8484cfd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java @@ -0,0 +1,63 @@ +package com.casic.missiles.pojo; + +import lombok.Builder; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-11-24 + */ +@Builder +@Data +public class ProcessEventTask { + + /** + * 最新采集时间 + */ + private String uptime; + + /** + * 最新设备电量 + */ + private String cell; + + /** + * 设备编号 + */ + private String devcode; + + + /** + * 设备编号 + */ + private String decryptSoureData; + + /** + * 最新数据 + */ + private String dataValue; + + /** + * 最新解密前的数据报文 + */ + private String decryptBeforeData; + + /** + * 最新解密后的数据报文 + */ + private String decryptAfterData; + + /** + * 解析数据 + */ + private List> bizDataList; + + /** + * 异常信息收集 + */ + private String exceptionMsg; + +} diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java new file mode 100644 index 0000000..88baf61 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java @@ -0,0 +1,174 @@ +package com.casic.missiles.cache; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.model.Device; +import com.casic.missiles.model.DeviceData; +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.pojo.ProcessEventTask; +import com.casic.missiles.service.IDeviceDataService; +import com.casic.missiles.service.impl.DeviceDataServiceImpl; +import com.casic.missiles.util.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 流程节点事件监听器 + */ +public class ProtocolProcessEventListener { + + private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); + + /** + * 异步生成缓存 + * + * @param processEventTask + */ + public static void asynAddTask(ProcessEventTask processEventTask) { + if (StringUtils.isNotEmpty(processEventTask.getDevcode())) { + GuavaCacheUtil.putCache(processEventTask.getDevcode(), processEventTask); + } + } + + /** + * 异步设置缓存 + * + * @param key + * @param json + */ + public static void setTask(String key, Object json, Integer node) { + //如果key为空,则直接返回 + if (StringUtils.isEmpty(key) || ObjectUtil.isEmpty(json)) { + return; + } + ProcessEventTask processEventTask = null; + switch (node) { + //解密前的数据 + case 1: + //如果为空可以补救 +// if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { +// processEventTask = ProcessEventTask.builder() +// .devcode(key) +// .decryptSoureData((String) json) +// .decryptBeforeData((String) json) +// .build(); +// asynAddTask(processEventTask); +// } else { +// processEventTask.setDecryptBeforeData((String) json); +// } +// break; + //解密后的数据 + case 2: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .decryptAfterData((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setDecryptAfterData((String) json); + } + break; + //解析的数据 + case 3: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .bizDataList((List) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setBizDataList((List) json); + } + break; + case 4: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .exceptionMsg((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setExceptionMsg((String) json); + } + break; + default: + return; + } + } + + /** + * 异步设置缓存 + * + * @param key + */ + public static ProcessEventTask getTask(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + return (ProcessEventTask) GuavaCacheUtil.getCache(key); + } + + /** + * 存库操作 + * + * @param devcode + */ + public static void saveData(String devcode, ParseResult result) { + //添加到线程池执行,异步存库 + threadPool.execute( + () -> { + ProcessEventTask processEventTask; + if (ObjectUtil.isNotEmpty(getTask(devcode))) { + synchronized (processEventTask = getTask(devcode)) { + IDeviceDataService deviceDataService = SpringContextUtil.getBean(DeviceDataServiceImpl.class); + if (ObjectUtil.isNotEmpty(processEventTask)) { + List deviceDataList = new ArrayList<>(); + for (Map BizDataMap : processEventTask.getBizDataList()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDevcode(processEventTask.getDevcode()); + deviceData.setDeviceType((Integer) BizDataMap.get("deviceType")); + deviceData.setUptime((String) BizDataMap.get("uptime")); + deviceData.setLogtime(new Date()); + deviceData.setDataJson(JSON.toJSONString(BizDataMap)); + deviceData.setDecryptBeforeData(processEventTask.getDecryptSoureData()); + deviceData.setDecryptAfterData(processEventTask.getDecryptAfterData()); + if (BizDataMap.containsKey("cell")) { + //电量不一定每次都有 + deviceData.setCell((Integer) BizDataMap.get("cell")); + } + if (BizDataMap.containsKey("dataValue")) { + //电量不一定每次都有 + deviceData.setDataValue((float) BizDataMap.get("dataValue")); + } + deviceData.setExceptionMsg(processEventTask.getExceptionMsg()); + deviceDataList.add(deviceData); + } + //批量保存 + deviceDataService.saveBatch(deviceDataList); + } + } + //移除缓存 + GuavaCacheUtil.remove(devcode); + } + } + ); + } + + //暂时不做设备的更新 + public void setDevice(String status) { + Device device = new Device(); + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java deleted file mode 100644 index 2f9c711..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.cache; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - - -public class listenerEvent { - - private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, - TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); - - /** - * 异步生成缓存 - * - * @param key - * @param json - */ - public void asynCreateLogCache(String key, String json) { - - - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 4e6beea..01b20f5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.cache.GuavaCacheUtil; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; import com.casic.missiles.exception.EngineException; @@ -56,12 +56,16 @@ } ParseResult result = null; + String devcode = null; try { //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + devcode = (String) parseFixedDataMap.get("devcode"); // 通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); + RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); if (ObjectUtil.isEmpty(ruleConfig)) { + //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); byteBuf.readBytes(protocolConfig.getPreFix().length()); @@ -94,10 +98,14 @@ } //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); - log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); + //解密前的报文 + log.debug("解析的密文是----------" + ByteBufUtil.hexDump(bizDataByteBuf)); +// ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(bizDataByteBuf), 1); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); - log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + //解密后报文 //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); @@ -112,16 +120,19 @@ for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); } - //数据发送,异步 + ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); + //存储数据 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - result=null; + //数据发送,异步,异常拦截 + ProtocolProcessEventListener.setTask(devcode, rex.getMessage(), 4); + result = null; frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); - }finally { -// GuavaCacheUtil.putCache("licValid",validLicResult); -// ValidateResult validLicResult = (ValidateResult) GuavaCacheUtil.getCache("licValid"); + } finally { + //数据发送,异步,转存整体数据 + ProtocolProcessEventListener.saveData(devcode, result); return result; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 8af55a6..e4a79ae 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -1,10 +1,13 @@ package com.casic.missiles.parser; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; +import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; @@ -12,6 +15,7 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -25,10 +29,28 @@ public class ProtocolParserSupport { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; + } + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + //打印源数据,设备编号 + ProcessEventTask processEventTask = ProcessEventTask.builder() + .devcode((String) parseFixedDataMap.get("devcode")) + .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte)) + .build(); + ProtocolProcessEventListener.asynAddTask(processEventTask); + return parseFixedDataMap; + } + /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -39,10 +61,8 @@ } String rulePrepareFields = protocolConfig.getRulePrepareFields(); //固定字段 - if (StringUtils.isNotEmpty(rulePrepareFields)) { - //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + if (StringUtils.isNotEmpty(rulePrepareFields) && ObjectUtil.isNotEmpty(parseFixedDataMap)) { + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap)); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index b162def..9c413ed 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,13 +1,13 @@ package com.casic.missiles.parser.matcher; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.*; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 8eb0682..23d1e4c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 4c02a81..e8506e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -1,10 +1,10 @@ package com.casic.missiles.parser.resolver.fields; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 204b4dc..54b4e58 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.rule; import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.pojo.RuleConfig; import lombok.extern.slf4j.Slf4j; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index 7c6350b..3d89d0d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.impl.KafkaSubscribe; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 68aca0e..81644ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -271,7 +271,7 @@ if (showSkip()) { return null; } - //获取缓存 + //缓存命中 if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { return (Map) singleObjects.get(FIXED_FIELD_DS); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java index 0523447..9dc64f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java @@ -1,7 +1,7 @@ package com.casic.missiles.provider; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FileNameEnums; import com.casic.missiles.parser.crc.CRC16; import com.casic.missiles.pojo.UpgradeFileResult; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index ddaadbe..c3a00ce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java index fe9fb77..d6fad15 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java @@ -1,6 +1,6 @@ package com.casic.missiles.replier.decorator; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import io.netty.buffer.ByteBuf; import org.bouncycastle.util.encoders.Hex; diff --git a/sensorhub-core/src/main/resources/config/application-bd.yml b/sensorhub-core/src/main/resources/config/application-bd.yml deleted file mode 100644 index 0a78bf1..0000000 --- a/sensorhub-core/src/main/resources/config/application-bd.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7080 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml deleted file mode 100644 index ec8d4b6..0000000 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7093 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml deleted file mode 100644 index 4dfc9ee..0000000 --- a/sensorhub-core/src/main/resources/config/application.yml +++ /dev/null @@ -1,78 +0,0 @@ -########################################################## -spring: - profiles: - active: dev - servlet: - multipart: - max-file-size: 50MB - max-request-size: 80MB - mvc: - pathmatch: - matching-strategy: ant_path_matcher - kafka: - #kafka配置 - producer: - # Kafka服务器 - bootstrap-servers: '111.198.10.15:12502' - transaction-id-prefix: kafkaTx- - retries: 3 - acks: all - batch-size: 16384 - buffer-memory: 1024000 - consumer: - # Kafka服务器 - bootstrap-servers: '111.198.10.15:12502' - group-id: 1 - auto-offset-reset: latest - enable-auto-commit: false - max-poll-records: 3 - properties: - max: - poll: - interval: - ms: 600000 - session: - timeout: - ms: 10000 - listener: - concurrency: 4 - ack-mode: manual_immediate - missing-topics-fatal: false - cache: - redis: - time-to-live: 600000 # 缓存默认有效时长,以毫秒为单位 - type: redis #指定使用redis作为缓存 -mybatis-plus: - global-config: - enable-sql-runner: true - #关闭配置数据库下划线字段转驼峰 - configuration: - map-underscore-to-camel-case: true - # 配置结果集属性为空时 是否映射返回结果 - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 - mapper-locations: classpath*:mapper/*.xml -mybatis: - mapper-locations: classpath*:mapper/*.xml -#mybatis-plus: -# sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector -casic: - device: - redis: - invalid-time: 86400 - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - config-prefix: 'Casic:' - serializer: org.springframework.data.redis.serializer.StringRedisSerializer - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -#代码生成器配置 -code: - generate: - #作者 - author: cz - #待生成对象表名 - table-name: bussiness_field_config,combined_field_config -sensorhub: - config: - port: 7092 - secret: \ No newline at end of file diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index bfbec51..ff24f09 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -18,6 +18,7 @@ spring-boot-starter-web ${boot.version} + org.springframework.boot spring-boot-starter-test @@ -63,16 +64,6 @@ 1.71 - - - org.springframework.boot - spring-boot-starter-cache - - - - org.apache.commons - commons-pool2 - org.springframework.boot diff --git a/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java index f0ebbbc..fcbde85 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java @@ -50,7 +50,7 @@ * 指定使用哪一种缓存 * @return */ - @Bean + @Bean("redisCacheManager") @Override public CacheManager cacheManager() { RedisSerializer redisSerializer = new StringRedisSerializer(); diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java index 31b0bdd..623eeb1 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java @@ -1,5 +1,6 @@ package com.casic.missiles.mapper; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.pojo.SubscribeConfig; import org.apache.ibatis.annotations.Mapper; @@ -8,9 +9,7 @@ * @author cz * */ -@Mapper public interface SubscribeConfigMapper extends BaseMapper { - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java new file mode 100644 index 0000000..8484cfd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java @@ -0,0 +1,63 @@ +package com.casic.missiles.pojo; + +import lombok.Builder; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-11-24 + */ +@Builder +@Data +public class ProcessEventTask { + + /** + * 最新采集时间 + */ + private String uptime; + + /** + * 最新设备电量 + */ + private String cell; + + /** + * 设备编号 + */ + private String devcode; + + + /** + * 设备编号 + */ + private String decryptSoureData; + + /** + * 最新数据 + */ + private String dataValue; + + /** + * 最新解密前的数据报文 + */ + private String decryptBeforeData; + + /** + * 最新解密后的数据报文 + */ + private String decryptAfterData; + + /** + * 解析数据 + */ + private List> bizDataList; + + /** + * 异常信息收集 + */ + private String exceptionMsg; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java index d120d83..cee735f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.CombinedFieldMapper; @@ -11,6 +12,7 @@ import java.util.List; @Service +@DS("sensorhub") public class CombinedFieldConfigRegistryImpl extends ServiceImpl implements CombinedFieldConfigRegistry { @Override diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java new file mode 100644 index 0000000..88baf61 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java @@ -0,0 +1,174 @@ +package com.casic.missiles.cache; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.model.Device; +import com.casic.missiles.model.DeviceData; +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.pojo.ProcessEventTask; +import com.casic.missiles.service.IDeviceDataService; +import com.casic.missiles.service.impl.DeviceDataServiceImpl; +import com.casic.missiles.util.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 流程节点事件监听器 + */ +public class ProtocolProcessEventListener { + + private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); + + /** + * 异步生成缓存 + * + * @param processEventTask + */ + public static void asynAddTask(ProcessEventTask processEventTask) { + if (StringUtils.isNotEmpty(processEventTask.getDevcode())) { + GuavaCacheUtil.putCache(processEventTask.getDevcode(), processEventTask); + } + } + + /** + * 异步设置缓存 + * + * @param key + * @param json + */ + public static void setTask(String key, Object json, Integer node) { + //如果key为空,则直接返回 + if (StringUtils.isEmpty(key) || ObjectUtil.isEmpty(json)) { + return; + } + ProcessEventTask processEventTask = null; + switch (node) { + //解密前的数据 + case 1: + //如果为空可以补救 +// if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { +// processEventTask = ProcessEventTask.builder() +// .devcode(key) +// .decryptSoureData((String) json) +// .decryptBeforeData((String) json) +// .build(); +// asynAddTask(processEventTask); +// } else { +// processEventTask.setDecryptBeforeData((String) json); +// } +// break; + //解密后的数据 + case 2: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .decryptAfterData((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setDecryptAfterData((String) json); + } + break; + //解析的数据 + case 3: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .bizDataList((List) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setBizDataList((List) json); + } + break; + case 4: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .exceptionMsg((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setExceptionMsg((String) json); + } + break; + default: + return; + } + } + + /** + * 异步设置缓存 + * + * @param key + */ + public static ProcessEventTask getTask(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + return (ProcessEventTask) GuavaCacheUtil.getCache(key); + } + + /** + * 存库操作 + * + * @param devcode + */ + public static void saveData(String devcode, ParseResult result) { + //添加到线程池执行,异步存库 + threadPool.execute( + () -> { + ProcessEventTask processEventTask; + if (ObjectUtil.isNotEmpty(getTask(devcode))) { + synchronized (processEventTask = getTask(devcode)) { + IDeviceDataService deviceDataService = SpringContextUtil.getBean(DeviceDataServiceImpl.class); + if (ObjectUtil.isNotEmpty(processEventTask)) { + List deviceDataList = new ArrayList<>(); + for (Map BizDataMap : processEventTask.getBizDataList()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDevcode(processEventTask.getDevcode()); + deviceData.setDeviceType((Integer) BizDataMap.get("deviceType")); + deviceData.setUptime((String) BizDataMap.get("uptime")); + deviceData.setLogtime(new Date()); + deviceData.setDataJson(JSON.toJSONString(BizDataMap)); + deviceData.setDecryptBeforeData(processEventTask.getDecryptSoureData()); + deviceData.setDecryptAfterData(processEventTask.getDecryptAfterData()); + if (BizDataMap.containsKey("cell")) { + //电量不一定每次都有 + deviceData.setCell((Integer) BizDataMap.get("cell")); + } + if (BizDataMap.containsKey("dataValue")) { + //电量不一定每次都有 + deviceData.setDataValue((float) BizDataMap.get("dataValue")); + } + deviceData.setExceptionMsg(processEventTask.getExceptionMsg()); + deviceDataList.add(deviceData); + } + //批量保存 + deviceDataService.saveBatch(deviceDataList); + } + } + //移除缓存 + GuavaCacheUtil.remove(devcode); + } + } + ); + } + + //暂时不做设备的更新 + public void setDevice(String status) { + Device device = new Device(); + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java deleted file mode 100644 index 2f9c711..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.cache; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - - -public class listenerEvent { - - private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, - TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); - - /** - * 异步生成缓存 - * - * @param key - * @param json - */ - public void asynCreateLogCache(String key, String json) { - - - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 4e6beea..01b20f5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.cache.GuavaCacheUtil; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; import com.casic.missiles.exception.EngineException; @@ -56,12 +56,16 @@ } ParseResult result = null; + String devcode = null; try { //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + devcode = (String) parseFixedDataMap.get("devcode"); // 通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); + RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); if (ObjectUtil.isEmpty(ruleConfig)) { + //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); byteBuf.readBytes(protocolConfig.getPreFix().length()); @@ -94,10 +98,14 @@ } //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); - log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); + //解密前的报文 + log.debug("解析的密文是----------" + ByteBufUtil.hexDump(bizDataByteBuf)); +// ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(bizDataByteBuf), 1); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); - log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + //解密后报文 //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); @@ -112,16 +120,19 @@ for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); } - //数据发送,异步 + ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); + //存储数据 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - result=null; + //数据发送,异步,异常拦截 + ProtocolProcessEventListener.setTask(devcode, rex.getMessage(), 4); + result = null; frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); - }finally { -// GuavaCacheUtil.putCache("licValid",validLicResult); -// ValidateResult validLicResult = (ValidateResult) GuavaCacheUtil.getCache("licValid"); + } finally { + //数据发送,异步,转存整体数据 + ProtocolProcessEventListener.saveData(devcode, result); return result; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 8af55a6..e4a79ae 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -1,10 +1,13 @@ package com.casic.missiles.parser; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; +import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; @@ -12,6 +15,7 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -25,10 +29,28 @@ public class ProtocolParserSupport { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; + } + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + //打印源数据,设备编号 + ProcessEventTask processEventTask = ProcessEventTask.builder() + .devcode((String) parseFixedDataMap.get("devcode")) + .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte)) + .build(); + ProtocolProcessEventListener.asynAddTask(processEventTask); + return parseFixedDataMap; + } + /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -39,10 +61,8 @@ } String rulePrepareFields = protocolConfig.getRulePrepareFields(); //固定字段 - if (StringUtils.isNotEmpty(rulePrepareFields)) { - //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + if (StringUtils.isNotEmpty(rulePrepareFields) && ObjectUtil.isNotEmpty(parseFixedDataMap)) { + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap)); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index b162def..9c413ed 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,13 +1,13 @@ package com.casic.missiles.parser.matcher; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.*; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 8eb0682..23d1e4c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 4c02a81..e8506e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -1,10 +1,10 @@ package com.casic.missiles.parser.resolver.fields; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 204b4dc..54b4e58 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.rule; import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.pojo.RuleConfig; import lombok.extern.slf4j.Slf4j; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index 7c6350b..3d89d0d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.impl.KafkaSubscribe; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 68aca0e..81644ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -271,7 +271,7 @@ if (showSkip()) { return null; } - //获取缓存 + //缓存命中 if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { return (Map) singleObjects.get(FIXED_FIELD_DS); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java index 0523447..9dc64f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java @@ -1,7 +1,7 @@ package com.casic.missiles.provider; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FileNameEnums; import com.casic.missiles.parser.crc.CRC16; import com.casic.missiles.pojo.UpgradeFileResult; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index ddaadbe..c3a00ce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java index fe9fb77..d6fad15 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java @@ -1,6 +1,6 @@ package com.casic.missiles.replier.decorator; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import io.netty.buffer.ByteBuf; import org.bouncycastle.util.encoders.Hex; diff --git a/sensorhub-core/src/main/resources/config/application-bd.yml b/sensorhub-core/src/main/resources/config/application-bd.yml deleted file mode 100644 index 0a78bf1..0000000 --- a/sensorhub-core/src/main/resources/config/application-bd.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7080 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml deleted file mode 100644 index ec8d4b6..0000000 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7093 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml deleted file mode 100644 index 4dfc9ee..0000000 --- a/sensorhub-core/src/main/resources/config/application.yml +++ /dev/null @@ -1,78 +0,0 @@ -########################################################## -spring: - profiles: - active: dev - servlet: - multipart: - max-file-size: 50MB - max-request-size: 80MB - mvc: - pathmatch: - matching-strategy: ant_path_matcher - kafka: - #kafka配置 - producer: - # Kafka服务器 - bootstrap-servers: '111.198.10.15:12502' - transaction-id-prefix: kafkaTx- - retries: 3 - acks: all - batch-size: 16384 - buffer-memory: 1024000 - consumer: - # Kafka服务器 - bootstrap-servers: '111.198.10.15:12502' - group-id: 1 - auto-offset-reset: latest - enable-auto-commit: false - max-poll-records: 3 - properties: - max: - poll: - interval: - ms: 600000 - session: - timeout: - ms: 10000 - listener: - concurrency: 4 - ack-mode: manual_immediate - missing-topics-fatal: false - cache: - redis: - time-to-live: 600000 # 缓存默认有效时长,以毫秒为单位 - type: redis #指定使用redis作为缓存 -mybatis-plus: - global-config: - enable-sql-runner: true - #关闭配置数据库下划线字段转驼峰 - configuration: - map-underscore-to-camel-case: true - # 配置结果集属性为空时 是否映射返回结果 - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 - mapper-locations: classpath*:mapper/*.xml -mybatis: - mapper-locations: classpath*:mapper/*.xml -#mybatis-plus: -# sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector -casic: - device: - redis: - invalid-time: 86400 - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - config-prefix: 'Casic:' - serializer: org.springframework.data.redis.serializer.StringRedisSerializer - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -#代码生成器配置 -code: - generate: - #作者 - author: cz - #待生成对象表名 - table-name: bussiness_field_config,combined_field_config -sensorhub: - config: - port: 7092 - secret: \ No newline at end of file diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index bfbec51..ff24f09 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -18,6 +18,7 @@ spring-boot-starter-web ${boot.version} + org.springframework.boot spring-boot-starter-test @@ -63,16 +64,6 @@ 1.71 - - - org.springframework.boot - spring-boot-starter-cache - - - - org.apache.commons - commons-pool2 - org.springframework.boot diff --git a/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java index f0ebbbc..fcbde85 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java @@ -50,7 +50,7 @@ * 指定使用哪一种缓存 * @return */ - @Bean + @Bean("redisCacheManager") @Override public CacheManager cacheManager() { RedisSerializer redisSerializer = new StringRedisSerializer(); diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java index 31b0bdd..623eeb1 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java @@ -1,5 +1,6 @@ package com.casic.missiles.mapper; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.pojo.SubscribeConfig; import org.apache.ibatis.annotations.Mapper; @@ -8,9 +9,7 @@ * @author cz * */ -@Mapper public interface SubscribeConfigMapper extends BaseMapper { - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java new file mode 100644 index 0000000..8484cfd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java @@ -0,0 +1,63 @@ +package com.casic.missiles.pojo; + +import lombok.Builder; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-11-24 + */ +@Builder +@Data +public class ProcessEventTask { + + /** + * 最新采集时间 + */ + private String uptime; + + /** + * 最新设备电量 + */ + private String cell; + + /** + * 设备编号 + */ + private String devcode; + + + /** + * 设备编号 + */ + private String decryptSoureData; + + /** + * 最新数据 + */ + private String dataValue; + + /** + * 最新解密前的数据报文 + */ + private String decryptBeforeData; + + /** + * 最新解密后的数据报文 + */ + private String decryptAfterData; + + /** + * 解析数据 + */ + private List> bizDataList; + + /** + * 异常信息收集 + */ + private String exceptionMsg; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java index d120d83..cee735f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.CombinedFieldMapper; @@ -11,6 +12,7 @@ import java.util.List; @Service +@DS("sensorhub") public class CombinedFieldConfigRegistryImpl extends ServiceImpl implements CombinedFieldConfigRegistry { @Override diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java index e07d2ff..b0e8304 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.CommandEventMapper; @@ -10,6 +11,7 @@ import java.util.List; import java.util.Optional; +@DS("sensorhub") public class CommandEventRegistryImpl extends ServiceImpl implements CommandEventRegistry { @Override diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java new file mode 100644 index 0000000..88baf61 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java @@ -0,0 +1,174 @@ +package com.casic.missiles.cache; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.model.Device; +import com.casic.missiles.model.DeviceData; +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.pojo.ProcessEventTask; +import com.casic.missiles.service.IDeviceDataService; +import com.casic.missiles.service.impl.DeviceDataServiceImpl; +import com.casic.missiles.util.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 流程节点事件监听器 + */ +public class ProtocolProcessEventListener { + + private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); + + /** + * 异步生成缓存 + * + * @param processEventTask + */ + public static void asynAddTask(ProcessEventTask processEventTask) { + if (StringUtils.isNotEmpty(processEventTask.getDevcode())) { + GuavaCacheUtil.putCache(processEventTask.getDevcode(), processEventTask); + } + } + + /** + * 异步设置缓存 + * + * @param key + * @param json + */ + public static void setTask(String key, Object json, Integer node) { + //如果key为空,则直接返回 + if (StringUtils.isEmpty(key) || ObjectUtil.isEmpty(json)) { + return; + } + ProcessEventTask processEventTask = null; + switch (node) { + //解密前的数据 + case 1: + //如果为空可以补救 +// if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { +// processEventTask = ProcessEventTask.builder() +// .devcode(key) +// .decryptSoureData((String) json) +// .decryptBeforeData((String) json) +// .build(); +// asynAddTask(processEventTask); +// } else { +// processEventTask.setDecryptBeforeData((String) json); +// } +// break; + //解密后的数据 + case 2: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .decryptAfterData((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setDecryptAfterData((String) json); + } + break; + //解析的数据 + case 3: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .bizDataList((List) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setBizDataList((List) json); + } + break; + case 4: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .exceptionMsg((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setExceptionMsg((String) json); + } + break; + default: + return; + } + } + + /** + * 异步设置缓存 + * + * @param key + */ + public static ProcessEventTask getTask(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + return (ProcessEventTask) GuavaCacheUtil.getCache(key); + } + + /** + * 存库操作 + * + * @param devcode + */ + public static void saveData(String devcode, ParseResult result) { + //添加到线程池执行,异步存库 + threadPool.execute( + () -> { + ProcessEventTask processEventTask; + if (ObjectUtil.isNotEmpty(getTask(devcode))) { + synchronized (processEventTask = getTask(devcode)) { + IDeviceDataService deviceDataService = SpringContextUtil.getBean(DeviceDataServiceImpl.class); + if (ObjectUtil.isNotEmpty(processEventTask)) { + List deviceDataList = new ArrayList<>(); + for (Map BizDataMap : processEventTask.getBizDataList()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDevcode(processEventTask.getDevcode()); + deviceData.setDeviceType((Integer) BizDataMap.get("deviceType")); + deviceData.setUptime((String) BizDataMap.get("uptime")); + deviceData.setLogtime(new Date()); + deviceData.setDataJson(JSON.toJSONString(BizDataMap)); + deviceData.setDecryptBeforeData(processEventTask.getDecryptSoureData()); + deviceData.setDecryptAfterData(processEventTask.getDecryptAfterData()); + if (BizDataMap.containsKey("cell")) { + //电量不一定每次都有 + deviceData.setCell((Integer) BizDataMap.get("cell")); + } + if (BizDataMap.containsKey("dataValue")) { + //电量不一定每次都有 + deviceData.setDataValue((float) BizDataMap.get("dataValue")); + } + deviceData.setExceptionMsg(processEventTask.getExceptionMsg()); + deviceDataList.add(deviceData); + } + //批量保存 + deviceDataService.saveBatch(deviceDataList); + } + } + //移除缓存 + GuavaCacheUtil.remove(devcode); + } + } + ); + } + + //暂时不做设备的更新 + public void setDevice(String status) { + Device device = new Device(); + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java deleted file mode 100644 index 2f9c711..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.cache; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - - -public class listenerEvent { - - private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, - TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); - - /** - * 异步生成缓存 - * - * @param key - * @param json - */ - public void asynCreateLogCache(String key, String json) { - - - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 4e6beea..01b20f5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.cache.GuavaCacheUtil; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; import com.casic.missiles.exception.EngineException; @@ -56,12 +56,16 @@ } ParseResult result = null; + String devcode = null; try { //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + devcode = (String) parseFixedDataMap.get("devcode"); // 通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); + RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); if (ObjectUtil.isEmpty(ruleConfig)) { + //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); byteBuf.readBytes(protocolConfig.getPreFix().length()); @@ -94,10 +98,14 @@ } //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); - log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); + //解密前的报文 + log.debug("解析的密文是----------" + ByteBufUtil.hexDump(bizDataByteBuf)); +// ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(bizDataByteBuf), 1); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); - log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + //解密后报文 //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); @@ -112,16 +120,19 @@ for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); } - //数据发送,异步 + ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); + //存储数据 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - result=null; + //数据发送,异步,异常拦截 + ProtocolProcessEventListener.setTask(devcode, rex.getMessage(), 4); + result = null; frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); - }finally { -// GuavaCacheUtil.putCache("licValid",validLicResult); -// ValidateResult validLicResult = (ValidateResult) GuavaCacheUtil.getCache("licValid"); + } finally { + //数据发送,异步,转存整体数据 + ProtocolProcessEventListener.saveData(devcode, result); return result; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 8af55a6..e4a79ae 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -1,10 +1,13 @@ package com.casic.missiles.parser; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; +import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; @@ -12,6 +15,7 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -25,10 +29,28 @@ public class ProtocolParserSupport { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; + } + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + //打印源数据,设备编号 + ProcessEventTask processEventTask = ProcessEventTask.builder() + .devcode((String) parseFixedDataMap.get("devcode")) + .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte)) + .build(); + ProtocolProcessEventListener.asynAddTask(processEventTask); + return parseFixedDataMap; + } + /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -39,10 +61,8 @@ } String rulePrepareFields = protocolConfig.getRulePrepareFields(); //固定字段 - if (StringUtils.isNotEmpty(rulePrepareFields)) { - //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + if (StringUtils.isNotEmpty(rulePrepareFields) && ObjectUtil.isNotEmpty(parseFixedDataMap)) { + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap)); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index b162def..9c413ed 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,13 +1,13 @@ package com.casic.missiles.parser.matcher; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.*; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 8eb0682..23d1e4c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 4c02a81..e8506e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -1,10 +1,10 @@ package com.casic.missiles.parser.resolver.fields; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 204b4dc..54b4e58 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.rule; import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.pojo.RuleConfig; import lombok.extern.slf4j.Slf4j; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index 7c6350b..3d89d0d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.impl.KafkaSubscribe; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 68aca0e..81644ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -271,7 +271,7 @@ if (showSkip()) { return null; } - //获取缓存 + //缓存命中 if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { return (Map) singleObjects.get(FIXED_FIELD_DS); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java index 0523447..9dc64f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java @@ -1,7 +1,7 @@ package com.casic.missiles.provider; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FileNameEnums; import com.casic.missiles.parser.crc.CRC16; import com.casic.missiles.pojo.UpgradeFileResult; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index ddaadbe..c3a00ce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java index fe9fb77..d6fad15 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java @@ -1,6 +1,6 @@ package com.casic.missiles.replier.decorator; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import io.netty.buffer.ByteBuf; import org.bouncycastle.util.encoders.Hex; diff --git a/sensorhub-core/src/main/resources/config/application-bd.yml b/sensorhub-core/src/main/resources/config/application-bd.yml deleted file mode 100644 index 0a78bf1..0000000 --- a/sensorhub-core/src/main/resources/config/application-bd.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7080 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml deleted file mode 100644 index ec8d4b6..0000000 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7093 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml deleted file mode 100644 index 4dfc9ee..0000000 --- a/sensorhub-core/src/main/resources/config/application.yml +++ /dev/null @@ -1,78 +0,0 @@ -########################################################## -spring: - profiles: - active: dev - servlet: - multipart: - max-file-size: 50MB - max-request-size: 80MB - mvc: - pathmatch: - matching-strategy: ant_path_matcher - kafka: - #kafka配置 - producer: - # Kafka服务器 - bootstrap-servers: '111.198.10.15:12502' - transaction-id-prefix: kafkaTx- - retries: 3 - acks: all - batch-size: 16384 - buffer-memory: 1024000 - consumer: - # Kafka服务器 - bootstrap-servers: '111.198.10.15:12502' - group-id: 1 - auto-offset-reset: latest - enable-auto-commit: false - max-poll-records: 3 - properties: - max: - poll: - interval: - ms: 600000 - session: - timeout: - ms: 10000 - listener: - concurrency: 4 - ack-mode: manual_immediate - missing-topics-fatal: false - cache: - redis: - time-to-live: 600000 # 缓存默认有效时长,以毫秒为单位 - type: redis #指定使用redis作为缓存 -mybatis-plus: - global-config: - enable-sql-runner: true - #关闭配置数据库下划线字段转驼峰 - configuration: - map-underscore-to-camel-case: true - # 配置结果集属性为空时 是否映射返回结果 - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 - mapper-locations: classpath*:mapper/*.xml -mybatis: - mapper-locations: classpath*:mapper/*.xml -#mybatis-plus: -# sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector -casic: - device: - redis: - invalid-time: 86400 - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - config-prefix: 'Casic:' - serializer: org.springframework.data.redis.serializer.StringRedisSerializer - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -#代码生成器配置 -code: - generate: - #作者 - author: cz - #待生成对象表名 - table-name: bussiness_field_config,combined_field_config -sensorhub: - config: - port: 7092 - secret: \ No newline at end of file diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index bfbec51..ff24f09 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -18,6 +18,7 @@ spring-boot-starter-web ${boot.version} + org.springframework.boot spring-boot-starter-test @@ -63,16 +64,6 @@ 1.71 - - - org.springframework.boot - spring-boot-starter-cache - - - - org.apache.commons - commons-pool2 - org.springframework.boot diff --git a/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java index f0ebbbc..fcbde85 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java @@ -50,7 +50,7 @@ * 指定使用哪一种缓存 * @return */ - @Bean + @Bean("redisCacheManager") @Override public CacheManager cacheManager() { RedisSerializer redisSerializer = new StringRedisSerializer(); diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java index 31b0bdd..623eeb1 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java @@ -1,5 +1,6 @@ package com.casic.missiles.mapper; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.pojo.SubscribeConfig; import org.apache.ibatis.annotations.Mapper; @@ -8,9 +9,7 @@ * @author cz * */ -@Mapper public interface SubscribeConfigMapper extends BaseMapper { - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java new file mode 100644 index 0000000..8484cfd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java @@ -0,0 +1,63 @@ +package com.casic.missiles.pojo; + +import lombok.Builder; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-11-24 + */ +@Builder +@Data +public class ProcessEventTask { + + /** + * 最新采集时间 + */ + private String uptime; + + /** + * 最新设备电量 + */ + private String cell; + + /** + * 设备编号 + */ + private String devcode; + + + /** + * 设备编号 + */ + private String decryptSoureData; + + /** + * 最新数据 + */ + private String dataValue; + + /** + * 最新解密前的数据报文 + */ + private String decryptBeforeData; + + /** + * 最新解密后的数据报文 + */ + private String decryptAfterData; + + /** + * 解析数据 + */ + private List> bizDataList; + + /** + * 异常信息收集 + */ + private String exceptionMsg; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java index d120d83..cee735f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.CombinedFieldMapper; @@ -11,6 +12,7 @@ import java.util.List; @Service +@DS("sensorhub") public class CombinedFieldConfigRegistryImpl extends ServiceImpl implements CombinedFieldConfigRegistry { @Override diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java index e07d2ff..b0e8304 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.CommandEventMapper; @@ -10,6 +11,7 @@ import java.util.List; import java.util.Optional; +@DS("sensorhub") public class CommandEventRegistryImpl extends ServiceImpl implements CommandEventRegistry { @Override diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java index 5d7cd8a..d2d1748 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.DatagramEventConfigMapper; @@ -12,6 +13,7 @@ import java.util.List; @Service +@DS("sensorhub") public class DatagramEventRegistryImpl extends ServiceImpl implements DatagramEventRegistry { diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java new file mode 100644 index 0000000..88baf61 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java @@ -0,0 +1,174 @@ +package com.casic.missiles.cache; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.model.Device; +import com.casic.missiles.model.DeviceData; +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.pojo.ProcessEventTask; +import com.casic.missiles.service.IDeviceDataService; +import com.casic.missiles.service.impl.DeviceDataServiceImpl; +import com.casic.missiles.util.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 流程节点事件监听器 + */ +public class ProtocolProcessEventListener { + + private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); + + /** + * 异步生成缓存 + * + * @param processEventTask + */ + public static void asynAddTask(ProcessEventTask processEventTask) { + if (StringUtils.isNotEmpty(processEventTask.getDevcode())) { + GuavaCacheUtil.putCache(processEventTask.getDevcode(), processEventTask); + } + } + + /** + * 异步设置缓存 + * + * @param key + * @param json + */ + public static void setTask(String key, Object json, Integer node) { + //如果key为空,则直接返回 + if (StringUtils.isEmpty(key) || ObjectUtil.isEmpty(json)) { + return; + } + ProcessEventTask processEventTask = null; + switch (node) { + //解密前的数据 + case 1: + //如果为空可以补救 +// if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { +// processEventTask = ProcessEventTask.builder() +// .devcode(key) +// .decryptSoureData((String) json) +// .decryptBeforeData((String) json) +// .build(); +// asynAddTask(processEventTask); +// } else { +// processEventTask.setDecryptBeforeData((String) json); +// } +// break; + //解密后的数据 + case 2: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .decryptAfterData((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setDecryptAfterData((String) json); + } + break; + //解析的数据 + case 3: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .bizDataList((List) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setBizDataList((List) json); + } + break; + case 4: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .exceptionMsg((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setExceptionMsg((String) json); + } + break; + default: + return; + } + } + + /** + * 异步设置缓存 + * + * @param key + */ + public static ProcessEventTask getTask(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + return (ProcessEventTask) GuavaCacheUtil.getCache(key); + } + + /** + * 存库操作 + * + * @param devcode + */ + public static void saveData(String devcode, ParseResult result) { + //添加到线程池执行,异步存库 + threadPool.execute( + () -> { + ProcessEventTask processEventTask; + if (ObjectUtil.isNotEmpty(getTask(devcode))) { + synchronized (processEventTask = getTask(devcode)) { + IDeviceDataService deviceDataService = SpringContextUtil.getBean(DeviceDataServiceImpl.class); + if (ObjectUtil.isNotEmpty(processEventTask)) { + List deviceDataList = new ArrayList<>(); + for (Map BizDataMap : processEventTask.getBizDataList()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDevcode(processEventTask.getDevcode()); + deviceData.setDeviceType((Integer) BizDataMap.get("deviceType")); + deviceData.setUptime((String) BizDataMap.get("uptime")); + deviceData.setLogtime(new Date()); + deviceData.setDataJson(JSON.toJSONString(BizDataMap)); + deviceData.setDecryptBeforeData(processEventTask.getDecryptSoureData()); + deviceData.setDecryptAfterData(processEventTask.getDecryptAfterData()); + if (BizDataMap.containsKey("cell")) { + //电量不一定每次都有 + deviceData.setCell((Integer) BizDataMap.get("cell")); + } + if (BizDataMap.containsKey("dataValue")) { + //电量不一定每次都有 + deviceData.setDataValue((float) BizDataMap.get("dataValue")); + } + deviceData.setExceptionMsg(processEventTask.getExceptionMsg()); + deviceDataList.add(deviceData); + } + //批量保存 + deviceDataService.saveBatch(deviceDataList); + } + } + //移除缓存 + GuavaCacheUtil.remove(devcode); + } + } + ); + } + + //暂时不做设备的更新 + public void setDevice(String status) { + Device device = new Device(); + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java deleted file mode 100644 index 2f9c711..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.cache; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - - -public class listenerEvent { - - private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, - TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); - - /** - * 异步生成缓存 - * - * @param key - * @param json - */ - public void asynCreateLogCache(String key, String json) { - - - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 4e6beea..01b20f5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.cache.GuavaCacheUtil; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; import com.casic.missiles.exception.EngineException; @@ -56,12 +56,16 @@ } ParseResult result = null; + String devcode = null; try { //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + devcode = (String) parseFixedDataMap.get("devcode"); // 通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); + RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); if (ObjectUtil.isEmpty(ruleConfig)) { + //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); byteBuf.readBytes(protocolConfig.getPreFix().length()); @@ -94,10 +98,14 @@ } //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); - log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); + //解密前的报文 + log.debug("解析的密文是----------" + ByteBufUtil.hexDump(bizDataByteBuf)); +// ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(bizDataByteBuf), 1); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); - log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + //解密后报文 //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); @@ -112,16 +120,19 @@ for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); } - //数据发送,异步 + ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); + //存储数据 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - result=null; + //数据发送,异步,异常拦截 + ProtocolProcessEventListener.setTask(devcode, rex.getMessage(), 4); + result = null; frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); - }finally { -// GuavaCacheUtil.putCache("licValid",validLicResult); -// ValidateResult validLicResult = (ValidateResult) GuavaCacheUtil.getCache("licValid"); + } finally { + //数据发送,异步,转存整体数据 + ProtocolProcessEventListener.saveData(devcode, result); return result; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 8af55a6..e4a79ae 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -1,10 +1,13 @@ package com.casic.missiles.parser; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; +import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; @@ -12,6 +15,7 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -25,10 +29,28 @@ public class ProtocolParserSupport { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; + } + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + //打印源数据,设备编号 + ProcessEventTask processEventTask = ProcessEventTask.builder() + .devcode((String) parseFixedDataMap.get("devcode")) + .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte)) + .build(); + ProtocolProcessEventListener.asynAddTask(processEventTask); + return parseFixedDataMap; + } + /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -39,10 +61,8 @@ } String rulePrepareFields = protocolConfig.getRulePrepareFields(); //固定字段 - if (StringUtils.isNotEmpty(rulePrepareFields)) { - //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + if (StringUtils.isNotEmpty(rulePrepareFields) && ObjectUtil.isNotEmpty(parseFixedDataMap)) { + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap)); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index b162def..9c413ed 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,13 +1,13 @@ package com.casic.missiles.parser.matcher; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.*; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 8eb0682..23d1e4c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 4c02a81..e8506e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -1,10 +1,10 @@ package com.casic.missiles.parser.resolver.fields; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 204b4dc..54b4e58 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.rule; import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.pojo.RuleConfig; import lombok.extern.slf4j.Slf4j; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index 7c6350b..3d89d0d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.impl.KafkaSubscribe; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 68aca0e..81644ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -271,7 +271,7 @@ if (showSkip()) { return null; } - //获取缓存 + //缓存命中 if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { return (Map) singleObjects.get(FIXED_FIELD_DS); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java index 0523447..9dc64f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java @@ -1,7 +1,7 @@ package com.casic.missiles.provider; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FileNameEnums; import com.casic.missiles.parser.crc.CRC16; import com.casic.missiles.pojo.UpgradeFileResult; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index ddaadbe..c3a00ce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java index fe9fb77..d6fad15 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java @@ -1,6 +1,6 @@ package com.casic.missiles.replier.decorator; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import io.netty.buffer.ByteBuf; import org.bouncycastle.util.encoders.Hex; diff --git a/sensorhub-core/src/main/resources/config/application-bd.yml b/sensorhub-core/src/main/resources/config/application-bd.yml deleted file mode 100644 index 0a78bf1..0000000 --- a/sensorhub-core/src/main/resources/config/application-bd.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7080 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml deleted file mode 100644 index ec8d4b6..0000000 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7093 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml deleted file mode 100644 index 4dfc9ee..0000000 --- a/sensorhub-core/src/main/resources/config/application.yml +++ /dev/null @@ -1,78 +0,0 @@ -########################################################## -spring: - profiles: - active: dev - servlet: - multipart: - max-file-size: 50MB - max-request-size: 80MB - mvc: - pathmatch: - matching-strategy: ant_path_matcher - kafka: - #kafka配置 - producer: - # Kafka服务器 - bootstrap-servers: '111.198.10.15:12502' - transaction-id-prefix: kafkaTx- - retries: 3 - acks: all - batch-size: 16384 - buffer-memory: 1024000 - consumer: - # Kafka服务器 - bootstrap-servers: '111.198.10.15:12502' - group-id: 1 - auto-offset-reset: latest - enable-auto-commit: false - max-poll-records: 3 - properties: - max: - poll: - interval: - ms: 600000 - session: - timeout: - ms: 10000 - listener: - concurrency: 4 - ack-mode: manual_immediate - missing-topics-fatal: false - cache: - redis: - time-to-live: 600000 # 缓存默认有效时长,以毫秒为单位 - type: redis #指定使用redis作为缓存 -mybatis-plus: - global-config: - enable-sql-runner: true - #关闭配置数据库下划线字段转驼峰 - configuration: - map-underscore-to-camel-case: true - # 配置结果集属性为空时 是否映射返回结果 - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 - mapper-locations: classpath*:mapper/*.xml -mybatis: - mapper-locations: classpath*:mapper/*.xml -#mybatis-plus: -# sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector -casic: - device: - redis: - invalid-time: 86400 - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - config-prefix: 'Casic:' - serializer: org.springframework.data.redis.serializer.StringRedisSerializer - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -#代码生成器配置 -code: - generate: - #作者 - author: cz - #待生成对象表名 - table-name: bussiness_field_config,combined_field_config -sensorhub: - config: - port: 7092 - secret: \ No newline at end of file diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index bfbec51..ff24f09 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -18,6 +18,7 @@ spring-boot-starter-web ${boot.version} + org.springframework.boot spring-boot-starter-test @@ -63,16 +64,6 @@ 1.71 - - - org.springframework.boot - spring-boot-starter-cache - - - - org.apache.commons - commons-pool2 - org.springframework.boot diff --git a/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java index f0ebbbc..fcbde85 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java @@ -50,7 +50,7 @@ * 指定使用哪一种缓存 * @return */ - @Bean + @Bean("redisCacheManager") @Override public CacheManager cacheManager() { RedisSerializer redisSerializer = new StringRedisSerializer(); diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java index 31b0bdd..623eeb1 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java @@ -1,5 +1,6 @@ package com.casic.missiles.mapper; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.pojo.SubscribeConfig; import org.apache.ibatis.annotations.Mapper; @@ -8,9 +9,7 @@ * @author cz * */ -@Mapper public interface SubscribeConfigMapper extends BaseMapper { - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java new file mode 100644 index 0000000..8484cfd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java @@ -0,0 +1,63 @@ +package com.casic.missiles.pojo; + +import lombok.Builder; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-11-24 + */ +@Builder +@Data +public class ProcessEventTask { + + /** + * 最新采集时间 + */ + private String uptime; + + /** + * 最新设备电量 + */ + private String cell; + + /** + * 设备编号 + */ + private String devcode; + + + /** + * 设备编号 + */ + private String decryptSoureData; + + /** + * 最新数据 + */ + private String dataValue; + + /** + * 最新解密前的数据报文 + */ + private String decryptBeforeData; + + /** + * 最新解密后的数据报文 + */ + private String decryptAfterData; + + /** + * 解析数据 + */ + private List> bizDataList; + + /** + * 异常信息收集 + */ + private String exceptionMsg; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java index d120d83..cee735f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.CombinedFieldMapper; @@ -11,6 +12,7 @@ import java.util.List; @Service +@DS("sensorhub") public class CombinedFieldConfigRegistryImpl extends ServiceImpl implements CombinedFieldConfigRegistry { @Override diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java index e07d2ff..b0e8304 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.CommandEventMapper; @@ -10,6 +11,7 @@ import java.util.List; import java.util.Optional; +@DS("sensorhub") public class CommandEventRegistryImpl extends ServiceImpl implements CommandEventRegistry { @Override diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java index 5d7cd8a..d2d1748 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.DatagramEventConfigMapper; @@ -12,6 +13,7 @@ import java.util.List; @Service +@DS("sensorhub") public class DatagramEventRegistryImpl extends ServiceImpl implements DatagramEventRegistry { diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java index 115f113..28326bb 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.FieldConfigMapper; @@ -14,6 +15,7 @@ * @author cz */ @Service +@DS("sensorhub") public class FieldConfigRegistryImpl extends ServiceImpl implements FieldConfigRegistry { @Override diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java new file mode 100644 index 0000000..88baf61 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java @@ -0,0 +1,174 @@ +package com.casic.missiles.cache; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.model.Device; +import com.casic.missiles.model.DeviceData; +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.pojo.ProcessEventTask; +import com.casic.missiles.service.IDeviceDataService; +import com.casic.missiles.service.impl.DeviceDataServiceImpl; +import com.casic.missiles.util.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 流程节点事件监听器 + */ +public class ProtocolProcessEventListener { + + private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); + + /** + * 异步生成缓存 + * + * @param processEventTask + */ + public static void asynAddTask(ProcessEventTask processEventTask) { + if (StringUtils.isNotEmpty(processEventTask.getDevcode())) { + GuavaCacheUtil.putCache(processEventTask.getDevcode(), processEventTask); + } + } + + /** + * 异步设置缓存 + * + * @param key + * @param json + */ + public static void setTask(String key, Object json, Integer node) { + //如果key为空,则直接返回 + if (StringUtils.isEmpty(key) || ObjectUtil.isEmpty(json)) { + return; + } + ProcessEventTask processEventTask = null; + switch (node) { + //解密前的数据 + case 1: + //如果为空可以补救 +// if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { +// processEventTask = ProcessEventTask.builder() +// .devcode(key) +// .decryptSoureData((String) json) +// .decryptBeforeData((String) json) +// .build(); +// asynAddTask(processEventTask); +// } else { +// processEventTask.setDecryptBeforeData((String) json); +// } +// break; + //解密后的数据 + case 2: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .decryptAfterData((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setDecryptAfterData((String) json); + } + break; + //解析的数据 + case 3: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .bizDataList((List) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setBizDataList((List) json); + } + break; + case 4: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .exceptionMsg((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setExceptionMsg((String) json); + } + break; + default: + return; + } + } + + /** + * 异步设置缓存 + * + * @param key + */ + public static ProcessEventTask getTask(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + return (ProcessEventTask) GuavaCacheUtil.getCache(key); + } + + /** + * 存库操作 + * + * @param devcode + */ + public static void saveData(String devcode, ParseResult result) { + //添加到线程池执行,异步存库 + threadPool.execute( + () -> { + ProcessEventTask processEventTask; + if (ObjectUtil.isNotEmpty(getTask(devcode))) { + synchronized (processEventTask = getTask(devcode)) { + IDeviceDataService deviceDataService = SpringContextUtil.getBean(DeviceDataServiceImpl.class); + if (ObjectUtil.isNotEmpty(processEventTask)) { + List deviceDataList = new ArrayList<>(); + for (Map BizDataMap : processEventTask.getBizDataList()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDevcode(processEventTask.getDevcode()); + deviceData.setDeviceType((Integer) BizDataMap.get("deviceType")); + deviceData.setUptime((String) BizDataMap.get("uptime")); + deviceData.setLogtime(new Date()); + deviceData.setDataJson(JSON.toJSONString(BizDataMap)); + deviceData.setDecryptBeforeData(processEventTask.getDecryptSoureData()); + deviceData.setDecryptAfterData(processEventTask.getDecryptAfterData()); + if (BizDataMap.containsKey("cell")) { + //电量不一定每次都有 + deviceData.setCell((Integer) BizDataMap.get("cell")); + } + if (BizDataMap.containsKey("dataValue")) { + //电量不一定每次都有 + deviceData.setDataValue((float) BizDataMap.get("dataValue")); + } + deviceData.setExceptionMsg(processEventTask.getExceptionMsg()); + deviceDataList.add(deviceData); + } + //批量保存 + deviceDataService.saveBatch(deviceDataList); + } + } + //移除缓存 + GuavaCacheUtil.remove(devcode); + } + } + ); + } + + //暂时不做设备的更新 + public void setDevice(String status) { + Device device = new Device(); + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java deleted file mode 100644 index 2f9c711..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.cache; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - - -public class listenerEvent { - - private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, - TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); - - /** - * 异步生成缓存 - * - * @param key - * @param json - */ - public void asynCreateLogCache(String key, String json) { - - - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 4e6beea..01b20f5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.cache.GuavaCacheUtil; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; import com.casic.missiles.exception.EngineException; @@ -56,12 +56,16 @@ } ParseResult result = null; + String devcode = null; try { //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + devcode = (String) parseFixedDataMap.get("devcode"); // 通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); + RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); if (ObjectUtil.isEmpty(ruleConfig)) { + //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); byteBuf.readBytes(protocolConfig.getPreFix().length()); @@ -94,10 +98,14 @@ } //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); - log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); + //解密前的报文 + log.debug("解析的密文是----------" + ByteBufUtil.hexDump(bizDataByteBuf)); +// ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(bizDataByteBuf), 1); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); - log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + //解密后报文 //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); @@ -112,16 +120,19 @@ for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); } - //数据发送,异步 + ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); + //存储数据 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - result=null; + //数据发送,异步,异常拦截 + ProtocolProcessEventListener.setTask(devcode, rex.getMessage(), 4); + result = null; frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); - }finally { -// GuavaCacheUtil.putCache("licValid",validLicResult); -// ValidateResult validLicResult = (ValidateResult) GuavaCacheUtil.getCache("licValid"); + } finally { + //数据发送,异步,转存整体数据 + ProtocolProcessEventListener.saveData(devcode, result); return result; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 8af55a6..e4a79ae 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -1,10 +1,13 @@ package com.casic.missiles.parser; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; +import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; @@ -12,6 +15,7 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -25,10 +29,28 @@ public class ProtocolParserSupport { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; + } + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + //打印源数据,设备编号 + ProcessEventTask processEventTask = ProcessEventTask.builder() + .devcode((String) parseFixedDataMap.get("devcode")) + .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte)) + .build(); + ProtocolProcessEventListener.asynAddTask(processEventTask); + return parseFixedDataMap; + } + /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -39,10 +61,8 @@ } String rulePrepareFields = protocolConfig.getRulePrepareFields(); //固定字段 - if (StringUtils.isNotEmpty(rulePrepareFields)) { - //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + if (StringUtils.isNotEmpty(rulePrepareFields) && ObjectUtil.isNotEmpty(parseFixedDataMap)) { + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap)); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index b162def..9c413ed 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,13 +1,13 @@ package com.casic.missiles.parser.matcher; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.*; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 8eb0682..23d1e4c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 4c02a81..e8506e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -1,10 +1,10 @@ package com.casic.missiles.parser.resolver.fields; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 204b4dc..54b4e58 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.rule; import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.pojo.RuleConfig; import lombok.extern.slf4j.Slf4j; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index 7c6350b..3d89d0d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.impl.KafkaSubscribe; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 68aca0e..81644ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -271,7 +271,7 @@ if (showSkip()) { return null; } - //获取缓存 + //缓存命中 if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { return (Map) singleObjects.get(FIXED_FIELD_DS); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java index 0523447..9dc64f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java @@ -1,7 +1,7 @@ package com.casic.missiles.provider; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FileNameEnums; import com.casic.missiles.parser.crc.CRC16; import com.casic.missiles.pojo.UpgradeFileResult; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index ddaadbe..c3a00ce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java index fe9fb77..d6fad15 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java @@ -1,6 +1,6 @@ package com.casic.missiles.replier.decorator; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import io.netty.buffer.ByteBuf; import org.bouncycastle.util.encoders.Hex; diff --git a/sensorhub-core/src/main/resources/config/application-bd.yml b/sensorhub-core/src/main/resources/config/application-bd.yml deleted file mode 100644 index 0a78bf1..0000000 --- a/sensorhub-core/src/main/resources/config/application-bd.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7080 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml deleted file mode 100644 index ec8d4b6..0000000 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7093 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml deleted file mode 100644 index 4dfc9ee..0000000 --- a/sensorhub-core/src/main/resources/config/application.yml +++ /dev/null @@ -1,78 +0,0 @@ -########################################################## -spring: - profiles: - active: dev - servlet: - multipart: - max-file-size: 50MB - max-request-size: 80MB - mvc: - pathmatch: - matching-strategy: ant_path_matcher - kafka: - #kafka配置 - producer: - # Kafka服务器 - bootstrap-servers: '111.198.10.15:12502' - transaction-id-prefix: kafkaTx- - retries: 3 - acks: all - batch-size: 16384 - buffer-memory: 1024000 - consumer: - # Kafka服务器 - bootstrap-servers: '111.198.10.15:12502' - group-id: 1 - auto-offset-reset: latest - enable-auto-commit: false - max-poll-records: 3 - properties: - max: - poll: - interval: - ms: 600000 - session: - timeout: - ms: 10000 - listener: - concurrency: 4 - ack-mode: manual_immediate - missing-topics-fatal: false - cache: - redis: - time-to-live: 600000 # 缓存默认有效时长,以毫秒为单位 - type: redis #指定使用redis作为缓存 -mybatis-plus: - global-config: - enable-sql-runner: true - #关闭配置数据库下划线字段转驼峰 - configuration: - map-underscore-to-camel-case: true - # 配置结果集属性为空时 是否映射返回结果 - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 - mapper-locations: classpath*:mapper/*.xml -mybatis: - mapper-locations: classpath*:mapper/*.xml -#mybatis-plus: -# sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector -casic: - device: - redis: - invalid-time: 86400 - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - config-prefix: 'Casic:' - serializer: org.springframework.data.redis.serializer.StringRedisSerializer - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -#代码生成器配置 -code: - generate: - #作者 - author: cz - #待生成对象表名 - table-name: bussiness_field_config,combined_field_config -sensorhub: - config: - port: 7092 - secret: \ No newline at end of file diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index bfbec51..ff24f09 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -18,6 +18,7 @@ spring-boot-starter-web ${boot.version} + org.springframework.boot spring-boot-starter-test @@ -63,16 +64,6 @@ 1.71 - - - org.springframework.boot - spring-boot-starter-cache - - - - org.apache.commons - commons-pool2 - org.springframework.boot diff --git a/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java index f0ebbbc..fcbde85 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java @@ -50,7 +50,7 @@ * 指定使用哪一种缓存 * @return */ - @Bean + @Bean("redisCacheManager") @Override public CacheManager cacheManager() { RedisSerializer redisSerializer = new StringRedisSerializer(); diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java index 31b0bdd..623eeb1 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java @@ -1,5 +1,6 @@ package com.casic.missiles.mapper; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.pojo.SubscribeConfig; import org.apache.ibatis.annotations.Mapper; @@ -8,9 +9,7 @@ * @author cz * */ -@Mapper public interface SubscribeConfigMapper extends BaseMapper { - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java new file mode 100644 index 0000000..8484cfd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java @@ -0,0 +1,63 @@ +package com.casic.missiles.pojo; + +import lombok.Builder; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-11-24 + */ +@Builder +@Data +public class ProcessEventTask { + + /** + * 最新采集时间 + */ + private String uptime; + + /** + * 最新设备电量 + */ + private String cell; + + /** + * 设备编号 + */ + private String devcode; + + + /** + * 设备编号 + */ + private String decryptSoureData; + + /** + * 最新数据 + */ + private String dataValue; + + /** + * 最新解密前的数据报文 + */ + private String decryptBeforeData; + + /** + * 最新解密后的数据报文 + */ + private String decryptAfterData; + + /** + * 解析数据 + */ + private List> bizDataList; + + /** + * 异常信息收集 + */ + private String exceptionMsg; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java index d120d83..cee735f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.CombinedFieldMapper; @@ -11,6 +12,7 @@ import java.util.List; @Service +@DS("sensorhub") public class CombinedFieldConfigRegistryImpl extends ServiceImpl implements CombinedFieldConfigRegistry { @Override diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java index e07d2ff..b0e8304 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.CommandEventMapper; @@ -10,6 +11,7 @@ import java.util.List; import java.util.Optional; +@DS("sensorhub") public class CommandEventRegistryImpl extends ServiceImpl implements CommandEventRegistry { @Override diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java index 5d7cd8a..d2d1748 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.DatagramEventConfigMapper; @@ -12,6 +13,7 @@ import java.util.List; @Service +@DS("sensorhub") public class DatagramEventRegistryImpl extends ServiceImpl implements DatagramEventRegistry { diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java index 115f113..28326bb 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.FieldConfigMapper; @@ -14,6 +15,7 @@ * @author cz */ @Service +@DS("sensorhub") public class FieldConfigRegistryImpl extends ServiceImpl implements FieldConfigRegistry { @Override diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java index 0fe0c63..285530c 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.FieldRuleConfigMapper; @@ -11,6 +12,7 @@ import java.util.List; @Service +@DS("sensorhub") public class FieldRuleConfigRegistryImpl extends ServiceImpl implements FieldRuleConfigRegistry { @Override diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java new file mode 100644 index 0000000..88baf61 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java @@ -0,0 +1,174 @@ +package com.casic.missiles.cache; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.model.Device; +import com.casic.missiles.model.DeviceData; +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.pojo.ProcessEventTask; +import com.casic.missiles.service.IDeviceDataService; +import com.casic.missiles.service.impl.DeviceDataServiceImpl; +import com.casic.missiles.util.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 流程节点事件监听器 + */ +public class ProtocolProcessEventListener { + + private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); + + /** + * 异步生成缓存 + * + * @param processEventTask + */ + public static void asynAddTask(ProcessEventTask processEventTask) { + if (StringUtils.isNotEmpty(processEventTask.getDevcode())) { + GuavaCacheUtil.putCache(processEventTask.getDevcode(), processEventTask); + } + } + + /** + * 异步设置缓存 + * + * @param key + * @param json + */ + public static void setTask(String key, Object json, Integer node) { + //如果key为空,则直接返回 + if (StringUtils.isEmpty(key) || ObjectUtil.isEmpty(json)) { + return; + } + ProcessEventTask processEventTask = null; + switch (node) { + //解密前的数据 + case 1: + //如果为空可以补救 +// if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { +// processEventTask = ProcessEventTask.builder() +// .devcode(key) +// .decryptSoureData((String) json) +// .decryptBeforeData((String) json) +// .build(); +// asynAddTask(processEventTask); +// } else { +// processEventTask.setDecryptBeforeData((String) json); +// } +// break; + //解密后的数据 + case 2: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .decryptAfterData((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setDecryptAfterData((String) json); + } + break; + //解析的数据 + case 3: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .bizDataList((List) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setBizDataList((List) json); + } + break; + case 4: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .exceptionMsg((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setExceptionMsg((String) json); + } + break; + default: + return; + } + } + + /** + * 异步设置缓存 + * + * @param key + */ + public static ProcessEventTask getTask(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + return (ProcessEventTask) GuavaCacheUtil.getCache(key); + } + + /** + * 存库操作 + * + * @param devcode + */ + public static void saveData(String devcode, ParseResult result) { + //添加到线程池执行,异步存库 + threadPool.execute( + () -> { + ProcessEventTask processEventTask; + if (ObjectUtil.isNotEmpty(getTask(devcode))) { + synchronized (processEventTask = getTask(devcode)) { + IDeviceDataService deviceDataService = SpringContextUtil.getBean(DeviceDataServiceImpl.class); + if (ObjectUtil.isNotEmpty(processEventTask)) { + List deviceDataList = new ArrayList<>(); + for (Map BizDataMap : processEventTask.getBizDataList()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDevcode(processEventTask.getDevcode()); + deviceData.setDeviceType((Integer) BizDataMap.get("deviceType")); + deviceData.setUptime((String) BizDataMap.get("uptime")); + deviceData.setLogtime(new Date()); + deviceData.setDataJson(JSON.toJSONString(BizDataMap)); + deviceData.setDecryptBeforeData(processEventTask.getDecryptSoureData()); + deviceData.setDecryptAfterData(processEventTask.getDecryptAfterData()); + if (BizDataMap.containsKey("cell")) { + //电量不一定每次都有 + deviceData.setCell((Integer) BizDataMap.get("cell")); + } + if (BizDataMap.containsKey("dataValue")) { + //电量不一定每次都有 + deviceData.setDataValue((float) BizDataMap.get("dataValue")); + } + deviceData.setExceptionMsg(processEventTask.getExceptionMsg()); + deviceDataList.add(deviceData); + } + //批量保存 + deviceDataService.saveBatch(deviceDataList); + } + } + //移除缓存 + GuavaCacheUtil.remove(devcode); + } + } + ); + } + + //暂时不做设备的更新 + public void setDevice(String status) { + Device device = new Device(); + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java deleted file mode 100644 index 2f9c711..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.cache; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - - -public class listenerEvent { - - private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, - TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); - - /** - * 异步生成缓存 - * - * @param key - * @param json - */ - public void asynCreateLogCache(String key, String json) { - - - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 4e6beea..01b20f5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.cache.GuavaCacheUtil; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; import com.casic.missiles.exception.EngineException; @@ -56,12 +56,16 @@ } ParseResult result = null; + String devcode = null; try { //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + devcode = (String) parseFixedDataMap.get("devcode"); // 通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); + RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); if (ObjectUtil.isEmpty(ruleConfig)) { + //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); byteBuf.readBytes(protocolConfig.getPreFix().length()); @@ -94,10 +98,14 @@ } //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); - log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); + //解密前的报文 + log.debug("解析的密文是----------" + ByteBufUtil.hexDump(bizDataByteBuf)); +// ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(bizDataByteBuf), 1); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); - log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + //解密后报文 //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); @@ -112,16 +120,19 @@ for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); } - //数据发送,异步 + ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); + //存储数据 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - result=null; + //数据发送,异步,异常拦截 + ProtocolProcessEventListener.setTask(devcode, rex.getMessage(), 4); + result = null; frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); - }finally { -// GuavaCacheUtil.putCache("licValid",validLicResult); -// ValidateResult validLicResult = (ValidateResult) GuavaCacheUtil.getCache("licValid"); + } finally { + //数据发送,异步,转存整体数据 + ProtocolProcessEventListener.saveData(devcode, result); return result; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 8af55a6..e4a79ae 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -1,10 +1,13 @@ package com.casic.missiles.parser; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; +import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; @@ -12,6 +15,7 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -25,10 +29,28 @@ public class ProtocolParserSupport { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; + } + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + //打印源数据,设备编号 + ProcessEventTask processEventTask = ProcessEventTask.builder() + .devcode((String) parseFixedDataMap.get("devcode")) + .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte)) + .build(); + ProtocolProcessEventListener.asynAddTask(processEventTask); + return parseFixedDataMap; + } + /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -39,10 +61,8 @@ } String rulePrepareFields = protocolConfig.getRulePrepareFields(); //固定字段 - if (StringUtils.isNotEmpty(rulePrepareFields)) { - //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + if (StringUtils.isNotEmpty(rulePrepareFields) && ObjectUtil.isNotEmpty(parseFixedDataMap)) { + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap)); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index b162def..9c413ed 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,13 +1,13 @@ package com.casic.missiles.parser.matcher; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.*; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 8eb0682..23d1e4c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 4c02a81..e8506e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -1,10 +1,10 @@ package com.casic.missiles.parser.resolver.fields; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 204b4dc..54b4e58 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.rule; import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.pojo.RuleConfig; import lombok.extern.slf4j.Slf4j; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index 7c6350b..3d89d0d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.impl.KafkaSubscribe; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 68aca0e..81644ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -271,7 +271,7 @@ if (showSkip()) { return null; } - //获取缓存 + //缓存命中 if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { return (Map) singleObjects.get(FIXED_FIELD_DS); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java index 0523447..9dc64f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java @@ -1,7 +1,7 @@ package com.casic.missiles.provider; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FileNameEnums; import com.casic.missiles.parser.crc.CRC16; import com.casic.missiles.pojo.UpgradeFileResult; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index ddaadbe..c3a00ce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java index fe9fb77..d6fad15 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java @@ -1,6 +1,6 @@ package com.casic.missiles.replier.decorator; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import io.netty.buffer.ByteBuf; import org.bouncycastle.util.encoders.Hex; diff --git a/sensorhub-core/src/main/resources/config/application-bd.yml b/sensorhub-core/src/main/resources/config/application-bd.yml deleted file mode 100644 index 0a78bf1..0000000 --- a/sensorhub-core/src/main/resources/config/application-bd.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7080 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml deleted file mode 100644 index ec8d4b6..0000000 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7093 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml deleted file mode 100644 index 4dfc9ee..0000000 --- a/sensorhub-core/src/main/resources/config/application.yml +++ /dev/null @@ -1,78 +0,0 @@ -########################################################## -spring: - profiles: - active: dev - servlet: - multipart: - max-file-size: 50MB - max-request-size: 80MB - mvc: - pathmatch: - matching-strategy: ant_path_matcher - kafka: - #kafka配置 - producer: - # Kafka服务器 - bootstrap-servers: '111.198.10.15:12502' - transaction-id-prefix: kafkaTx- - retries: 3 - acks: all - batch-size: 16384 - buffer-memory: 1024000 - consumer: - # Kafka服务器 - bootstrap-servers: '111.198.10.15:12502' - group-id: 1 - auto-offset-reset: latest - enable-auto-commit: false - max-poll-records: 3 - properties: - max: - poll: - interval: - ms: 600000 - session: - timeout: - ms: 10000 - listener: - concurrency: 4 - ack-mode: manual_immediate - missing-topics-fatal: false - cache: - redis: - time-to-live: 600000 # 缓存默认有效时长,以毫秒为单位 - type: redis #指定使用redis作为缓存 -mybatis-plus: - global-config: - enable-sql-runner: true - #关闭配置数据库下划线字段转驼峰 - configuration: - map-underscore-to-camel-case: true - # 配置结果集属性为空时 是否映射返回结果 - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 - mapper-locations: classpath*:mapper/*.xml -mybatis: - mapper-locations: classpath*:mapper/*.xml -#mybatis-plus: -# sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector -casic: - device: - redis: - invalid-time: 86400 - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - config-prefix: 'Casic:' - serializer: org.springframework.data.redis.serializer.StringRedisSerializer - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -#代码生成器配置 -code: - generate: - #作者 - author: cz - #待生成对象表名 - table-name: bussiness_field_config,combined_field_config -sensorhub: - config: - port: 7092 - secret: \ No newline at end of file diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index bfbec51..ff24f09 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -18,6 +18,7 @@ spring-boot-starter-web ${boot.version} + org.springframework.boot spring-boot-starter-test @@ -63,16 +64,6 @@ 1.71 - - - org.springframework.boot - spring-boot-starter-cache - - - - org.apache.commons - commons-pool2 - org.springframework.boot diff --git a/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java index f0ebbbc..fcbde85 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java @@ -50,7 +50,7 @@ * 指定使用哪一种缓存 * @return */ - @Bean + @Bean("redisCacheManager") @Override public CacheManager cacheManager() { RedisSerializer redisSerializer = new StringRedisSerializer(); diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java index 31b0bdd..623eeb1 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java @@ -1,5 +1,6 @@ package com.casic.missiles.mapper; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.pojo.SubscribeConfig; import org.apache.ibatis.annotations.Mapper; @@ -8,9 +9,7 @@ * @author cz * */ -@Mapper public interface SubscribeConfigMapper extends BaseMapper { - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java new file mode 100644 index 0000000..8484cfd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java @@ -0,0 +1,63 @@ +package com.casic.missiles.pojo; + +import lombok.Builder; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-11-24 + */ +@Builder +@Data +public class ProcessEventTask { + + /** + * 最新采集时间 + */ + private String uptime; + + /** + * 最新设备电量 + */ + private String cell; + + /** + * 设备编号 + */ + private String devcode; + + + /** + * 设备编号 + */ + private String decryptSoureData; + + /** + * 最新数据 + */ + private String dataValue; + + /** + * 最新解密前的数据报文 + */ + private String decryptBeforeData; + + /** + * 最新解密后的数据报文 + */ + private String decryptAfterData; + + /** + * 解析数据 + */ + private List> bizDataList; + + /** + * 异常信息收集 + */ + private String exceptionMsg; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java index d120d83..cee735f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.CombinedFieldMapper; @@ -11,6 +12,7 @@ import java.util.List; @Service +@DS("sensorhub") public class CombinedFieldConfigRegistryImpl extends ServiceImpl implements CombinedFieldConfigRegistry { @Override diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java index e07d2ff..b0e8304 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.CommandEventMapper; @@ -10,6 +11,7 @@ import java.util.List; import java.util.Optional; +@DS("sensorhub") public class CommandEventRegistryImpl extends ServiceImpl implements CommandEventRegistry { @Override diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java index 5d7cd8a..d2d1748 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.DatagramEventConfigMapper; @@ -12,6 +13,7 @@ import java.util.List; @Service +@DS("sensorhub") public class DatagramEventRegistryImpl extends ServiceImpl implements DatagramEventRegistry { diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java index 115f113..28326bb 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.FieldConfigMapper; @@ -14,6 +15,7 @@ * @author cz */ @Service +@DS("sensorhub") public class FieldConfigRegistryImpl extends ServiceImpl implements FieldConfigRegistry { @Override diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java index 0fe0c63..285530c 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.FieldRuleConfigMapper; @@ -11,6 +12,7 @@ import java.util.List; @Service +@DS("sensorhub") public class FieldRuleConfigRegistryImpl extends ServiceImpl implements FieldRuleConfigRegistry { @Override diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java index 6497ddd..35aec6d 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.ProtocolConfigMapper; @@ -11,6 +12,7 @@ import java.util.List; @Service +@DS("sensorhub") public class ProtocolConfigRegistryImpl extends ServiceImpl implements ProtocolConfigRegistry { /** diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java new file mode 100644 index 0000000..88baf61 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java @@ -0,0 +1,174 @@ +package com.casic.missiles.cache; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.model.Device; +import com.casic.missiles.model.DeviceData; +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.pojo.ProcessEventTask; +import com.casic.missiles.service.IDeviceDataService; +import com.casic.missiles.service.impl.DeviceDataServiceImpl; +import com.casic.missiles.util.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 流程节点事件监听器 + */ +public class ProtocolProcessEventListener { + + private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); + + /** + * 异步生成缓存 + * + * @param processEventTask + */ + public static void asynAddTask(ProcessEventTask processEventTask) { + if (StringUtils.isNotEmpty(processEventTask.getDevcode())) { + GuavaCacheUtil.putCache(processEventTask.getDevcode(), processEventTask); + } + } + + /** + * 异步设置缓存 + * + * @param key + * @param json + */ + public static void setTask(String key, Object json, Integer node) { + //如果key为空,则直接返回 + if (StringUtils.isEmpty(key) || ObjectUtil.isEmpty(json)) { + return; + } + ProcessEventTask processEventTask = null; + switch (node) { + //解密前的数据 + case 1: + //如果为空可以补救 +// if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { +// processEventTask = ProcessEventTask.builder() +// .devcode(key) +// .decryptSoureData((String) json) +// .decryptBeforeData((String) json) +// .build(); +// asynAddTask(processEventTask); +// } else { +// processEventTask.setDecryptBeforeData((String) json); +// } +// break; + //解密后的数据 + case 2: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .decryptAfterData((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setDecryptAfterData((String) json); + } + break; + //解析的数据 + case 3: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .bizDataList((List) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setBizDataList((List) json); + } + break; + case 4: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .exceptionMsg((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setExceptionMsg((String) json); + } + break; + default: + return; + } + } + + /** + * 异步设置缓存 + * + * @param key + */ + public static ProcessEventTask getTask(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + return (ProcessEventTask) GuavaCacheUtil.getCache(key); + } + + /** + * 存库操作 + * + * @param devcode + */ + public static void saveData(String devcode, ParseResult result) { + //添加到线程池执行,异步存库 + threadPool.execute( + () -> { + ProcessEventTask processEventTask; + if (ObjectUtil.isNotEmpty(getTask(devcode))) { + synchronized (processEventTask = getTask(devcode)) { + IDeviceDataService deviceDataService = SpringContextUtil.getBean(DeviceDataServiceImpl.class); + if (ObjectUtil.isNotEmpty(processEventTask)) { + List deviceDataList = new ArrayList<>(); + for (Map BizDataMap : processEventTask.getBizDataList()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDevcode(processEventTask.getDevcode()); + deviceData.setDeviceType((Integer) BizDataMap.get("deviceType")); + deviceData.setUptime((String) BizDataMap.get("uptime")); + deviceData.setLogtime(new Date()); + deviceData.setDataJson(JSON.toJSONString(BizDataMap)); + deviceData.setDecryptBeforeData(processEventTask.getDecryptSoureData()); + deviceData.setDecryptAfterData(processEventTask.getDecryptAfterData()); + if (BizDataMap.containsKey("cell")) { + //电量不一定每次都有 + deviceData.setCell((Integer) BizDataMap.get("cell")); + } + if (BizDataMap.containsKey("dataValue")) { + //电量不一定每次都有 + deviceData.setDataValue((float) BizDataMap.get("dataValue")); + } + deviceData.setExceptionMsg(processEventTask.getExceptionMsg()); + deviceDataList.add(deviceData); + } + //批量保存 + deviceDataService.saveBatch(deviceDataList); + } + } + //移除缓存 + GuavaCacheUtil.remove(devcode); + } + } + ); + } + + //暂时不做设备的更新 + public void setDevice(String status) { + Device device = new Device(); + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java deleted file mode 100644 index 2f9c711..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.cache; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - - -public class listenerEvent { - - private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, - TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); - - /** - * 异步生成缓存 - * - * @param key - * @param json - */ - public void asynCreateLogCache(String key, String json) { - - - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 4e6beea..01b20f5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.cache.GuavaCacheUtil; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; import com.casic.missiles.exception.EngineException; @@ -56,12 +56,16 @@ } ParseResult result = null; + String devcode = null; try { //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + devcode = (String) parseFixedDataMap.get("devcode"); // 通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); + RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); if (ObjectUtil.isEmpty(ruleConfig)) { + //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); byteBuf.readBytes(protocolConfig.getPreFix().length()); @@ -94,10 +98,14 @@ } //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); - log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); + //解密前的报文 + log.debug("解析的密文是----------" + ByteBufUtil.hexDump(bizDataByteBuf)); +// ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(bizDataByteBuf), 1); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); - log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + //解密后报文 //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); @@ -112,16 +120,19 @@ for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); } - //数据发送,异步 + ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); + //存储数据 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - result=null; + //数据发送,异步,异常拦截 + ProtocolProcessEventListener.setTask(devcode, rex.getMessage(), 4); + result = null; frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); - }finally { -// GuavaCacheUtil.putCache("licValid",validLicResult); -// ValidateResult validLicResult = (ValidateResult) GuavaCacheUtil.getCache("licValid"); + } finally { + //数据发送,异步,转存整体数据 + ProtocolProcessEventListener.saveData(devcode, result); return result; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 8af55a6..e4a79ae 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -1,10 +1,13 @@ package com.casic.missiles.parser; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; +import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; @@ -12,6 +15,7 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -25,10 +29,28 @@ public class ProtocolParserSupport { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; + } + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + //打印源数据,设备编号 + ProcessEventTask processEventTask = ProcessEventTask.builder() + .devcode((String) parseFixedDataMap.get("devcode")) + .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte)) + .build(); + ProtocolProcessEventListener.asynAddTask(processEventTask); + return parseFixedDataMap; + } + /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -39,10 +61,8 @@ } String rulePrepareFields = protocolConfig.getRulePrepareFields(); //固定字段 - if (StringUtils.isNotEmpty(rulePrepareFields)) { - //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + if (StringUtils.isNotEmpty(rulePrepareFields) && ObjectUtil.isNotEmpty(parseFixedDataMap)) { + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap)); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index b162def..9c413ed 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,13 +1,13 @@ package com.casic.missiles.parser.matcher; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.*; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 8eb0682..23d1e4c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 4c02a81..e8506e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -1,10 +1,10 @@ package com.casic.missiles.parser.resolver.fields; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 204b4dc..54b4e58 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.rule; import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.pojo.RuleConfig; import lombok.extern.slf4j.Slf4j; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index 7c6350b..3d89d0d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.impl.KafkaSubscribe; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 68aca0e..81644ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -271,7 +271,7 @@ if (showSkip()) { return null; } - //获取缓存 + //缓存命中 if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { return (Map) singleObjects.get(FIXED_FIELD_DS); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java index 0523447..9dc64f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java @@ -1,7 +1,7 @@ package com.casic.missiles.provider; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FileNameEnums; import com.casic.missiles.parser.crc.CRC16; import com.casic.missiles.pojo.UpgradeFileResult; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index ddaadbe..c3a00ce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java index fe9fb77..d6fad15 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java @@ -1,6 +1,6 @@ package com.casic.missiles.replier.decorator; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import io.netty.buffer.ByteBuf; import org.bouncycastle.util.encoders.Hex; diff --git a/sensorhub-core/src/main/resources/config/application-bd.yml b/sensorhub-core/src/main/resources/config/application-bd.yml deleted file mode 100644 index 0a78bf1..0000000 --- a/sensorhub-core/src/main/resources/config/application-bd.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7080 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml deleted file mode 100644 index ec8d4b6..0000000 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7093 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml deleted file mode 100644 index 4dfc9ee..0000000 --- a/sensorhub-core/src/main/resources/config/application.yml +++ /dev/null @@ -1,78 +0,0 @@ -########################################################## -spring: - profiles: - active: dev - servlet: - multipart: - max-file-size: 50MB - max-request-size: 80MB - mvc: - pathmatch: - matching-strategy: ant_path_matcher - kafka: - #kafka配置 - producer: - # Kafka服务器 - bootstrap-servers: '111.198.10.15:12502' - transaction-id-prefix: kafkaTx- - retries: 3 - acks: all - batch-size: 16384 - buffer-memory: 1024000 - consumer: - # Kafka服务器 - bootstrap-servers: '111.198.10.15:12502' - group-id: 1 - auto-offset-reset: latest - enable-auto-commit: false - max-poll-records: 3 - properties: - max: - poll: - interval: - ms: 600000 - session: - timeout: - ms: 10000 - listener: - concurrency: 4 - ack-mode: manual_immediate - missing-topics-fatal: false - cache: - redis: - time-to-live: 600000 # 缓存默认有效时长,以毫秒为单位 - type: redis #指定使用redis作为缓存 -mybatis-plus: - global-config: - enable-sql-runner: true - #关闭配置数据库下划线字段转驼峰 - configuration: - map-underscore-to-camel-case: true - # 配置结果集属性为空时 是否映射返回结果 - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 - mapper-locations: classpath*:mapper/*.xml -mybatis: - mapper-locations: classpath*:mapper/*.xml -#mybatis-plus: -# sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector -casic: - device: - redis: - invalid-time: 86400 - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - config-prefix: 'Casic:' - serializer: org.springframework.data.redis.serializer.StringRedisSerializer - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -#代码生成器配置 -code: - generate: - #作者 - author: cz - #待生成对象表名 - table-name: bussiness_field_config,combined_field_config -sensorhub: - config: - port: 7092 - secret: \ No newline at end of file diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index bfbec51..ff24f09 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -18,6 +18,7 @@ spring-boot-starter-web ${boot.version} + org.springframework.boot spring-boot-starter-test @@ -63,16 +64,6 @@ 1.71 - - - org.springframework.boot - spring-boot-starter-cache - - - - org.apache.commons - commons-pool2 - org.springframework.boot diff --git a/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java index f0ebbbc..fcbde85 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java @@ -50,7 +50,7 @@ * 指定使用哪一种缓存 * @return */ - @Bean + @Bean("redisCacheManager") @Override public CacheManager cacheManager() { RedisSerializer redisSerializer = new StringRedisSerializer(); diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java index 31b0bdd..623eeb1 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java @@ -1,5 +1,6 @@ package com.casic.missiles.mapper; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.pojo.SubscribeConfig; import org.apache.ibatis.annotations.Mapper; @@ -8,9 +9,7 @@ * @author cz * */ -@Mapper public interface SubscribeConfigMapper extends BaseMapper { - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java new file mode 100644 index 0000000..8484cfd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java @@ -0,0 +1,63 @@ +package com.casic.missiles.pojo; + +import lombok.Builder; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-11-24 + */ +@Builder +@Data +public class ProcessEventTask { + + /** + * 最新采集时间 + */ + private String uptime; + + /** + * 最新设备电量 + */ + private String cell; + + /** + * 设备编号 + */ + private String devcode; + + + /** + * 设备编号 + */ + private String decryptSoureData; + + /** + * 最新数据 + */ + private String dataValue; + + /** + * 最新解密前的数据报文 + */ + private String decryptBeforeData; + + /** + * 最新解密后的数据报文 + */ + private String decryptAfterData; + + /** + * 解析数据 + */ + private List> bizDataList; + + /** + * 异常信息收集 + */ + private String exceptionMsg; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java index d120d83..cee735f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.CombinedFieldMapper; @@ -11,6 +12,7 @@ import java.util.List; @Service +@DS("sensorhub") public class CombinedFieldConfigRegistryImpl extends ServiceImpl implements CombinedFieldConfigRegistry { @Override diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java index e07d2ff..b0e8304 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.CommandEventMapper; @@ -10,6 +11,7 @@ import java.util.List; import java.util.Optional; +@DS("sensorhub") public class CommandEventRegistryImpl extends ServiceImpl implements CommandEventRegistry { @Override diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java index 5d7cd8a..d2d1748 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.DatagramEventConfigMapper; @@ -12,6 +13,7 @@ import java.util.List; @Service +@DS("sensorhub") public class DatagramEventRegistryImpl extends ServiceImpl implements DatagramEventRegistry { diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java index 115f113..28326bb 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.FieldConfigMapper; @@ -14,6 +15,7 @@ * @author cz */ @Service +@DS("sensorhub") public class FieldConfigRegistryImpl extends ServiceImpl implements FieldConfigRegistry { @Override diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java index 0fe0c63..285530c 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.FieldRuleConfigMapper; @@ -11,6 +12,7 @@ import java.util.List; @Service +@DS("sensorhub") public class FieldRuleConfigRegistryImpl extends ServiceImpl implements FieldRuleConfigRegistry { @Override diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java index 6497ddd..35aec6d 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.ProtocolConfigMapper; @@ -11,6 +12,7 @@ import java.util.List; @Service +@DS("sensorhub") public class ProtocolConfigRegistryImpl extends ServiceImpl implements ProtocolConfigRegistry { /** diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolFieldConfigRegistryImpl.java index 5f3a230..285e1dd 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolFieldConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolFieldConfigRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.ProtocolFieldConfigMapper; @@ -13,6 +14,7 @@ import java.util.List; @Service +@DS("sensorhub") public class ProtocolFieldConfigRegistryImpl extends ServiceImpl implements ProtocolFieldConfigRegistry { @Override diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java new file mode 100644 index 0000000..88baf61 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java @@ -0,0 +1,174 @@ +package com.casic.missiles.cache; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.model.Device; +import com.casic.missiles.model.DeviceData; +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.pojo.ProcessEventTask; +import com.casic.missiles.service.IDeviceDataService; +import com.casic.missiles.service.impl.DeviceDataServiceImpl; +import com.casic.missiles.util.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 流程节点事件监听器 + */ +public class ProtocolProcessEventListener { + + private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); + + /** + * 异步生成缓存 + * + * @param processEventTask + */ + public static void asynAddTask(ProcessEventTask processEventTask) { + if (StringUtils.isNotEmpty(processEventTask.getDevcode())) { + GuavaCacheUtil.putCache(processEventTask.getDevcode(), processEventTask); + } + } + + /** + * 异步设置缓存 + * + * @param key + * @param json + */ + public static void setTask(String key, Object json, Integer node) { + //如果key为空,则直接返回 + if (StringUtils.isEmpty(key) || ObjectUtil.isEmpty(json)) { + return; + } + ProcessEventTask processEventTask = null; + switch (node) { + //解密前的数据 + case 1: + //如果为空可以补救 +// if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { +// processEventTask = ProcessEventTask.builder() +// .devcode(key) +// .decryptSoureData((String) json) +// .decryptBeforeData((String) json) +// .build(); +// asynAddTask(processEventTask); +// } else { +// processEventTask.setDecryptBeforeData((String) json); +// } +// break; + //解密后的数据 + case 2: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .decryptAfterData((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setDecryptAfterData((String) json); + } + break; + //解析的数据 + case 3: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .bizDataList((List) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setBizDataList((List) json); + } + break; + case 4: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .exceptionMsg((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setExceptionMsg((String) json); + } + break; + default: + return; + } + } + + /** + * 异步设置缓存 + * + * @param key + */ + public static ProcessEventTask getTask(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + return (ProcessEventTask) GuavaCacheUtil.getCache(key); + } + + /** + * 存库操作 + * + * @param devcode + */ + public static void saveData(String devcode, ParseResult result) { + //添加到线程池执行,异步存库 + threadPool.execute( + () -> { + ProcessEventTask processEventTask; + if (ObjectUtil.isNotEmpty(getTask(devcode))) { + synchronized (processEventTask = getTask(devcode)) { + IDeviceDataService deviceDataService = SpringContextUtil.getBean(DeviceDataServiceImpl.class); + if (ObjectUtil.isNotEmpty(processEventTask)) { + List deviceDataList = new ArrayList<>(); + for (Map BizDataMap : processEventTask.getBizDataList()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDevcode(processEventTask.getDevcode()); + deviceData.setDeviceType((Integer) BizDataMap.get("deviceType")); + deviceData.setUptime((String) BizDataMap.get("uptime")); + deviceData.setLogtime(new Date()); + deviceData.setDataJson(JSON.toJSONString(BizDataMap)); + deviceData.setDecryptBeforeData(processEventTask.getDecryptSoureData()); + deviceData.setDecryptAfterData(processEventTask.getDecryptAfterData()); + if (BizDataMap.containsKey("cell")) { + //电量不一定每次都有 + deviceData.setCell((Integer) BizDataMap.get("cell")); + } + if (BizDataMap.containsKey("dataValue")) { + //电量不一定每次都有 + deviceData.setDataValue((float) BizDataMap.get("dataValue")); + } + deviceData.setExceptionMsg(processEventTask.getExceptionMsg()); + deviceDataList.add(deviceData); + } + //批量保存 + deviceDataService.saveBatch(deviceDataList); + } + } + //移除缓存 + GuavaCacheUtil.remove(devcode); + } + } + ); + } + + //暂时不做设备的更新 + public void setDevice(String status) { + Device device = new Device(); + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java deleted file mode 100644 index 2f9c711..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.cache; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - - -public class listenerEvent { - - private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, - TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); - - /** - * 异步生成缓存 - * - * @param key - * @param json - */ - public void asynCreateLogCache(String key, String json) { - - - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 4e6beea..01b20f5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.cache.GuavaCacheUtil; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; import com.casic.missiles.exception.EngineException; @@ -56,12 +56,16 @@ } ParseResult result = null; + String devcode = null; try { //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + devcode = (String) parseFixedDataMap.get("devcode"); // 通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); + RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); if (ObjectUtil.isEmpty(ruleConfig)) { + //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); byteBuf.readBytes(protocolConfig.getPreFix().length()); @@ -94,10 +98,14 @@ } //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); - log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); + //解密前的报文 + log.debug("解析的密文是----------" + ByteBufUtil.hexDump(bizDataByteBuf)); +// ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(bizDataByteBuf), 1); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); - log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + //解密后报文 //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); @@ -112,16 +120,19 @@ for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); } - //数据发送,异步 + ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); + //存储数据 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - result=null; + //数据发送,异步,异常拦截 + ProtocolProcessEventListener.setTask(devcode, rex.getMessage(), 4); + result = null; frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); - }finally { -// GuavaCacheUtil.putCache("licValid",validLicResult); -// ValidateResult validLicResult = (ValidateResult) GuavaCacheUtil.getCache("licValid"); + } finally { + //数据发送,异步,转存整体数据 + ProtocolProcessEventListener.saveData(devcode, result); return result; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 8af55a6..e4a79ae 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -1,10 +1,13 @@ package com.casic.missiles.parser; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; +import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; @@ -12,6 +15,7 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -25,10 +29,28 @@ public class ProtocolParserSupport { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; + } + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + //打印源数据,设备编号 + ProcessEventTask processEventTask = ProcessEventTask.builder() + .devcode((String) parseFixedDataMap.get("devcode")) + .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte)) + .build(); + ProtocolProcessEventListener.asynAddTask(processEventTask); + return parseFixedDataMap; + } + /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -39,10 +61,8 @@ } String rulePrepareFields = protocolConfig.getRulePrepareFields(); //固定字段 - if (StringUtils.isNotEmpty(rulePrepareFields)) { - //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + if (StringUtils.isNotEmpty(rulePrepareFields) && ObjectUtil.isNotEmpty(parseFixedDataMap)) { + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap)); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index b162def..9c413ed 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,13 +1,13 @@ package com.casic.missiles.parser.matcher; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.*; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 8eb0682..23d1e4c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 4c02a81..e8506e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -1,10 +1,10 @@ package com.casic.missiles.parser.resolver.fields; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 204b4dc..54b4e58 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.rule; import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.pojo.RuleConfig; import lombok.extern.slf4j.Slf4j; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index 7c6350b..3d89d0d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.impl.KafkaSubscribe; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 68aca0e..81644ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -271,7 +271,7 @@ if (showSkip()) { return null; } - //获取缓存 + //缓存命中 if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { return (Map) singleObjects.get(FIXED_FIELD_DS); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java index 0523447..9dc64f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java @@ -1,7 +1,7 @@ package com.casic.missiles.provider; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FileNameEnums; import com.casic.missiles.parser.crc.CRC16; import com.casic.missiles.pojo.UpgradeFileResult; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index ddaadbe..c3a00ce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java index fe9fb77..d6fad15 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java @@ -1,6 +1,6 @@ package com.casic.missiles.replier.decorator; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import io.netty.buffer.ByteBuf; import org.bouncycastle.util.encoders.Hex; diff --git a/sensorhub-core/src/main/resources/config/application-bd.yml b/sensorhub-core/src/main/resources/config/application-bd.yml deleted file mode 100644 index 0a78bf1..0000000 --- a/sensorhub-core/src/main/resources/config/application-bd.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7080 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml deleted file mode 100644 index ec8d4b6..0000000 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7093 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml deleted file mode 100644 index 4dfc9ee..0000000 --- a/sensorhub-core/src/main/resources/config/application.yml +++ /dev/null @@ -1,78 +0,0 @@ -########################################################## -spring: - profiles: - active: dev - servlet: - multipart: - max-file-size: 50MB - max-request-size: 80MB - mvc: - pathmatch: - matching-strategy: ant_path_matcher - kafka: - #kafka配置 - producer: - # Kafka服务器 - bootstrap-servers: '111.198.10.15:12502' - transaction-id-prefix: kafkaTx- - retries: 3 - acks: all - batch-size: 16384 - buffer-memory: 1024000 - consumer: - # Kafka服务器 - bootstrap-servers: '111.198.10.15:12502' - group-id: 1 - auto-offset-reset: latest - enable-auto-commit: false - max-poll-records: 3 - properties: - max: - poll: - interval: - ms: 600000 - session: - timeout: - ms: 10000 - listener: - concurrency: 4 - ack-mode: manual_immediate - missing-topics-fatal: false - cache: - redis: - time-to-live: 600000 # 缓存默认有效时长,以毫秒为单位 - type: redis #指定使用redis作为缓存 -mybatis-plus: - global-config: - enable-sql-runner: true - #关闭配置数据库下划线字段转驼峰 - configuration: - map-underscore-to-camel-case: true - # 配置结果集属性为空时 是否映射返回结果 - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 - mapper-locations: classpath*:mapper/*.xml -mybatis: - mapper-locations: classpath*:mapper/*.xml -#mybatis-plus: -# sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector -casic: - device: - redis: - invalid-time: 86400 - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - config-prefix: 'Casic:' - serializer: org.springframework.data.redis.serializer.StringRedisSerializer - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -#代码生成器配置 -code: - generate: - #作者 - author: cz - #待生成对象表名 - table-name: bussiness_field_config,combined_field_config -sensorhub: - config: - port: 7092 - secret: \ No newline at end of file diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index bfbec51..ff24f09 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -18,6 +18,7 @@ spring-boot-starter-web ${boot.version} + org.springframework.boot spring-boot-starter-test @@ -63,16 +64,6 @@ 1.71 - - - org.springframework.boot - spring-boot-starter-cache - - - - org.apache.commons - commons-pool2 - org.springframework.boot diff --git a/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java index f0ebbbc..fcbde85 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java @@ -50,7 +50,7 @@ * 指定使用哪一种缓存 * @return */ - @Bean + @Bean("redisCacheManager") @Override public CacheManager cacheManager() { RedisSerializer redisSerializer = new StringRedisSerializer(); diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java index 31b0bdd..623eeb1 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java @@ -1,5 +1,6 @@ package com.casic.missiles.mapper; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.pojo.SubscribeConfig; import org.apache.ibatis.annotations.Mapper; @@ -8,9 +9,7 @@ * @author cz * */ -@Mapper public interface SubscribeConfigMapper extends BaseMapper { - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java new file mode 100644 index 0000000..8484cfd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java @@ -0,0 +1,63 @@ +package com.casic.missiles.pojo; + +import lombok.Builder; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-11-24 + */ +@Builder +@Data +public class ProcessEventTask { + + /** + * 最新采集时间 + */ + private String uptime; + + /** + * 最新设备电量 + */ + private String cell; + + /** + * 设备编号 + */ + private String devcode; + + + /** + * 设备编号 + */ + private String decryptSoureData; + + /** + * 最新数据 + */ + private String dataValue; + + /** + * 最新解密前的数据报文 + */ + private String decryptBeforeData; + + /** + * 最新解密后的数据报文 + */ + private String decryptAfterData; + + /** + * 解析数据 + */ + private List> bizDataList; + + /** + * 异常信息收集 + */ + private String exceptionMsg; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java index d120d83..cee735f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.CombinedFieldMapper; @@ -11,6 +12,7 @@ import java.util.List; @Service +@DS("sensorhub") public class CombinedFieldConfigRegistryImpl extends ServiceImpl implements CombinedFieldConfigRegistry { @Override diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java index e07d2ff..b0e8304 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.CommandEventMapper; @@ -10,6 +11,7 @@ import java.util.List; import java.util.Optional; +@DS("sensorhub") public class CommandEventRegistryImpl extends ServiceImpl implements CommandEventRegistry { @Override diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java index 5d7cd8a..d2d1748 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.DatagramEventConfigMapper; @@ -12,6 +13,7 @@ import java.util.List; @Service +@DS("sensorhub") public class DatagramEventRegistryImpl extends ServiceImpl implements DatagramEventRegistry { diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java index 115f113..28326bb 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.FieldConfigMapper; @@ -14,6 +15,7 @@ * @author cz */ @Service +@DS("sensorhub") public class FieldConfigRegistryImpl extends ServiceImpl implements FieldConfigRegistry { @Override diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java index 0fe0c63..285530c 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.FieldRuleConfigMapper; @@ -11,6 +12,7 @@ import java.util.List; @Service +@DS("sensorhub") public class FieldRuleConfigRegistryImpl extends ServiceImpl implements FieldRuleConfigRegistry { @Override diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java index 6497ddd..35aec6d 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.ProtocolConfigMapper; @@ -11,6 +12,7 @@ import java.util.List; @Service +@DS("sensorhub") public class ProtocolConfigRegistryImpl extends ServiceImpl implements ProtocolConfigRegistry { /** diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolFieldConfigRegistryImpl.java index 5f3a230..285e1dd 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolFieldConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolFieldConfigRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.ProtocolFieldConfigMapper; @@ -13,6 +14,7 @@ import java.util.List; @Service +@DS("sensorhub") public class ProtocolFieldConfigRegistryImpl extends ServiceImpl implements ProtocolFieldConfigRegistry { @Override diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java index 92ac56e..3b57c64 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.RuleConfigMapper; @@ -11,6 +12,7 @@ import java.util.List; @Service +@DS("sensorhub") public class RuleConfigRegistryImpl extends ServiceImpl implements RuleConfigRegistry { diff --git a/casic-iot-common/pom.xml b/casic-iot-common/pom.xml index 2bdfa0e..75e6e82 100644 --- a/casic-iot-common/pom.xml +++ b/casic-iot-common/pom.xml @@ -32,10 +32,10 @@ - com.casic - casic-core - ${core.version} - + com.casic + casic-core + ${core.version} + com.casic casic-admin-support diff --git a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml index beb153c..30beef4 100644 --- a/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/resource/mapper/BusConfigMapper.xml @@ -18,7 +18,7 @@ id, Pid, devcode, config_json, status, update_time, create_time, create_user_id - diff --git a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml index 528a74b..b124015 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceDataMapper.xml @@ -15,6 +15,18 @@ + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime @@ -28,30 +40,43 @@ SELECT FROM device_data WHERE 1=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} + + AND uptime = ]]> + + + + + + AND uptime + + + + and id in #{id} + )dd JOIN ( SELECT id,group_id FROM device WHERE valid=1 - + AND devcode like CONCAT('%',#{request.devcode},'%') - + AND device_type =#{request.deviceType} - + AND greoup_id=#{request.groupId} )d ON d.devcode=dd.devcode @@ -59,11 +84,11 @@ SELECT deptid,id,group_name FROM device_group WHERE valid=1 - + AND id=#{request.groupId} ) dg ON dg.id=dd.group_id - + order by logtime desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml index 1475a8b..93cec97 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceGroupMapper.xml @@ -80,6 +80,7 @@ FROM subscribe_store ) s ON s.groupId = dg.id GROUP BY dg.id + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml index 7006b62..0b308f2 100644 --- a/casic-iot-dao/src/resource/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/resource/mapper/DeviceMapper.xml @@ -75,6 +75,7 @@ FROM device_data GROUP BY devcode,data_value,cell )dd ON dd.devcode=d.devcode + order by create_time desc diff --git a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml index 82a394a..2f96661 100644 --- a/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml +++ b/casic-iot-dao/src/resource/mapper/SubscribeStoreMapper.xml @@ -4,17 +4,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -23,36 +23,38 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java new file mode 100644 index 0000000..e0c72e3 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/BusConfigDTO.java @@ -0,0 +1,175 @@ +package com.casic.missiles.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.casic.missiles.enums.DeviceTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023/11/24 + */ +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +public class BusConfigDTO { + + private Long id; + + /** + * 设备编号 + */ + private String devcode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备类型编号 + */ + private Long deviceType; + /** + * 设备类型名称 + */ + private String deviceTypeName; + /** + * 权属单位id + */ + private String deptid; + /** + * 权属单位名称 + */ + private String deptName; + + /** + * 低报警阈值 导出字段 + */ + @ExcelProperty("低报警阈值") + private float lowerThreshold; + /** + * 高报警阈值 + */ + @ExcelProperty("高报警阈值") + private float upperThreshold; + + @ExcelProperty("重传次数") + private Integer retryTimes; + @ExcelProperty("IP地址") + private String ip; + @ExcelProperty("端口号") + private String port; + @ExcelProperty("最大尝试次数") + private Integer attemptsMax; + /** + * 已尝试次数 + */ + private String attemptsCurrent; + + /** + * 下发状态 + */ + private String status; + + /** + * 下发状态次数 + */ + private String statusName; + + /** + * 燃气监测终端-采集间隔 + */ + @ExcelProperty("采集间隔(分)") + private Integer collectInterval; + + /** + * 采集次数 + */ + @ExcelProperty("采集次数") + private Integer collectCount; + + /** + * 休眠周期 + */ + private String sleepPeriod; + + /** + * 燃气监测终端-上传周期 + */ + @ExcelProperty("上传周期(分)") + private String uploadPeriod; + /** + * 温湿度监测仪-采集时间 + */ + @ExcelProperty("采集时间(时:分)") + private String collectTime; + /** + * 休眠开始时间 + */ + @ExcelProperty("睡眠开始时间(时:分)") + private String sleepStartTime; + /** + * 休眠开始时间 + */ + private String sensorId; + + public static Map sensorHashMap = new HashMap(); + + {//根据前期产品化文档,配置时存入config表中对应的sensorid字段,区分是哪类设备 + sensorHashMap.put(DeviceTypeEnum.Liquid.getIndex(), "000034"); + sensorHashMap.put(DeviceTypeEnum.Methane.getIndex(), "000044"); + sensorHashMap.put(DeviceTypeEnum.Tube.getIndex(), "000080"); + sensorHashMap.put(DeviceTypeEnum.WasteGas.getIndex(), "000035"); + sensorHashMap.put(DeviceTypeEnum.TempHumi.getIndex(), "000055"); + sensorHashMap.put(DeviceTypeEnum.Dig.getIndex(), "000064"); + sensorHashMap.put(DeviceTypeEnum.Noise.getIndex(), "000032"); + sensorHashMap.put(DeviceTypeEnum.LG.getIndex(), "000065"); + sensorHashMap.put(DeviceTypeEnum.H2s.getIndex(), "000084"); + sensorHashMap.put(DeviceTypeEnum.Well.getIndex(), "000085"); + } + + public static BusConfigDTO ConvertDTO(Map objectMap) { + if (null != objectMap) { + BusConfigDTO dto = new BusConfigDTO(); + dto.setId(null != objectMap.get("id") ? + Long.valueOf(objectMap.get("id").toString()) : null); + dto.setDevcode((String) objectMap.get("devcode")); +// dto.setDeviceName(objectMap.get("deviceName").toString()); + dto.setDeviceType(null != objectMap.get("deviceType") ? + Long.valueOf(objectMap.get("deviceType").toString()) : null); + dto.setDeviceTypeName(objectMap.get("deviceTypeName").toString()); + dto.setDeptid(objectMap.get("deptid").toString()); + dto.setDeptName(objectMap.get("deptName").toString()); + dto.setAttemptsCurrent(null != objectMap.get("attemptscurrent") ? + objectMap.get("attemptscurrent").toString() : ""); + dto.setStatus(objectMap.get("status").toString()); + dto.setStatusName("1".equals(objectMap.get("status").toString()) ? + "已下发" : "未下发"); + dto.setAttemptsMax((Integer) objectMap.get("attemptsmax")); + return dto; + } + return new BusConfigDTO(); + } + + public static List convert(List> result) { + List busConfigDTOList = new ArrayList<>(); + for (Map objectMap : result) { + busConfigDTOList.add(ConvertDTO(objectMap)); + } + return busConfigDTOList; + } + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java index ac08a15..c763888 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListDTO.java @@ -20,7 +20,7 @@ private Integer messageType; @ApiModelProperty(value = "订阅方式(字典值)", dataType = "Integer") - private Integer subscribe_type; + private Integer subscribeType; @ApiModelProperty(value = "订阅状态", dataType = "Integer") private Integer status; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java index e012e2c..c1a3741 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/subscribe/SubscribeListVO.java @@ -1,22 +1,26 @@ package com.casic.missiles.dto.subscribe; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel -public class SubscribeListVO { +public class SubscribeListVO implements DictCodeEnum { private Long id; @ApiModelProperty(value = "消息类别", dataType = "Integer") + @DictCodeField(message = "消息类别不合法", cacheName = MESSAGE_TYPE) private Integer messageType; @ApiModelProperty(value = "消息类别", dataType = "String") private String messageTypeName; @ApiModelProperty(value = "订阅方式类别", dataType = "Integer") + @DictCodeField(message = "订阅方式不合法", cacheName = SUBSCRIBE_TYPE) private Integer subscribeType; @ApiModelProperty(value = "消息类别", dataType = "String") @@ -30,7 +34,7 @@ private Integer enable; @ApiModelProperty(value = "订阅状态", dataType = "Integer") - private Integer status; + private Integer subscribeStatus; @ApiModelProperty(value = "创建时间", dataType = "String") private String createTime; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..0f6092c --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DeviceTypeEnum.java @@ -0,0 +1,64 @@ +package com.casic.missiles.enums; + + +public enum DeviceTypeEnum { + Well("井盖状态监测仪", 1), + Liquid("液位监测仪", 2), + WasteGas("有害气体监测仪", 3), + Methane("燃气智能监测终端", 4), + TempHumi("温湿度监测仪", 5), + Dig("开挖监测仪", 6), + WellLocator("井盖定位监测仪", 7), + Noise("噪声记录仪", 8), + TempPressure("温度压力监测仪", 9), + FireHydrant("消防栓防盗水监测仪", 11), + Tube("管盯", 12), + LG("井盖液位一体机", 13), + H2s("硫化氢检测终端", 14); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private DeviceTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public static DeviceTypeEnum getByIndex(String index) { + try { + for (DeviceTypeEnum deviceTypeEnum : values()) { + if (deviceTypeEnum.index == Integer.parseInt(index)) { + return deviceTypeEnum; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } +} \ No newline at end of file diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index d7ca8c9..f62583a 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -63,7 +63,7 @@ * 下发配置内容 */ @TableField("config_json") - @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"upload\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + @ApiModelProperty(value = "{\"retryTimes\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"uploadPeriod\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") private String configJson; /** diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java index 1adf836..f27d24d 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceData.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; + import lombok.Getter; import lombok.Setter; @@ -26,16 +29,21 @@ /** * 编号 */ - @TableId("id") - private Integer id; + @TableId("id") + private Long id; /** * 设备编号 */ @TableField("devcode") - private Integer devcode; + private String devcode; /** + * 设备编号 + */ + @TableField("data_value") + private float dataValue; + /** * 设备类型 */ @TableField("device_type") @@ -75,7 +83,10 @@ * 记录日期 默认为当前时间 */ @TableField("logtime") - private LocalDateTime logtime; + private Date logtime; + @TableField("exception_msg") + private String exceptionMsg; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java index 3bb377e..1dd5694 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java @@ -20,7 +20,7 @@ */ public interface ISubscribeStoreService extends IService { - Page listPage(Page page, SubscribeListDTO request, DataScope dataScope); + Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception; ReturnDTO addStore(SubscribeStore subscribeStore); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 4e3da4b..823eb98 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -31,8 +31,8 @@ @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { - List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); - page.setRecords(subscribeListVOList); + List busConfigList = this.baseMapper.listPage(page, request, dataScope); + page.setRecords(busConfigList); return page; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java index 9548a2c..63a5e91 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java @@ -1,19 +1,23 @@ package com.casic.missiles.service.impl; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.device.DeviceListVO; import com.casic.missiles.dto.subscribe.SubscribeListDTO; import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.SubscribeStoreMapper; +import com.casic.missiles.model.ProductInfo; import com.casic.missiles.model.SubscribeStore; import com.casic.missiles.service.ISubscribeStoreService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.DictCodeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +35,11 @@ public class SubscribeStoreServiceImpl extends ServiceImpl implements ISubscribeStoreService { @Override - public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) { + public Page listPage(Page page, SubscribeListDTO request, DataScope dataScope) throws Exception{ List subscribeListVOList = this.baseMapper.listPage(page, request, dataScope); + for (SubscribeListVO subscribeListVO : subscribeListVOList) { + DictCodeUtils.convertDictCodeToName(subscribeListVO); + } page.setRecords(subscribeListVOList); return page; } diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml index 0e8f192..133ecf8 100644 --- a/casic-iot-web/pom.xml +++ b/casic-iot-web/pom.xml @@ -15,12 +15,19 @@ sensorhub-web + com.casic casic-iot-service ${iot.version} + + com.casic + sensorhub-core + ${iot.version} + + com.casic @@ -63,14 +70,56 @@ - - org.springframework.boot - spring-boot-maven-plugin + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.SensorhubWebApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + src/main/java + + **/*.xml + + true + + diff --git a/casic-iot-web/src/main/build/bin/start.bat b/casic-iot-web/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-iot-web/src/main/build/bin/start.sh b/casic-iot-web/src/main/build/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-iot-web/src/main/build/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-iot-web/src/main/build/package.xml b/casic-iot-web/src/main/build/package.xml new file mode 100644 index 0000000..c9259ad --- /dev/null +++ b/casic-iot-web/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java index e74d723..d46304f 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/SensorhubWebApplication.java @@ -1,7 +1,12 @@ package com.casic.missiles; +import com.alibaba.druid.pool.DruidAbstractDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -11,19 +16,27 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication +//排除 DruidDataSourceAutoConfigure.class 引入多数据源 +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j @EnableScheduling -@ServletComponentScan @MapperScan("com.casic.missiles.mapper") -public class SensorhubWebApplication { +public class SensorhubWebApplication implements CommandLineRunner { + + @Autowired + private SensorhubServer nettyServer; public static void main(String[] args) { SpringApplication.run(SensorhubWebApplication.class, args); log.info("CasicApiApplication is success!"); } + @Override + public void run(String... args) { + this.nettyServer.startServer(); + } + } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java index fc1a48b..7f1c934 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceUpgradeTaskController.java @@ -14,7 +14,7 @@ */ @RestController @Api(tags = "设备升级任务管理") -@RequestMapping("/device-upgrade-task") +@RequestMapping("/device/upgrade/task") public class DeviceUpgradeTaskController { } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java index dff2900..0702483 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/SubscribeStoreController.java @@ -43,7 +43,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated SubscribeListDTO request, BindingResult bindingResult)throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application-dev.yml b/casic-iot-web/src/main/resources/application-dev.yml index 198f21d..bea40b6 100644 --- a/casic-iot-web/src/main/resources/application-dev.yml +++ b/casic-iot-web/src/main/resources/application-dev.yml @@ -1,23 +1,44 @@ server: - port: 7096 + port: 7093 ################### spring配置 ################### spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root password: Casic203 + dynamic: + primary: master #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + username: root + password: Casic203 + use-ping-method: false + sensorhub: #实现动态的双库操作,暂时不想合并 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + use-ping-method: false + session: + store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh - database: 2 - serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer + casic: + device: + redis: + invalid-time: 86400 + config-prefix: 'Casic:' sysUrl: /sys #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/cockpit/**,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources,/push/data #flowable数据源和多数据源配置 db: init: diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index dc3fa0a..7e1898b 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -2,11 +2,41 @@ spring: profiles: active: dev + main: + allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 servlet: multipart: max-file-size: 50MB max-request-size: 80MB - + kafka: + #kafka配置 + producer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + transaction-id-prefix: kafkaTx- + retries: 3 + acks: all + batch-size: 16384 + buffer-memory: 1024000 + consumer: + # Kafka服务器 + bootstrap-servers: '111.198.10.15:12502' + group-id: 1 + auto-offset-reset: latest + enable-auto-commit: false + max-poll-records: 3 + properties: + max: + poll: + interval: + ms: 600000 + session: + timeout: + ms: 10000 + listener: + concurrency: 4 + ack-mode: manual_immediate + missing-topics-fatal: false mybatis-plus: global-config: #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" @@ -37,6 +67,10 @@ no-login-urls: /user/login,/kaptcha,/config/baseConfig sensorhub: enable: true +sensorhub: + config: + port: 7092 + #代码生成器配置 code: generate: diff --git a/pom.xml b/pom.xml index 0e81155..bc216f3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ + UTF-8 + UTF-8 + 1.8 1.0.0-SNAPSHOT 2.0.0.alpha @@ -48,6 +51,19 @@ + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.0.0 + + + + com.alibaba + druid-spring-boot-starter + 1.1.23 + + @@ -62,12 +78,6 @@ com.alibaba - druid - ${druid.version} - - - - com.alibaba fastjson ${fastjson.version} @@ -90,6 +100,7 @@ 1.18.20 + diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 4797e3a..39bc3b2 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -20,14 +20,6 @@ 4.5.7 - - - redis.clients - jedis - 3.1.0 - jar - - com.casic sensorhub-support @@ -62,67 +54,14 @@ mybatis-plus-boot-starter ${mybatis-plus.version} + + + com.casic + casic-iot-service + ${iot.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.5 - - true - - com.casic.missiles.ServerApplication - exec - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - false - - - - - - - src/main/resources - - - /config/*/* - /config/*-*.yml - - true - - - src/main/resources - - **/*.xml - - true - - - - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java index 9753109..40c55e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java @@ -1,30 +1,30 @@ -package com.casic.missiles; - -import com.casic.missiles.netty.SensorhubServer; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - - -@SpringBootApplication(scanBasePackages = "com.casic.missiles") -@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) -@EnableCaching //开启缓存 -@Slf4j -public class ServerApplication implements CommandLineRunner { - - @Autowired - private SensorhubServer nettyServer; - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - - @Override - public void run(String... args) { - this.nettyServer.startServer(); - } - -} +//package com.casic.missiles; +// +//import com.casic.missiles.netty.SensorhubServer; +//import lombok.extern.slf4j.Slf4j; +//import org.mybatis.spring.annotation.MapperScan; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.cache.annotation.EnableCaching; +// +// +//@SpringBootApplication(scanBasePackages = "com.casic.missiles") +//@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) +//@EnableCaching //开启缓存 +//@Slf4j +//public class ServerApplication implements CommandLineRunner { +// +// @Autowired +// private SensorhubServer nettyServer; +// public static void main(String[] args) { +// SpringApplication.run(ServerApplication.class, args); +// } +// +// @Override +// public void run(String... args) { +// this.nettyServer.startServer(); +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java deleted file mode 100644 index 624ed4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.autoconfig; - -import com.casic.missiles.netty.SensorhubServer; -import io.netty.bootstrap.ServerBootstrap; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * SensorhubServerAutoConfiguration 自动配置类 - */ -@Configuration -@ConditionalOnProperty( - prefix = "casic.sensorhub", - name = "enable", - havingValue = "true" -) -@EnableConfigurationProperties({SensorhubProperties.class}) -@ConditionalOnClass({ServerBootstrap.class}) -public class SensorhubServerAutoConfiguration { - - @Bean - public SensorhubServer sensorhubServer(SensorhubProperties sensorhubProperties) throws Exception { - return SensorhubServer.getInstance(sensorhubProperties); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java index e90de5a..dec5e4e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/AsynTaskHelper.java @@ -9,6 +9,8 @@ import java.util.concurrent.*; /** + * @author cz + * @date 2023-11-24 * 异步任务调用 */ public class AsynTaskHelper { @@ -25,23 +27,25 @@ /** * 设置线程池 + * * @param executorService 线程池 * @return */ - public AsynTaskHelper setExecutorService(ExecutorService executorService){ + public AsynTaskHelper setExecutorService(ExecutorService executorService) { completionService = new ExecutorCompletionService(executorService); return this; } /** * 添加任务,返回结果 + * * @param taskId * @param task * @return */ public AsynTaskHelper addTask(String taskId, Callable task) { AsynTaskCallable callProxy = new AsynTaskCallable(taskId, task); - if(null == tasks || tasks.isEmpty()){ + if (null == tasks || tasks.isEmpty()) { tasks = new ArrayList<>(); } tasks.add(callProxy); @@ -50,10 +54,11 @@ /** * 提交任务 + * * @return */ - public AsynTaskHelper submit(){ - if(null != tasks && !tasks.isEmpty()){ + public AsynTaskHelper submit() { + if (null != tasks && !tasks.isEmpty()) { for (Callable callResult : tasks) { completionService.submit(callResult); } @@ -63,7 +68,8 @@ /** * 获取返回结果 - * @return Map K为任务Id + * + * @return Map K为任务Id * @throws ExecutionException * @throws InterruptedException */ @@ -73,22 +79,23 @@ /** * 获取返回结果 + * * @param timeout * @param unit - * @return Map K为任务Id + * @return Map K为任务Id * @throws InterruptedException * @throws ExecutionException */ - public Map getResult(long timeout,@NotNull TimeUnit unit) throws InterruptedException, ExecutionException { + public Map getResult(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException { Map result = new HashMap<>(); - if(null == tasks){ + if (null == tasks) { return result; } for (int i = 0; i < tasks.size(); i++) { Future> poll = completionService.poll(timeout, unit); - if(null != poll){ + if (null != poll) { TaskResult task = poll.get(); - if(null != poll && null != task){ + if (null != poll && null != task) { result.put(task.getTaskId(), task.getData()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java index 0401822..e03781c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/GuavaCacheUtil.java @@ -7,14 +7,6 @@ public class GuavaCacheUtil { - /** - * 使用guava需要引入依赖 - * - * com.google.guava - * guava - * 28.2-jre - * - */ private static Cache cache = CacheBuilder.newBuilder() //10分钟后过期 .expireAfterWrite(10, TimeUnit.MINUTES) @@ -27,8 +19,22 @@ return cache.getIfPresent(k); } + /** + * 添加缓存 + * @param k + * @param value + */ public static void putCache(String k, Object value) { cache.put(k, value); } + /** + * 删除缓存 + * + * @param key + */ + public static void remove(String key) { + cache.invalidate(key); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java new file mode 100644 index 0000000..88baf61 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/cache/ProtocolProcessEventListener.java @@ -0,0 +1,174 @@ +package com.casic.missiles.cache; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.model.Device; +import com.casic.missiles.model.DeviceData; +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.pojo.ProcessEventTask; +import com.casic.missiles.service.IDeviceDataService; +import com.casic.missiles.service.impl.DeviceDataServiceImpl; +import com.casic.missiles.util.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 流程节点事件监听器 + */ +public class ProtocolProcessEventListener { + + private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); + + /** + * 异步生成缓存 + * + * @param processEventTask + */ + public static void asynAddTask(ProcessEventTask processEventTask) { + if (StringUtils.isNotEmpty(processEventTask.getDevcode())) { + GuavaCacheUtil.putCache(processEventTask.getDevcode(), processEventTask); + } + } + + /** + * 异步设置缓存 + * + * @param key + * @param json + */ + public static void setTask(String key, Object json, Integer node) { + //如果key为空,则直接返回 + if (StringUtils.isEmpty(key) || ObjectUtil.isEmpty(json)) { + return; + } + ProcessEventTask processEventTask = null; + switch (node) { + //解密前的数据 + case 1: + //如果为空可以补救 +// if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { +// processEventTask = ProcessEventTask.builder() +// .devcode(key) +// .decryptSoureData((String) json) +// .decryptBeforeData((String) json) +// .build(); +// asynAddTask(processEventTask); +// } else { +// processEventTask.setDecryptBeforeData((String) json); +// } +// break; + //解密后的数据 + case 2: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .decryptAfterData((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setDecryptAfterData((String) json); + } + break; + //解析的数据 + case 3: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .bizDataList((List) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setBizDataList((List) json); + } + break; + case 4: + //如果为空,则源报文和解密报文为空,作为异常判断依据 + if (ObjectUtil.isEmpty(processEventTask = (ProcessEventTask) GuavaCacheUtil.getCache(key))) { + processEventTask = ProcessEventTask.builder() + .devcode(key) + .exceptionMsg((String) json) + .build(); + asynAddTask(processEventTask); + } else { + processEventTask.setExceptionMsg((String) json); + } + break; + default: + return; + } + } + + /** + * 异步设置缓存 + * + * @param key + */ + public static ProcessEventTask getTask(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + return (ProcessEventTask) GuavaCacheUtil.getCache(key); + } + + /** + * 存库操作 + * + * @param devcode + */ + public static void saveData(String devcode, ParseResult result) { + //添加到线程池执行,异步存库 + threadPool.execute( + () -> { + ProcessEventTask processEventTask; + if (ObjectUtil.isNotEmpty(getTask(devcode))) { + synchronized (processEventTask = getTask(devcode)) { + IDeviceDataService deviceDataService = SpringContextUtil.getBean(DeviceDataServiceImpl.class); + if (ObjectUtil.isNotEmpty(processEventTask)) { + List deviceDataList = new ArrayList<>(); + for (Map BizDataMap : processEventTask.getBizDataList()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDevcode(processEventTask.getDevcode()); + deviceData.setDeviceType((Integer) BizDataMap.get("deviceType")); + deviceData.setUptime((String) BizDataMap.get("uptime")); + deviceData.setLogtime(new Date()); + deviceData.setDataJson(JSON.toJSONString(BizDataMap)); + deviceData.setDecryptBeforeData(processEventTask.getDecryptSoureData()); + deviceData.setDecryptAfterData(processEventTask.getDecryptAfterData()); + if (BizDataMap.containsKey("cell")) { + //电量不一定每次都有 + deviceData.setCell((Integer) BizDataMap.get("cell")); + } + if (BizDataMap.containsKey("dataValue")) { + //电量不一定每次都有 + deviceData.setDataValue((float) BizDataMap.get("dataValue")); + } + deviceData.setExceptionMsg(processEventTask.getExceptionMsg()); + deviceDataList.add(deviceData); + } + //批量保存 + deviceDataService.saveBatch(deviceDataList); + } + } + //移除缓存 + GuavaCacheUtil.remove(devcode); + } + } + ); + } + + //暂时不做设备的更新 + public void setDevice(String status) { + Device device = new Device(); + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java deleted file mode 100644 index 2f9c711..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/cache/listenerEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.cache; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - - -public class listenerEvent { - - private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 100, - TimeUnit.SECONDS, new LinkedBlockingQueue<>(20)); - - /** - * 异步生成缓存 - * - * @param key - * @param json - */ - public void asynCreateLogCache(String key, String json) { - - - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 4e6beea..01b20f5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.cache.GuavaCacheUtil; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; import com.casic.missiles.exception.EngineException; @@ -56,12 +56,16 @@ } ParseResult result = null; + String devcode = null; try { //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + devcode = (String) parseFixedDataMap.get("devcode"); // 通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); + RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); if (ObjectUtil.isEmpty(ruleConfig)) { + //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); byteBuf.readBytes(protocolConfig.getPreFix().length()); @@ -94,10 +98,14 @@ } //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); - log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); + //解密前的报文 + log.debug("解析的密文是----------" + ByteBufUtil.hexDump(bizDataByteBuf)); +// ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(bizDataByteBuf), 1); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); - log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + //解密后报文 //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); @@ -112,16 +120,19 @@ for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); } - //数据发送,异步 + ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); + //存储数据 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - result=null; + //数据发送,异步,异常拦截 + ProtocolProcessEventListener.setTask(devcode, rex.getMessage(), 4); + result = null; frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); - }finally { -// GuavaCacheUtil.putCache("licValid",validLicResult); -// ValidateResult validLicResult = (ValidateResult) GuavaCacheUtil.getCache("licValid"); + } finally { + //数据发送,异步,转存整体数据 + ProtocolProcessEventListener.saveData(devcode, result); return result; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 8af55a6..e4a79ae 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -1,10 +1,13 @@ package com.casic.missiles.parser; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; +import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; @@ -12,6 +15,7 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -25,10 +29,28 @@ public class ProtocolParserSupport { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; + } + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + //打印源数据,设备编号 + ProcessEventTask processEventTask = ProcessEventTask.builder() + .devcode((String) parseFixedDataMap.get("devcode")) + .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte)) + .build(); + ProtocolProcessEventListener.asynAddTask(processEventTask); + return parseFixedDataMap; + } + /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -39,10 +61,8 @@ } String rulePrepareFields = protocolConfig.getRulePrepareFields(); //固定字段 - if (StringUtils.isNotEmpty(rulePrepareFields)) { - //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + if (StringUtils.isNotEmpty(rulePrepareFields) && ObjectUtil.isNotEmpty(parseFixedDataMap)) { + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap)); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index b162def..9c413ed 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,13 +1,13 @@ package com.casic.missiles.parser.matcher; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.*; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 8eb0682..23d1e4c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -2,7 +2,7 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 4c02a81..e8506e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -1,10 +1,10 @@ package com.casic.missiles.parser.resolver.fields; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 204b4dc..54b4e58 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.rule; import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.pojo.RuleConfig; import lombok.extern.slf4j.Slf4j; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index 7c6350b..3d89d0d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.cache.ProtocolProcessEventListener; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.impl.KafkaSubscribe; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 68aca0e..81644ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -271,7 +271,7 @@ if (showSkip()) { return null; } - //获取缓存 + //缓存命中 if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { return (Map) singleObjects.get(FIXED_FIELD_DS); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java index 0523447..9dc64f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java @@ -1,7 +1,7 @@ package com.casic.missiles.provider; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.enums.FileNameEnums; import com.casic.missiles.parser.crc.CRC16; import com.casic.missiles.pojo.UpgradeFileResult; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index ddaadbe..c3a00ce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java index fe9fb77..d6fad15 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java @@ -1,6 +1,6 @@ package com.casic.missiles.replier.decorator; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.commons.lang3.StringUtils; import io.netty.buffer.ByteBuf; import org.bouncycastle.util.encoders.Hex; diff --git a/sensorhub-core/src/main/resources/config/application-bd.yml b/sensorhub-core/src/main/resources/config/application-bd.yml deleted file mode 100644 index 0a78bf1..0000000 --- a/sensorhub-core/src/main/resources/config/application-bd.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7080 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml deleted file mode 100644 index ec8d4b6..0000000 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 7093 -################### spring配置 ################### -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203 - session: - store-type: redis - redis: - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -logging: - level.root: error - level.com.casic: debug - file: - path: logs/ - name: missiles.log \ No newline at end of file diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml deleted file mode 100644 index 4dfc9ee..0000000 --- a/sensorhub-core/src/main/resources/config/application.yml +++ /dev/null @@ -1,78 +0,0 @@ -########################################################## -spring: - profiles: - active: dev - servlet: - multipart: - max-file-size: 50MB - max-request-size: 80MB - mvc: - pathmatch: - matching-strategy: ant_path_matcher - kafka: - #kafka配置 - producer: - # Kafka服务器 - bootstrap-servers: '111.198.10.15:12502' - transaction-id-prefix: kafkaTx- - retries: 3 - acks: all - batch-size: 16384 - buffer-memory: 1024000 - consumer: - # Kafka服务器 - bootstrap-servers: '111.198.10.15:12502' - group-id: 1 - auto-offset-reset: latest - enable-auto-commit: false - max-poll-records: 3 - properties: - max: - poll: - interval: - ms: 600000 - session: - timeout: - ms: 10000 - listener: - concurrency: 4 - ack-mode: manual_immediate - missing-topics-fatal: false - cache: - redis: - time-to-live: 600000 # 缓存默认有效时长,以毫秒为单位 - type: redis #指定使用redis作为缓存 -mybatis-plus: - global-config: - enable-sql-runner: true - #关闭配置数据库下划线字段转驼峰 - configuration: - map-underscore-to-camel-case: true - # 配置结果集属性为空时 是否映射返回结果 - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 - mapper-locations: classpath*:mapper/*.xml -mybatis: - mapper-locations: classpath*:mapper/*.xml -#mybatis-plus: -# sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector -casic: - device: - redis: - invalid-time: 86400 - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - config-prefix: 'Casic:' - serializer: org.springframework.data.redis.serializer.StringRedisSerializer - redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -#代码生成器配置 -code: - generate: - #作者 - author: cz - #待生成对象表名 - table-name: bussiness_field_config,combined_field_config -sensorhub: - config: - port: 7092 - secret: \ No newline at end of file diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index bfbec51..ff24f09 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -18,6 +18,7 @@ spring-boot-starter-web ${boot.version} + org.springframework.boot spring-boot-starter-test @@ -63,16 +64,6 @@ 1.71 - - - org.springframework.boot - spring-boot-starter-cache - - - - org.apache.commons - commons-pool2 - org.springframework.boot diff --git a/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java index f0ebbbc..fcbde85 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/config/RedisConfig.java @@ -50,7 +50,7 @@ * 指定使用哪一种缓存 * @return */ - @Bean + @Bean("redisCacheManager") @Override public CacheManager cacheManager() { RedisSerializer redisSerializer = new StringRedisSerializer(); diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java index 31b0bdd..623eeb1 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java @@ -1,5 +1,6 @@ package com.casic.missiles.mapper; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.pojo.SubscribeConfig; import org.apache.ibatis.annotations.Mapper; @@ -8,9 +9,7 @@ * @author cz * */ -@Mapper public interface SubscribeConfigMapper extends BaseMapper { - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java new file mode 100644 index 0000000..8484cfd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProcessEventTask.java @@ -0,0 +1,63 @@ +package com.casic.missiles.pojo; + +import lombok.Builder; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-11-24 + */ +@Builder +@Data +public class ProcessEventTask { + + /** + * 最新采集时间 + */ + private String uptime; + + /** + * 最新设备电量 + */ + private String cell; + + /** + * 设备编号 + */ + private String devcode; + + + /** + * 设备编号 + */ + private String decryptSoureData; + + /** + * 最新数据 + */ + private String dataValue; + + /** + * 最新解密前的数据报文 + */ + private String decryptBeforeData; + + /** + * 最新解密后的数据报文 + */ + private String decryptAfterData; + + /** + * 解析数据 + */ + private List> bizDataList; + + /** + * 异常信息收集 + */ + private String exceptionMsg; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java index d120d83..cee735f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.CombinedFieldMapper; @@ -11,6 +12,7 @@ import java.util.List; @Service +@DS("sensorhub") public class CombinedFieldConfigRegistryImpl extends ServiceImpl implements CombinedFieldConfigRegistry { @Override diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java index e07d2ff..b0e8304 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.CommandEventMapper; @@ -10,6 +11,7 @@ import java.util.List; import java.util.Optional; +@DS("sensorhub") public class CommandEventRegistryImpl extends ServiceImpl implements CommandEventRegistry { @Override diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java index 5d7cd8a..d2d1748 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.DatagramEventConfigMapper; @@ -12,6 +13,7 @@ import java.util.List; @Service +@DS("sensorhub") public class DatagramEventRegistryImpl extends ServiceImpl implements DatagramEventRegistry { diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java index 115f113..28326bb 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.FieldConfigMapper; @@ -14,6 +15,7 @@ * @author cz */ @Service +@DS("sensorhub") public class FieldConfigRegistryImpl extends ServiceImpl implements FieldConfigRegistry { @Override diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java index 0fe0c63..285530c 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.FieldRuleConfigMapper; @@ -11,6 +12,7 @@ import java.util.List; @Service +@DS("sensorhub") public class FieldRuleConfigRegistryImpl extends ServiceImpl implements FieldRuleConfigRegistry { @Override diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java index 6497ddd..35aec6d 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.ProtocolConfigMapper; @@ -11,6 +12,7 @@ import java.util.List; @Service +@DS("sensorhub") public class ProtocolConfigRegistryImpl extends ServiceImpl implements ProtocolConfigRegistry { /** diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolFieldConfigRegistryImpl.java index 5f3a230..285e1dd 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolFieldConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolFieldConfigRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.ProtocolFieldConfigMapper; @@ -13,6 +14,7 @@ import java.util.List; @Service +@DS("sensorhub") public class ProtocolFieldConfigRegistryImpl extends ServiceImpl implements ProtocolFieldConfigRegistry { @Override diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java index 92ac56e..3b57c64 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.mapper.RuleConfigMapper; @@ -11,6 +12,7 @@ import java.util.List; @Service +@DS("sensorhub") public class RuleConfigRegistryImpl extends ServiceImpl implements RuleConfigRegistry { diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/SubscribeRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/SubscribeRegistryImpl.java index dcdb909..77017dc 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/SubscribeRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/SubscribeRegistryImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.registry.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -8,6 +9,7 @@ import com.casic.missiles.pojo.SubscribeConfig; import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.registry.SubscribeRegistry; +import lombok.Data; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -15,7 +17,9 @@ import java.util.Map; import java.util.stream.Collectors; + @Service +@DS("sensorhub") @RequiredArgsConstructor public class SubscribeRegistryImpl extends ServiceImpl implements SubscribeRegistry {