From 52639bc662713cd747264540f260bf062e775665 Mon Sep 17 00:00:00 2001 From: "review512jwy@163.com" <“review512jwy@163.com”> Date: Wed, 1 Apr 2026 15:36:43 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E8=A7=A3=E6=9E=90f10=E5=85=A5=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/MainReceiverController.java | 19 ++ .../techsor/datacenter/sender/dao/F10Dao.java | 79 ++++++++ .../sender/entitiy/f10/F10JournalLog.java | 79 ++++++++ .../sender/entitiy/f10/RedisStreamEntity.java | 13 ++ .../sender/service/AlarmDataPushLambda.java | 6 +- .../datacenter/sender/service/F10Service.java | 172 ++++++++++++++++++ 6 files changed, 365 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/techsor/datacenter/sender/dao/F10Dao.java create mode 100644 src/main/java/com/techsor/datacenter/sender/entitiy/f10/F10JournalLog.java create mode 100644 src/main/java/com/techsor/datacenter/sender/entitiy/f10/RedisStreamEntity.java create mode 100644 src/main/java/com/techsor/datacenter/sender/service/F10Service.java diff --git a/src/main/java/com/techsor/datacenter/sender/controllers/MainReceiverController.java b/src/main/java/com/techsor/datacenter/sender/controllers/MainReceiverController.java index bce59e8..2c865dc 100644 --- a/src/main/java/com/techsor/datacenter/sender/controllers/MainReceiverController.java +++ b/src/main/java/com/techsor/datacenter/sender/controllers/MainReceiverController.java @@ -1,10 +1,12 @@ package com.techsor.datacenter.sender.controllers; +import com.alibaba.fastjson2.JSON; import com.google.gson.Gson; import com.techsor.datacenter.sender.components.CommonOpt; import com.techsor.datacenter.sender.config.DataSourceContextHolder; import com.techsor.datacenter.sender.constants.CompanyConstants; import com.techsor.datacenter.sender.entitiy.*; +import com.techsor.datacenter.sender.entitiy.f10.RedisStreamEntity; import com.techsor.datacenter.sender.entitiy.zaiot.ProcessZAIoTRAWEntity; import com.techsor.datacenter.sender.processers.*; import com.techsor.datacenter.sender.service.*; @@ -58,6 +60,9 @@ public class MainReceiverController { @Resource ZAIoTInnerService zaIoTInnerService; + @Resource + F10Service f10Service; + @Autowired private AsyncDataProcessor asyncDataProcessor; @@ -190,6 +195,20 @@ public class MainReceiverController { return JsonResponse.buildSuccess(resultJson); } + @RequestMapping(value = "generic/f10", method = RequestMethod.POST) + public JsonResponse f10Process(@RequestBody RedisStreamEntity rawEntity){ + logger.debug("f10 data:{}", JSON.toJSONString(rawEntity)); + //处理数据,转发数据 + String resultJson=""; + try{ + //解析数据 + this.f10Service.handle(rawEntity); + }catch (Exception e){ + logger.error("f10Process error", e); + } + return JsonResponse.buildSuccess(resultJson); + } + @RequestMapping(value = "generic/mockJsonData", method = RequestMethod.POST) public JsonResponse mockJsonData(@RequestBody ProcessRAWEntity rawEntity){ logger.warn("Received: "+new Gson().toJson(rawEntity)); diff --git a/src/main/java/com/techsor/datacenter/sender/dao/F10Dao.java b/src/main/java/com/techsor/datacenter/sender/dao/F10Dao.java new file mode 100644 index 0000000..3d04a8f --- /dev/null +++ b/src/main/java/com/techsor/datacenter/sender/dao/F10Dao.java @@ -0,0 +1,79 @@ +package com.techsor.datacenter.sender.dao; + +import com.techsor.datacenter.sender.entitiy.f10.F10JournalLog; +import jakarta.annotation.Resource; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; + +@Component +public class F10Dao { + + @Resource + private JdbcTemplate jdbcTemplate ; + + public void insertF10Log(F10JournalLog f10JournalLog) { + String sql = "INSERT INTO f10_journal_log (" + + "device_id, company_id, raw_hex, raw_text, serial_no, mode, " + + "signal_seq, receive_date, receive_time, channel_no, test_flag, block_no, block_name, " + + "signal_type1, signal_type2, signal_label, signal_status, " + + "course_no, area_code, course_code, standby_name, physical_addr, " + + "customer_name, phone, remark, display_color, error_reason, line_type, area_name, " + + "send_date, send_time, customer_no, display_data1, display_data2, " + + "instruction_flag, signal_code, card_no, card_type, mansion_building, mansion_room, option_field, " + + "created_at, created_time" + + ") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + + jdbcTemplate.update(sql, + f10JournalLog.getDeviceId(), + f10JournalLog.getCompanyId(), + f10JournalLog.getRawHex(), + f10JournalLog.getRawText(), + f10JournalLog.getSerialNo(), + f10JournalLog.getMode(), + + f10JournalLog.getSignalSeq(), + f10JournalLog.getReceiveDate(), + f10JournalLog.getReceiveTime(), + f10JournalLog.getChannelNo(), + f10JournalLog.getTestFlag(), + f10JournalLog.getBlockNo(), + f10JournalLog.getBlockName(), + + f10JournalLog.getSignalType1(), + f10JournalLog.getSignalType2(), + f10JournalLog.getSignalLabel(), + f10JournalLog.getSignalStatus(), + + f10JournalLog.getCourseNo(), + f10JournalLog.getAreaCode(), + f10JournalLog.getCourseCode(), + f10JournalLog.getStandbyName(), + f10JournalLog.getPhysicalAddr(), + + f10JournalLog.getCustomerName(), + f10JournalLog.getPhone(), + f10JournalLog.getRemark(), + f10JournalLog.getDisplayColor(), + f10JournalLog.getErrorReason(), + f10JournalLog.getLineType(), + f10JournalLog.getAreaName(), + + f10JournalLog.getSendDate(), + f10JournalLog.getSendTime(), + f10JournalLog.getCustomerNo(), + f10JournalLog.getDisplayData1(), + f10JournalLog.getDisplayData2(), + + f10JournalLog.getInstructionFlag(), + f10JournalLog.getSignalCode(), + f10JournalLog.getCardNo(), + f10JournalLog.getCardType(), + f10JournalLog.getMansionBuilding(), + f10JournalLog.getMansionRoom(), + f10JournalLog.getOptionField(), + + System.currentTimeMillis(), + new java.sql.Timestamp(System.currentTimeMillis()) + ); + } +} diff --git a/src/main/java/com/techsor/datacenter/sender/entitiy/f10/F10JournalLog.java b/src/main/java/com/techsor/datacenter/sender/entitiy/f10/F10JournalLog.java new file mode 100644 index 0000000..80d8769 --- /dev/null +++ b/src/main/java/com/techsor/datacenter/sender/entitiy/f10/F10JournalLog.java @@ -0,0 +1,79 @@ +package com.techsor.datacenter.sender.entitiy.f10; + +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class F10JournalLog { + + // ===== 主键 ===== + private Long id; + + // ===== 设备 ===== + private String deviceId; + private Long companyId; + + // ===== 原始数据 ===== + private String rawHex; + private String rawText; + + // ===== 报文头 ===== + private String serialNo; + private String mode; + + // ===== 1~35字段 ===== + private String signalSeq; + private String receiveDate; + private String receiveTime; + + private String channelNo; + private String testFlag; + private String blockNo; + private String blockName; + + private String signalType1; + private String signalType2; + private String signalLabel; + private String signalStatus; + + private String courseNo; + private String areaCode; + private String courseCode; + + private String standbyName; + private String physicalAddr; + + private String customerName; + private String phone; + private String remark; + + private String displayColor; + private String errorReason; + private String lineType; + + private String areaName; + + private String sendDate; + private String sendTime; + + private String customerNo; + + private String displayData1; + private String displayData2; + + private String instructionFlag; + private String signalCode; + + private String cardNo; + private String cardType; + + private String mansionBuilding; + private String mansionRoom; + + private String optionField; + + // ===== 系统字段 ===== + private Long createdAt; // 毫秒时间戳 + private LocalDateTime createdTime; // 标准时间 +} diff --git a/src/main/java/com/techsor/datacenter/sender/entitiy/f10/RedisStreamEntity.java b/src/main/java/com/techsor/datacenter/sender/entitiy/f10/RedisStreamEntity.java new file mode 100644 index 0000000..c0df1e6 --- /dev/null +++ b/src/main/java/com/techsor/datacenter/sender/entitiy/f10/RedisStreamEntity.java @@ -0,0 +1,13 @@ +package com.techsor.datacenter.sender.entitiy.f10; + +import lombok.Data; + +@Data +public class RedisStreamEntity { + + private int partition;; + private String hexRawData; + private String payload; + private long ts; + +} diff --git a/src/main/java/com/techsor/datacenter/sender/service/AlarmDataPushLambda.java b/src/main/java/com/techsor/datacenter/sender/service/AlarmDataPushLambda.java index 5e3b12a..58e4b6e 100644 --- a/src/main/java/com/techsor/datacenter/sender/service/AlarmDataPushLambda.java +++ b/src/main/java/com/techsor/datacenter/sender/service/AlarmDataPushLambda.java @@ -469,9 +469,9 @@ public class AlarmDataPushLambda { String receiver = emailList.get(0); String cc = String.join(",", emailList.subList(1, emailList.size())); String errorMsg = ""; - try{ - new SendMail().sendMail(subject, content, receiver, cc); - } catch(Exception e) { + try{ + new SendMail().sendMail(subject, content.replace("\r\n", "
").replace("\n", "
"), receiver, cc); + } catch(Exception e) { log.error("[SendMail Error] email send failed", e); errorMsg = e.getMessage(); } diff --git a/src/main/java/com/techsor/datacenter/sender/service/F10Service.java b/src/main/java/com/techsor/datacenter/sender/service/F10Service.java new file mode 100644 index 0000000..a1db4ae --- /dev/null +++ b/src/main/java/com/techsor/datacenter/sender/service/F10Service.java @@ -0,0 +1,172 @@ +package com.techsor.datacenter.sender.service; + +import cn.hutool.core.collection.CollectionUtil; +import com.techsor.datacenter.sender.components.CommonOpt; +import com.techsor.datacenter.sender.components.GuavaRedisCache; +import com.techsor.datacenter.sender.config.DataSourceContextHolder; +import com.techsor.datacenter.sender.dao.DeviceDao; +import com.techsor.datacenter.sender.dao.F10Dao; +import com.techsor.datacenter.sender.entitiy.DeviceEntity; +import com.techsor.datacenter.sender.entitiy.f10.F10JournalLog; +import com.techsor.datacenter.sender.entitiy.f10.RedisStreamEntity; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.nio.charset.Charset; +import java.util.Arrays; +import java.util.List; + +@Slf4j +@Service("F10Service") +public class F10Service { + + private static final Charset SHIFT_JIS = Charset.forName("Shift-JIS"); + + @Autowired + private CommonOpt commonOpt; + @Resource + private GuavaRedisCache guavaRedisCache; + + @Autowired + private F10Dao f10Dao; + @Autowired + private DeviceDao deviceDao; + + + + public void handle(RedisStreamEntity rawEntity) { + String hexLog = rawEntity.getHexRawData().trim(); + byte[] src = hexStringToByteArray(hexLog); + //(STX:1 + Serial:4 + Mode:2 + 正文:320 + ETX:1) + if (src.length < 328) { + log.warn("原始报文长度不足328字节"); + return; + } + + try { + F10JournalLog f10JournalLog = parseToEntity(rawEntity.getHexRawData()); + + //前缀_26契約先番号_4チャンネル番号 + //前缀还没定,先【26契約先番号_4チャンネル番号】 + f10JournalLog.setDeviceId(f10JournalLog.getCustomerNo() + "_" + f10JournalLog.getChannelNo()); + + String topCompanyId= commonOpt.getTopCompanyId(f10JournalLog.getDeviceId()); + if (topCompanyId==null || topCompanyId.equals("0")){ + return; + } + DataSourceContextHolder.clearCurrentDataSourceKey(); + DataSourceContextHolder.setCurrentDataSourceKey("dataSourceForCompany_"+topCompanyId); + + log.info("Use datasource for company:"+topCompanyId); + List deviceEntity=this.deviceDao.getDeviceInfoByDeviceId(f10JournalLog.getDeviceId()); + this.guavaRedisCache.incrementDailyDeviceIdCount(f10JournalLog.getDeviceId()); + if (CollectionUtil.isEmpty(deviceEntity)){ + log.error("no deviceEntity is found========================>>>> {}",f10JournalLog.getDeviceId()); + return; + } + + Long companyId = deviceEntity.get(0).getCompanyId(); + + f10JournalLog.setCompanyId(companyId); + f10Dao.insertF10Log(f10JournalLog); + + } catch (Exception e) { + log.error("F10解析入库失败", e); + } + } + + public static F10JournalLog parseToEntity(String hexLog) { + byte[] src = hexStringToByteArray(hexLog); + + int offset = 0; + + // 跳过 STX + offset += 1; + + String serialNo = new String(Arrays.copyOfRange(src, offset, offset + 4), SHIFT_JIS); + String mode = new String(Arrays.copyOfRange(src, offset, offset + 2), SHIFT_JIS); + + int bodyStart = 7; + int bodyEnd = src.length - 1; + byte[] body = Arrays.copyOfRange(src, bodyStart, bodyEnd); + String rawText = new String(body, SHIFT_JIS).trim(); + + F10JournalLog f10JournalLog = new F10JournalLog(); + f10JournalLog.setRawHex(hexLog); + f10JournalLog.setRawText(rawText); + f10JournalLog.setSerialNo(serialNo); + f10JournalLog.setMode(mode); + + offset = 7; + + f10JournalLog.setSignalSeq(getTargetData(src, offset, 9)); offset += 9; + f10JournalLog.setReceiveDate(getTargetData(src, offset, 8)); offset += 8; + f10JournalLog.setReceiveTime(getTargetData(src, offset, 6)); offset += 6; + + f10JournalLog.setChannelNo(getTargetData(src, offset, 3)); offset += 3; + f10JournalLog.setTestFlag(getTargetData(src, offset, 1)); offset += 1; + f10JournalLog.setBlockNo(getTargetData(src, offset, 2)); offset += 2; + f10JournalLog.setBlockName(getTargetData(src, offset, 30)); offset += 30; + + f10JournalLog.setSignalType1(getTargetData(src, offset, 2)); offset += 2; + f10JournalLog.setSignalType2(getTargetData(src, offset, 2)); offset += 2; + f10JournalLog.setSignalLabel(getTargetData(src, offset, 2)); offset += 2; + f10JournalLog.setSignalStatus(getTargetData(src, offset, 1)); offset += 1; + + f10JournalLog.setCourseNo(getTargetData(src, offset, 3)); offset += 3; + f10JournalLog.setAreaCode(getTargetData(src, offset, 2)); offset += 2; + f10JournalLog.setCourseCode(getTargetData(src, offset, 3)); offset += 3; + + f10JournalLog.setStandbyName(getTargetData(src, offset, 20)); offset += 20; + f10JournalLog.setPhysicalAddr(getTargetData(src, offset, 8)); offset += 8; + + f10JournalLog.setCustomerName(getTargetData(src, offset, 30)); offset += 30; + f10JournalLog.setPhone(getTargetData(src, offset, 20)); offset += 20; + f10JournalLog.setRemark(getTargetData(src, offset, 60)); offset += 60; + + f10JournalLog.setDisplayColor(getTargetData(src, offset, 2)); offset += 2; + f10JournalLog.setErrorReason(getTargetData(src, offset, 1)); offset += 1; + f10JournalLog.setLineType(getTargetData(src, offset, 2)); offset += 2; + + f10JournalLog.setAreaName(getTargetData(src, offset, 12)); offset += 12; + + f10JournalLog.setSendDate(getTargetData(src, offset, 8)); offset += 8; + f10JournalLog.setSendTime(getTargetData(src, offset, 6)); offset += 6; + + f10JournalLog.setCustomerNo(getTargetData(src, offset, 8)); offset += 8; + + f10JournalLog.setDisplayData1(getTargetData(src, offset, 20)); offset += 20; + f10JournalLog.setDisplayData2(getTargetData(src, offset, 20)); offset += 20; + + f10JournalLog.setInstructionFlag(getTargetData(src, offset, 1)); offset += 1; + f10JournalLog.setSignalCode(getTargetData(src, offset, 4)); offset += 4; + + f10JournalLog.setCardNo(getTargetData(src, offset, 7)); offset += 7; + f10JournalLog.setCardType(getTargetData(src, offset, 1)); offset += 1; + + f10JournalLog.setMansionBuilding(getTargetData(src, offset, 2)); offset += 2; + f10JournalLog.setMansionRoom(getTargetData(src, offset, 4)); offset += 4; + + f10JournalLog.setOptionField(getTargetData(src, offset, 10)); + + return f10JournalLog; + } + + private static String getTargetData(byte[] src, int start, int len) { + return new String(Arrays.copyOfRange(src, start, start + len), SHIFT_JIS).trim(); + } + + private static byte[] hexStringToByteArray(String s) { + s = s.replace(" ", ""); + int len = s.length(); + byte[] data = new byte[len / 2]; + for (int i = 0; i < len; i += 2) { + data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + + Character.digit(s.charAt(i + 1), 16)); + } + return data; + } + +} From d0c0d13bb04d067a7f2072c9e4ab23c94fb92ee8 Mon Sep 17 00:00:00 2001 From: "review512jwy@163.com" <“review512jwy@163.com”> Date: Wed, 1 Apr 2026 15:37:46 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E8=A7=A3=E6=9E=90f10=E5=85=A5=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/techsor/datacenter/sender/service/F10Service.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/techsor/datacenter/sender/service/F10Service.java b/src/main/java/com/techsor/datacenter/sender/service/F10Service.java index a1db4ae..12f6a65 100644 --- a/src/main/java/com/techsor/datacenter/sender/service/F10Service.java +++ b/src/main/java/com/techsor/datacenter/sender/service/F10Service.java @@ -54,6 +54,7 @@ public class F10Service { String topCompanyId= commonOpt.getTopCompanyId(f10JournalLog.getDeviceId()); if (topCompanyId==null || topCompanyId.equals("0")){ + log.error("no companyId is found========================>>>> {}",f10JournalLog.getDeviceId()); return; } DataSourceContextHolder.clearCurrentDataSourceKey(); From 6625055c2727ccb1c53fdc18a61c2ab6a5a8f440 Mon Sep 17 00:00:00 2001 From: "review512jwy@163.com" <“review512jwy@163.com”> Date: Thu, 2 Apr 2026 14:48:33 +0800 Subject: [PATCH 3/7] =?UTF-8?q?TrendLog=E7=B1=BB=E5=9E=8B=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sender/service/impl/DataProcessServiceImpl.java | 8 ++++++++ src/main/resources/application-dev.properties | 4 +++- src/main/resources/application-prd.properties | 4 +++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/techsor/datacenter/sender/service/impl/DataProcessServiceImpl.java b/src/main/java/com/techsor/datacenter/sender/service/impl/DataProcessServiceImpl.java index f3507e9..3dbdbb8 100644 --- a/src/main/java/com/techsor/datacenter/sender/service/impl/DataProcessServiceImpl.java +++ b/src/main/java/com/techsor/datacenter/sender/service/impl/DataProcessServiceImpl.java @@ -136,6 +136,9 @@ public class DataProcessServiceImpl implements IDataProcessService { @Value("${category.id.accumulate}") private List categoryIdAccumulate; + @Value("${category.id.trendLog}") + private List categoryIdTrendLog; + @Value("${category.id.status}") private List categoryIdStatus; @@ -152,6 +155,7 @@ public class DataProcessServiceImpl implements IDataProcessService { ALL_CATEGORY_ID.addAll(categoryIdMeasure); ALL_CATEGORY_ID.addAll(categoryIdAccumulate); ALL_CATEGORY_ID.addAll(categoryIdStatus); + ALL_CATEGORY_ID.addAll(categoryIdTrendLog); } private static final String REDIS_DASHBOARD_DEVICE_STATUS_KEY = "dashboard_device_status"; @@ -735,6 +739,10 @@ public class DataProcessServiceImpl implements IDataProcessService { if (categoryIdMeasure.contains(baseTransDataEntity.getCategoryId())) { storageMeasure(DeviceAttrCode.COMMON, uploadValue, baseTransDataEntity); } + //20260401 类型1006暂时先用计测 + if (categoryIdTrendLog.contains(baseTransDataEntity.getCategoryId())) { + storageAccumulate(DeviceAttrCode.COMMON, uploadValue, baseTransDataEntity); + } } } } diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 2e57279..697faaf 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -106,9 +106,11 @@ category.id.alarm=1001 # 计测类设备类型ID category.id.measure=1003 # 累积类设备类型ID -category.id.accumulate=1002,1006 +category.id.accumulate=1002 # 状态类设备类型ID category.id.status=1004 +# trendLog设备类型ID +category.id.trendLog=1006 data.operation.batch-size=${dataOperationBatchSize:100} diff --git a/src/main/resources/application-prd.properties b/src/main/resources/application-prd.properties index f2548b0..2d31ab0 100644 --- a/src/main/resources/application-prd.properties +++ b/src/main/resources/application-prd.properties @@ -100,9 +100,11 @@ category.id.alarm=1001 # 计测类设备类型ID category.id.measure=1003 # 累积类设备类型ID -category.id.accumulate=1002,1006 +category.id.accumulate=1002 # 状态类设备类型ID category.id.status=1004 +# trendLog设备类型ID +category.id.trendLog=1006 data.operation.batch-size=${dataOperationBatchSize:100} From 475d2aa0f85cb587c2fa1271314eee0b0f11b626 Mon Sep 17 00:00:00 2001 From: "review512jwy@163.com" <“review512jwy@163.com”> Date: Thu, 16 Apr 2026 10:24:18 +0800 Subject: [PATCH 4/7] =?UTF-8?q?f10=E5=AD=98=E5=82=A8=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sender/dao/DashboardAlertDao.java | 33 ++++++-- .../techsor/datacenter/sender/dao/F10Dao.java | 13 ++-- .../sender/entitiy/f10/F10JournalLog.java | 8 ++ .../datacenter/sender/service/F10Service.java | 75 ++++++++++++++++++- 4 files changed, 118 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/techsor/datacenter/sender/dao/DashboardAlertDao.java b/src/main/java/com/techsor/datacenter/sender/dao/DashboardAlertDao.java index 32cd108..7a87095 100644 --- a/src/main/java/com/techsor/datacenter/sender/dao/DashboardAlertDao.java +++ b/src/main/java/com/techsor/datacenter/sender/dao/DashboardAlertDao.java @@ -9,6 +9,7 @@ import lombok.extern.slf4j.Slf4j; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Statement; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -19,6 +20,8 @@ import org.apache.commons.lang.StringUtils; import org.springframework.jdbc.core.BatchPreparedStatementSetter; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Component; import jakarta.annotation.Resource; @@ -150,16 +153,36 @@ public class DashboardAlertDao { public void insertAlertHistory(DynamodbEntity entity) { String sql = "INSERT INTO alert_history (" + - "device_id, receive_ts, retain_alert" + - ") VALUES (?, ?, ?)"; + "device_id, receive_ts, retain_alert" + + ") VALUES (?, ?, ?)"; jdbcTemplate.update(sql, - entity.getDeviceId(), - entity.getReceive_ts(), - entity.getRetainAlert() + entity.getDeviceId(), + entity.getReceive_ts(), + entity.getRetainAlert() ); } + public Long insertAlertHistory(DynamodbEntity entity, int sourceType) { + + String sql = "INSERT INTO alert_history (" + + "device_id, receive_ts, source_type" + + ") VALUES (?, ?, ?)"; + + KeyHolder keyHolder = new GeneratedKeyHolder(); + + jdbcTemplate.update(connection -> { + PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); + ps.setString(1, entity.getDeviceId()); + ps.setLong(2, entity.getReceive_ts()); + ps.setInt(3, sourceType); + return ps; + }, keyHolder); + + // 获取主键ID + return keyHolder.getKey() != null ? keyHolder.getKey().longValue() : null; + } + public void updateLatestAlertToAutoRecovered(DynamodbEntity entity) { String sql = "SELECT * FROM alert_history WHERE device_id = ? ORDER BY id DESC LIMIT 1"; diff --git a/src/main/java/com/techsor/datacenter/sender/dao/F10Dao.java b/src/main/java/com/techsor/datacenter/sender/dao/F10Dao.java index 3d04a8f..b005dd8 100644 --- a/src/main/java/com/techsor/datacenter/sender/dao/F10Dao.java +++ b/src/main/java/com/techsor/datacenter/sender/dao/F10Dao.java @@ -12,7 +12,7 @@ public class F10Dao { private JdbcTemplate jdbcTemplate ; public void insertF10Log(F10JournalLog f10JournalLog) { - String sql = "INSERT INTO f10_journal_log (" + + String sql = "INSERT IGNORE INTO f10_journal_log (" + "device_id, company_id, raw_hex, raw_text, serial_no, mode, " + "signal_seq, receive_date, receive_time, channel_no, test_flag, block_no, block_name, " + "signal_type1, signal_type2, signal_label, signal_status, " + @@ -20,8 +20,8 @@ public class F10Dao { "customer_name, phone, remark, display_color, error_reason, line_type, area_name, " + "send_date, send_time, customer_no, display_data1, display_data2, " + "instruction_flag, signal_code, card_no, card_type, mansion_building, mansion_room, option_field, " + - "created_at, created_time" + - ") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + "created_at, created_time, receive_timestamp, expired_flag, alert_history_id" + + ") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; jdbcTemplate.update(sql, f10JournalLog.getDeviceId(), @@ -72,8 +72,11 @@ public class F10Dao { f10JournalLog.getMansionRoom(), f10JournalLog.getOptionField(), - System.currentTimeMillis(), - new java.sql.Timestamp(System.currentTimeMillis()) + f10JournalLog.getCreatedAt(), + new java.sql.Timestamp(f10JournalLog.getCreatedAt()), + f10JournalLog.getReceiveTimestamp(), + f10JournalLog.getExpiredFlag(), + f10JournalLog.getAlertHistoryId() ); } } diff --git a/src/main/java/com/techsor/datacenter/sender/entitiy/f10/F10JournalLog.java b/src/main/java/com/techsor/datacenter/sender/entitiy/f10/F10JournalLog.java index 80d8769..9a059fc 100644 --- a/src/main/java/com/techsor/datacenter/sender/entitiy/f10/F10JournalLog.java +++ b/src/main/java/com/techsor/datacenter/sender/entitiy/f10/F10JournalLog.java @@ -76,4 +76,12 @@ public class F10JournalLog { // ===== 系统字段 ===== private Long createdAt; // 毫秒时间戳 private LocalDateTime createdTime; // 标准时间 + + // 接收时间戳(JST) + private Long receiveTimestamp; + + // 是否过期告警(0=正常,1=过期) + private Integer expiredFlag; + + private Long alertHistoryId; } diff --git a/src/main/java/com/techsor/datacenter/sender/service/F10Service.java b/src/main/java/com/techsor/datacenter/sender/service/F10Service.java index 12f6a65..687fe23 100644 --- a/src/main/java/com/techsor/datacenter/sender/service/F10Service.java +++ b/src/main/java/com/techsor/datacenter/sender/service/F10Service.java @@ -4,19 +4,26 @@ import cn.hutool.core.collection.CollectionUtil; import com.techsor.datacenter.sender.components.CommonOpt; import com.techsor.datacenter.sender.components.GuavaRedisCache; import com.techsor.datacenter.sender.config.DataSourceContextHolder; +import com.techsor.datacenter.sender.dao.DashboardAlertDao; import com.techsor.datacenter.sender.dao.DeviceDao; import com.techsor.datacenter.sender.dao.F10Dao; import com.techsor.datacenter.sender.entitiy.DeviceEntity; +import com.techsor.datacenter.sender.entitiy.DynamodbEntity; import com.techsor.datacenter.sender.entitiy.f10.F10JournalLog; import com.techsor.datacenter.sender.entitiy.f10.RedisStreamEntity; +import com.techsor.datacenter.sender.utils.RedisUtils; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.nio.charset.Charset; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.List; +import java.util.concurrent.TimeUnit; @Slf4j @Service("F10Service") @@ -24,15 +31,21 @@ public class F10Service { private static final Charset SHIFT_JIS = Charset.forName("Shift-JIS"); + private static final ZoneId JST = ZoneId.of("Asia/Tokyo"); + @Autowired private CommonOpt commonOpt; @Resource private GuavaRedisCache guavaRedisCache; + @Resource + private RedisUtils redisUtils; @Autowired private F10Dao f10Dao; @Autowired private DeviceDao deviceDao; + @Autowired + private DashboardAlertDao dashboardAlertDao; @@ -46,12 +59,50 @@ public class F10Service { } try { + long currentTs = System.currentTimeMillis(); + F10JournalLog f10JournalLog = parseToEntity(rawEntity.getHexRawData()); + f10JournalLog.setCreatedAt(currentTs); //前缀_26契約先番号_4チャンネル番号 //前缀还没定,先【26契約先番号_4チャンネル番号】 f10JournalLog.setDeviceId(f10JournalLog.getCustomerNo() + "_" + f10JournalLog.getChannelNo()); + long receivedCurrentTs = parseToTimestamp(f10JournalLog.getReceiveDate(), f10JournalLog.getReceiveTime()); + f10JournalLog.setReceiveTimestamp(receivedCurrentTs); + + String redisKey = getLatestAlarmKey(f10JournalLog.getDeviceId()); + // 从 Redis 取值 + String latestTsStr = redisUtils.get(redisKey); + Long latestTs = null; + if (latestTsStr != null) { + try { + latestTs = Long.parseLong(latestTsStr); + } catch (Exception e) { + log.error("Redis数据异常,无法转换为Long: key={}, value={}", redisKey, latestTsStr); + } + } + + boolean isExpired = false; + // ===== 判断逻辑 ===== + if (latestTs == null) { + // 首次 + redisUtils.add(redisKey, String.valueOf(receivedCurrentTs)); + } else { + if (receivedCurrentTs > latestTs) { + // 新数据 + redisUtils.add(redisKey, String.valueOf(receivedCurrentTs)); + } else if (receivedCurrentTs == latestTs) { + // 重复数据 → 直接丢弃 + log.warn("重复告警,丢弃 deviceId={}", f10JournalLog.getDeviceId()); + return; + } else { + // 旧数据 → 标记过期 + isExpired = true; + } + } + f10JournalLog.setExpiredFlag(isExpired ? 1 : 0); + String topCompanyId= commonOpt.getTopCompanyId(f10JournalLog.getDeviceId()); if (topCompanyId==null || topCompanyId.equals("0")){ log.error("no companyId is found========================>>>> {}",f10JournalLog.getDeviceId()); @@ -69,8 +120,17 @@ public class F10Service { } Long companyId = deviceEntity.get(0).getCompanyId(); - f10JournalLog.setCompanyId(companyId); + + if (!isExpired){ + DynamodbEntity entity = new DynamodbEntity(); + entity.setDeviceId(f10JournalLog.getDeviceId()); + entity.setReceive_ts(currentTs); + Long dbId = dashboardAlertDao.insertAlertHistory(entity, 2); + f10JournalLog.setAlertHistoryId(dbId); + } + + f10Dao.insertF10Log(f10JournalLog); } catch (Exception e) { @@ -78,6 +138,10 @@ public class F10Service { } } + public static String getLatestAlarmKey(String deviceId) { + return "f10:latest_alarm:" + deviceId; + } + public static F10JournalLog parseToEntity(String hexLog) { byte[] src = hexStringToByteArray(hexLog); @@ -170,4 +234,13 @@ public class F10Service { return data; } + public static long parseToTimestamp(String date, String time) { + LocalDateTime ldt = LocalDateTime.parse( + date + time, + DateTimeFormatter.ofPattern("yyyyMMddHHmmss") + ); + + return ldt.atZone(JST).toInstant().toEpochMilli(); + } + } From 8ca5f73eec87ce183ae852c766efc45a07ec21ec Mon Sep 17 00:00:00 2001 From: zhczyx Date: Fri, 17 Apr 2026 22:17:15 +0800 Subject: [PATCH 5/7] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0Dockerfile?= =?UTF-8?q?=E5=92=8Cpom.xml=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改mvnw文件权限为可执行 - 添加.java-version文件指定Java 17 - 优化Dockerfile中的包管理命令 - 切换pom.xml中的docker插件配置为测试环境 --- .java-version | 1 + Dockerfile | 6 ++++-- mvnw | 0 pom.xml | 44 ++++++++++++++++++++++---------------------- 4 files changed, 27 insertions(+), 24 deletions(-) create mode 100644 .java-version mode change 100644 => 100755 mvnw diff --git a/.java-version b/.java-version new file mode 100644 index 0000000..98d9bcb --- /dev/null +++ b/.java-version @@ -0,0 +1 @@ +17 diff --git a/Dockerfile b/Dockerfile index e8a55f3..5015b5c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,9 @@ # FROM registry.ap-northeast-1.aliyuncs.com/southwave/jdk17-template:latest FROM amazoncorretto:17-alpine -# 安装 fontconfig 和 DejaVu 字体 (这是一个通用且免费的字体包) -RUN apk --no-cache add fontconfig ttf-dejavu +# 更新系统包并安装 fontconfig 和 DejaVu 字体 (这是一个通用且免费的字体包) +RUN apk --no-cache update && \ + apk --no-cache upgrade && \ + apk --no-cache add fontconfig ttf-dejavu WORKDIR /app COPY target/data-center-sender.jar app.jar diff --git a/mvnw b/mvnw old mode 100644 new mode 100755 diff --git a/pom.xml b/pom.xml index d661247..624d8b9 100644 --- a/pom.xml +++ b/pom.xml @@ -470,7 +470,7 @@ - + - - - - - - - - - - - - - - - - - - - - + + io.fabric8 + docker-maven-plugin + 0.38.1 + + + AKIAVSKFRQDPNWHJDSHL + DqGyOiVFKI50/Ix+cjvj25vPL2tC7NJrJ7fqzn/g + + + + ${aws.ecr.registryTest}/aeon/${aws.ecr.repository}:latest + ${aws.ecr.registry} + + ${project.basedir}/Dockerfile + + + + + From 36126f7b5bf0f1ced333965aa1d15d689f6c0cd8 Mon Sep 17 00:00:00 2001 From: "review512jwy@163.com" <“review512jwy@163.com”> Date: Sun, 19 Apr 2026 11:09:14 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E5=AE=89=E5=85=A8=E6=8A=A5=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index d661247..107931b 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 3.5.7 + 3.5.13 com.techsor @@ -42,7 +42,7 @@ io.netty netty-bom - 4.2.9.Final + 4.2.12.Final pom import @@ -67,7 +67,7 @@ org.apache.tomcat.embed tomcat-embed-core - 10.1.49 + 10.1.54 @@ -382,12 +382,12 @@ org.apache.logging.log4j log4j-core - 2.25.3 + 2.25.4 org.apache.logging.log4j log4j-api - 2.25.3 + 2.25.4 From 9ec647e24239854ff87f410ebe9b83af898588a5 Mon Sep 17 00:00:00 2001 From: "review512jwy@163.com" <“review512jwy@163.com”> Date: Fri, 1 May 2026 22:27:14 +0800 Subject: [PATCH 7/7] =?UTF-8?q?equipmentInfo=E4=B8=BA=E7=A9=BA=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datacenter/sender/dao/DeviceDao.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/techsor/datacenter/sender/dao/DeviceDao.java b/src/main/java/com/techsor/datacenter/sender/dao/DeviceDao.java index 1fbcacb..383f958 100644 --- a/src/main/java/com/techsor/datacenter/sender/dao/DeviceDao.java +++ b/src/main/java/com/techsor/datacenter/sender/dao/DeviceDao.java @@ -80,11 +80,18 @@ public class DeviceDao { } case "basic_monitoring_asset":{ try{ - String sql="select basic_monitoring_asset.*,basic_asset_class_big.class_name as classBigName,basic_asset_class_medium.class_name as classMediumName,basic_asset_class_small.class_name as classSmallName from " + - "basic_monitoring_asset,basic_asset_class_big,basic_asset_class_medium,basic_asset_class_small where basic_monitoring_asset.equipment_id ="+id+" and basic_monitoring_asset.class_big_id = basic_asset_class_big.id" + - " and basic_monitoring_asset.class_medium_id = basic_asset_class_medium.id " + - " and basic_monitoring_asset.class_small_id = basic_asset_class_small.id "; - resultList=this.jdbcTemplate.query(sql,(rs,rowNum)->{ + String sql = + "SELECT " + + "a.*, " + + "b.class_name AS classBigName, " + + "c.class_name AS classMediumName, " + + "d.class_name AS classSmallName " + + "FROM basic_monitoring_asset a " + + "LEFT JOIN basic_asset_class_big b ON a.class_big_id = b.id " + + "LEFT JOIN basic_asset_class_medium c ON a.class_medium_id = c.id " + + "LEFT JOIN basic_asset_class_small d ON a.class_small_id = d.id " + + "WHERE a.equipment_id = ?"; + resultList=this.jdbcTemplate.query(sql,new Object[]{id},(rs,rowNum)->{ UdfCommonJsonInfo commonJsonInfo = new UdfCommonJsonInfo(); UdfAssetInfo udfAssetInfo=new UdfAssetInfo(); udfAssetInfo.setId(rs.getString("udf_equipment_id"));