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 175e1ac..5015b5c 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,7 +1,8 @@
# FROM registry.ap-northeast-1.aliyuncs.com/southwave/jdk17-template:latest
FROM amazoncorretto:17-alpine
-# 安装 fontconfig 和 DejaVu 字体 (这是一个通用且免费的字体包)
-RUN apk --no-cache upgrade && \
+# 更新系统包并安装 fontconfig 和 DejaVu 字体 (这是一个通用且免费的字体包)
+RUN apk --no-cache update && \
+ apk --no-cache upgrade && \
apk --no-cache add fontconfig ttf-dejavu
WORKDIR /app
diff --git a/mvnw b/mvnw
old mode 100644
new mode 100755
diff --git a/pom.xml b/pom.xml
index 264e7c7..db23f0a 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
@@ -469,40 +469,19 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+ 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
+
+
+
+
+
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/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/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"));
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..b005dd8
--- /dev/null
+++ b/src/main/java/com/techsor/datacenter/sender/dao/F10Dao.java
@@ -0,0 +1,82 @@
+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 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, " +
+ "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, receive_timestamp, expired_flag, alert_history_id" +
+ ") 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(),
+
+ 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
new file mode 100644
index 0000000..9a059fc
--- /dev/null
+++ b/src/main/java/com/techsor/datacenter/sender/entitiy/f10/F10JournalLog.java
@@ -0,0 +1,87 @@
+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; // 标准时间
+
+ // 接收时间戳(JST)
+ private Long receiveTimestamp;
+
+ // 是否过期告警(0=正常,1=过期)
+ private Integer expiredFlag;
+
+ private Long alertHistoryId;
+}
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..687fe23
--- /dev/null
+++ b/src/main/java/com/techsor/datacenter/sender/service/F10Service.java
@@ -0,0 +1,246 @@
+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.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")
+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;
+
+
+
+ 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 {
+ 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());
+ 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);
+
+ 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) {
+ log.error("F10解析入库失败", e);
+ }
+ }
+
+ public static String getLatestAlarmKey(String deviceId) {
+ return "f10:latest_alarm:" + deviceId;
+ }
+
+ 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;
+ }
+
+ public static long parseToTimestamp(String date, String time) {
+ LocalDateTime ldt = LocalDateTime.parse(
+ date + time,
+ DateTimeFormatter.ofPattern("yyyyMMddHHmmss")
+ );
+
+ return ldt.atZone(JST).toInstant().toEpochMilli();
+ }
+
+}
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}