diff --git a/pom.xml b/pom.xml index 7238a65..b9a47d2 100644 --- a/pom.xml +++ b/pom.xml @@ -201,6 +201,17 @@ 3.13.6 + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + diff --git a/src/main/java/com/hxjt/dataupload/jobhandler/mqtt/job/user/jobhandler/AlarmInfo2MqttJob.java b/src/main/java/com/hxjt/dataupload/jobhandler/mqtt/job/user/jobhandler/AlarmInfo2MqttJob.java deleted file mode 100644 index 9bd8f37..0000000 --- a/src/main/java/com/hxjt/dataupload/jobhandler/mqtt/job/user/jobhandler/AlarmInfo2MqttJob.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.hxjt.dataupload.jobhandler.mqtt.job.user.jobhandler; - -import cn.hutool.json.JSONUtil; - -import com.hxjt.dataupload.jobhandler.mqtt.enums.AlarmType; -import com.hxjt.dataupload.jobhandler.mqtt.job.user.domain.AlarmInfoHx; -import com.hxjt.dataupload.jobhandler.mqtt.job.user.domain.AlarmInfoIot; -import com.hxjt.dataupload.mqtt.MqttClient; -import com.xxl.job.core.context.XxlJobHelper; -import com.xxl.job.core.handler.annotation.XxlJob; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; - -import javax.annotation.Resource; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.TimeZone; - -/* - * @description: 报警信息推送 - * @author: ZhangRY - * @date: 2025/4/9 10:51 - * @param: null - * @return: null - **/ -@Component -@Slf4j -public class AlarmInfo2MqttJob { - - @Resource - MqttClient mqttClient; - - @Value("${spring.mqtt.deviceTopic:}") - private String deviceTopic; - - @Value("${user.token.containerId:}") - private String containerId; - @Resource - RestTemplate restTemplate; - - @Value("${alarm.real.url:}") - private String alarmUrl; - - @Value("${alarm.real.code:}") - private String codeAlarm; - - @XxlJob("alarmInfo2MqttJobHandler") - public void alarmInfo2MqttJobHandler() throws Exception { - try { - XxlJobHelper.log("Alarm info To Mqtt Job Handler Beginning."); - - ResponseEntity forEntity = restTemplate.getForEntity(alarmUrl, Map.class); - Map body = forEntity.getBody(); - List> data = (List>)body.get("data"); - log.info(">>>>>>>>>>>>>>>>>>data="+data.size()); - XxlJobHelper.log(">>>>>>>>>>>>>>>>>>data="+data.size()); - data.forEach(alarmMap -> { - try { - AlarmInfoIot alarmInfoIot = new AlarmInfoIot(); - AlarmInfoHx alarmInfoHx = new AlarmInfoHx(); - Object id = alarmMap.get("id"); - alarmInfoHx.setUniqueId(id != null ? containerId + id : ""); - alarmInfoHx.setContainerId(containerId); - Object deviceNo = alarmMap.get("deviceNo"); - alarmInfoHx.setDeviceCode(deviceNo != null ? deviceNo.toString() : ""); - Object alarmType = alarmMap.get("warningType"); - String code = alarmType.toString(); - if(codeAlarm.equals(code)||"2".equals(code)||"3".equals(code)||"8".equals(code)||"15".equals(code)||"16".equals(code)) { - log.info(">>>>>>>>>>>>>>>>>>>>>>>>>alarm occur"); - XxlJobHelper.log(">>>>>>>>>>>>>>>>>>>>>>>>>alarm occur"); - if (alarmType != null) { - String contentByCode = AlarmType.getContentByCode(code); - alarmInfoHx.setAlarmType(contentByCode); - alarmInfoHx.setAlarmContent(contentByCode); - } - Object layer = alarmMap.get("factory"); - alarmInfoHx.setLayerId(layer != null ? layer.toString() : ""); - Object area = alarmMap.get("area"); - alarmInfoHx.setSecAreaId(area != null ? area.toString() : ""); - Object areaName = alarmMap.get("areaName"); - alarmInfoHx.setSecAreaName(areaName != null ? areaName.toString() : ""); - Object latitude = alarmMap.get("latitude"); - alarmInfoHx.setX(latitude != null ? new Double(latitude.toString()) : 0); - Object longitude = alarmMap.get("longitude"); - alarmInfoHx.setY(longitude != null ? new Double(longitude.toString()) : 0); - Object dateTime = alarmMap.get("warningtime"); - log.info(">>>>>>>>>>>>>>>>>>>>>>>>>dateTime="+dateTime); - XxlJobHelper.log(">>>>>>>>>>>>>>>>>>>>>>>>>dateTime="+dateTime); - if (dateTime != null) { - try { - Date date = new Date(Long.parseLong(dateTime.toString())); - SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - sf.setTimeZone(TimeZone.getTimeZone("UTC")); - String dateStr = sf.format(date); - alarmInfoHx.setDateTime(dateStr); - } catch (NumberFormatException e) { - log.info(">>>>>>>>>>>>>>>>>>>>>>>>>exception occur"+e.getMessage()); - XxlJobHelper.log(">>>>>>>>>>>>>>>>>>>>>>>>>exception occur"+e.getMessage()); - alarmInfoHx.setDateTime(dateTime.toString()); - } - } - Object isHandle = alarmMap.get("isHandle"); - alarmInfoHx.setDealStatus(isHandle != null ? ((boolean) isHandle == false ? "0" : "1") : ""); - alarmInfoIot.setData(alarmInfoHx); - alarmInfoIot.setDataType("alarm"); - String jsonData = JSONUtil.toJsonStr(alarmInfoIot); - log.info(jsonData); - XxlJobHelper.log("mqtt push data : : " + jsonData); - mqttClient.publish(0, false, deviceTopic, jsonData); - } - } catch (Exception ex) { - ex.printStackTrace(); - log.info(">>>>>>>>>>>>>>>>>>>>>>>>>exception occur"+ex.getMessage()); - XxlJobHelper.log(">>>>>>>>>>>>>>>>>>>>>>>>>exception occur"+ex.getMessage()); - } - }); - - } catch (Exception e) { - e.printStackTrace(); - } - log.info(">>>>>>>>>>>>>>>Alarm info mqtt push finished!"); - XxlJobHelper.log(">>>>>>>>>>>>>>>Alarm info mqtt push finished!"); - } - - -} diff --git a/src/main/java/com/hxjt/dataupload/jobhandler/mqtt/job/user/jobhandler/SensorDataTopicMqttJobHandler.java b/src/main/java/com/hxjt/dataupload/jobhandler/mqtt/job/user/jobhandler/SensorDataTopicMqttJobHandler.java new file mode 100644 index 0000000..673554c --- /dev/null +++ b/src/main/java/com/hxjt/dataupload/jobhandler/mqtt/job/user/jobhandler/SensorDataTopicMqttJobHandler.java @@ -0,0 +1,98 @@ +package com.hxjt.dataupload.jobhandler.mqtt.job.user.jobhandler; + +import cn.hutool.json.JSONUtil; + +import com.alibaba.fastjson2.JSONObject; +import com.hxjt.dataupload.jobhandler.mqtt.enums.AlarmType; +import com.hxjt.dataupload.jobhandler.mqtt.job.user.domain.AlarmInfoHx; +import com.hxjt.dataupload.jobhandler.mqtt.job.user.domain.AlarmInfoIot; +import com.hxjt.dataupload.mqtt.MqttClient; +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.util.*; + +import static com.hxjt.dataupload.utils.ExcelDataExtraction.extractData; + +/* + * @description: 报警信息推送 + * @author: ZhangRY + * @date: 2025/4/9 10:51 + * @param: null + * @return: null + **/ +@Component +@Slf4j +public class SensorDataTopicMqttJobHandler { + + @Resource + MqttClient mqttClient; + + @Value("${spring.mqtt.sensorDataTopic:}") + private String sensorDataTopic; + + + @Resource + RestTemplate restTemplate; + + + + + @XxlJob("sensorDataTopicMqttJobHandler") + public void execute() throws Exception { + try { + XxlJobHelper.log("sensorDataTopicMqttJobHandler Beginning."); + + String filePath = "F://Users/liwenxuan/Desktop/环保上传园区/数据位号2025.3.4-1.xlsx"; // 请替换为实际的Excel文件路径 + List dataList = extractData(filePath); + dataList.forEach(id -> { + if(id.equals("DK$SO2_ZS_PV")||id.equals("DK$DLGL_GL_GL_DUST_ZS_PV")||id.equals("DK$DLGL_NOX_ZS_PV")||id.equals("DK$DLGL_SFLOW_PV")||id.equals("DK$DLGL_O2_PV")||id.equals("DK$TEMP_PV")||id.equals("DK$DLGL_HUM_PV")||id.equals("DK$DLGL_VELOCITY_PV")||id.equals("DK$DLGL_PRESS_PV")){ + System.out.println(id); + //请求地址 + String url = "http://172.20.5.120:29912/open/app/api/po/send/MkZSTLpZ7vHYcz2clyDMBuUnuqHX9A49?id=DK$1AT_HJ001_FLAG?id={id}"; + + //请求参数 + Map uriVariables = new HashMap<>(); + uriVariables.put("id", id); + + + //发起请求,直接返回对象(带参数请求) + + JSONObject responseBean = restTemplate.getForObject(url, JSONObject.class, uriVariables); + System.out.println(responseBean.toString()); + } + }); + + //dataList.forEach(id -> { + try { + + /* + String jsonData = JSONUtil.toJsonStr(alarmInfoIot); + log.info(jsonData); + XxlJobHelper.log("mqtt push data : : " + jsonData); + mqttClient.publish(0, false, deviceTopic, jsonData);*/ + + } catch (Exception ex) { + ex.printStackTrace(); + log.info(">>>>>>>>>>>>>>>>>>>>>>>>>exception occur"+ex.getMessage()); + XxlJobHelper.log(">>>>>>>>>>>>>>>>>>>>>>>>>exception occur"+ex.getMessage()); + } + //}); + + } catch (Exception e) { + e.printStackTrace(); + } + log.info(">>>>>>>>>>>>>>>Alarm info mqtt push finished!"); + XxlJobHelper.log(">>>>>>>>>>>>>>>Alarm info mqtt push finished!"); + } + + +} diff --git a/src/main/java/com/hxjt/dataupload/utils/ExcelDataExtraction.java b/src/main/java/com/hxjt/dataupload/utils/ExcelDataExtraction.java new file mode 100644 index 0000000..1d5e4ca --- /dev/null +++ b/src/main/java/com/hxjt/dataupload/utils/ExcelDataExtraction.java @@ -0,0 +1,84 @@ +package com.hxjt.dataupload.utils; + +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class ExcelDataExtraction { + public static List extractData(String filePath) { + List resultList = new ArrayList<>(); + try (FileInputStream fis = new FileInputStream(new File(filePath))) { + Workbook workbook; + // 判断文件类型,避免OLE2NotOfficeXmlFileException异常 + if (filePath.toLowerCase().endsWith(".xlsx")) { + workbook = new XSSFWorkbook(fis); + } else { + throw new IllegalArgumentException("Unsupported file format. Only.xlsx is supported for now."); + } + + Sheet sheet = workbook.getSheetAt(0); // 假设数据在第一个sheet中 + int headerRowIndex = 1; // 假设表头在第一行 + Row headerRow = sheet.getRow(headerRowIndex); + int targetColumnIndex = -1; + for (int i = 0; i < headerRow.getLastCellNum(); i++) { + Cell cell = headerRow.getCell(i); + if (cell != null && "现数据中台位号".equals(cell.getStringCellValue())) { + targetColumnIndex = i; + break; + } + } + + if (targetColumnIndex != -1) { + for (int rowIndex = headerRowIndex + 1; rowIndex <= sheet.getLastRowNum(); rowIndex++) { + Row row = sheet.getRow(rowIndex); + if (row != null) { + Cell cell = row.getCell(targetColumnIndex); + if (cell != null) { + switch (cell.getCellType()) { + case STRING: + if(!StringUtils.isBlank(cell.getStringCellValue())){ + resultList.add(cell.getStringCellValue()); + } + break; + case NUMERIC: + if (DateUtil.isCellDateFormatted(cell)) { + resultList.add(cell.getDateCellValue().toString()); + } else { + resultList.add(String.valueOf(cell.getNumericCellValue())); + } + break; + case BOOLEAN: + resultList.add(String.valueOf(cell.getBooleanCellValue())); + break; + default: + if(!StringUtils.isBlank(cell.getStringCellValue())){ + resultList.add(cell.toString()); + } + + } + } + } + } + } + + workbook.close(); + } catch (IOException e) { + e.printStackTrace(); + } + return resultList; + } + + /*public static void main(String[] args) { + String filePath = "F://Users/liwenxuan/Desktop/环保上传园区/数据位号2025.3.4-1.xlsx"; // 请替换为实际的Excel文件路径 + List dataList = extractData(filePath); + for (String data : dataList) { + System.out.println(data); + } + }*/ +} \ No newline at end of file diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 57ab867..e689df0 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -65,17 +65,15 @@ spring: #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候回抛出异常,不启动会使用默认数据源. strict: false mqtt: - username: 10@ningyanghuagongchany20250328091457 - password: 4c0d00b8dcdd4809ad75ad1d0e38533c - hostUrl: tcp://112.245.55.112:18183----- - clientId: 10@ningyanghuagongchany20250328091457 - defaultTopic: /indoor/10@ningyanghuagongchany20250328091457/thirdParty/sensorData + username: 10@ningyanghuagongchany20250422172632 + password: 9fabff0fe3d049af92329e29dd9af7e4 + hostUrl: tcp://112.245.55.112:7379 + clientId: 10@ningyanghuagongchany20250422172632 + sensorDataTopic: /iot/{clientId}/thirdParty/sensorData timeout: 100 keepalive: 60 enabled: true - personTopic: /indoor/10@ningyanghuagongchany20250328091457/personInfo/up - deviceTopic: /indoor/10@ningyanghuagongchany20250328091457/bluetooth/up - areaTopic: /indoor/10@ningyanghuagongchany20250328091457/statistics/up + realtimeDataTopic: /iot/{clientId}/thirdParty/realtimeData xxl: job: admin: