Pārlūkot izejas kodu

feat(environment-hj212-service): 新增小时数据和日数据处理功能

- 新增 HourDataInfo 和 DayDataInfo 模型类
- 新增 HourDataInfoMapper 和 DayDataInfoMapper 接口
- 新增 HourDataInfoServiceImpl 和 DayDataInfoServiceImpl 实现类
- 新增 MonitorDatasynch 解析方法以支持小时数据和日数据
- 修改 ServerHandler 中的消息发送逻辑
林仔 1 gadu atpakaļ
vecāks
revīzija
52c64b2ad5

+ 3 - 2
environment-hj212-service/src/main/java/com/zksy/environmentHJ212/config/ServerHandler.java

@@ -2,6 +2,7 @@ package com.zksy.environmentHJ212.config;
 
 import com.zksy.environmentHJ212.utils.MonitorDatasynch;
 import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.ChannelInboundHandlerAdapter;
 import lombok.extern.slf4j.Slf4j;
@@ -35,10 +36,10 @@ public class ServerHandler extends ChannelInboundHandlerAdapter {
         /**
          * 往客户端发送消息
          */
-        /*String helo = "##0128QN=20231030111800029;ST=22;CN=2041;PW=123456;MN=010000A8900016F007;Flag=5;CP=&&BeginTime=20231029000000,EndTime=20231029000000&&";
+        String helo = "QN=20160801085857223;ST=32;CN=2031;PW=123456;MN=010000A8900016F000169DC0;Flag=5;CP=&&BeginTime=20160801000000;EndTime=20160801000000&&";
         ByteBuf byteBuf = Unpooled.wrappedBuffer(helo.getBytes());
         ctx.channel().writeAndFlush(byteBuf);
-        System.out.println("首次连接完成!"+byteBuf);*/
+        System.out.println("首次连接完成!"+byteBuf);
     }
 
     /**

+ 81 - 0
environment-hj212-service/src/main/java/com/zksy/environmentHJ212/domain/DayDataInfo.java

@@ -0,0 +1,81 @@
+package com.zksy.environmentHJ212.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * hj212-日数据
+ * @TableName day_data_info
+ */
+@Data
+@TableName(value ="day_data_info")
+public class DayDataInfo implements Serializable {
+    /**
+     * 主键
+     */
+    @TableId
+    private String id;
+
+    /**
+     * 数据采集时间
+     */
+    private LocalDateTime dataTime;
+
+    /**
+     * 监测因子编码
+     */
+    private String code;
+
+    /**
+     * 设备唯一标识
+     */
+    private String mn;
+
+    /**
+     * 拆分包及应答标志
+     */
+    private String flag;
+
+    /**
+     * 平均监测值
+     */
+    private BigDecimal dataAvgValue;
+
+    /**
+     * 最小监测值
+     */
+    private BigDecimal dataMinValue;
+
+    /**
+     * 最大监测值
+     */
+    private BigDecimal dataMaxValue;
+
+    /**
+     * 累计监测值
+     */
+    private BigDecimal dataCouValue;
+
+    /**
+     * 数据标识
+     */
+    private String dataFlag;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+}

+ 81 - 0
environment-hj212-service/src/main/java/com/zksy/environmentHJ212/domain/HourDataInfo.java

@@ -0,0 +1,81 @@
+package com.zksy.environmentHJ212.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * hj212-小时数据
+ * @TableName hour_data_info
+ */
+@Data
+@TableName(value ="hour_data_info")
+public class HourDataInfo implements Serializable {
+    /**
+     * 主键
+     */
+    @TableId(type = IdType.ASSIGN_UUID)
+    private String id;
+
+    /**
+     * 数据采集时间
+     */
+    private LocalDateTime dataTime;
+
+    /**
+     * 监测因子编码
+     */
+    private String code;
+
+    /**
+     * 设备唯一标识
+     */
+    private String mn;
+
+    /**
+     * 拆分包及应答标志
+     */
+    private String flag;
+
+    /**
+     * 平均监测值
+     */
+    private BigDecimal dataAvgValue;
+
+    /**
+     * 最小监测值
+     */
+    private BigDecimal dataMinValue;
+
+    /**
+     * 最大监测值
+     */
+    private BigDecimal dataMaxValue;
+
+    /**
+     * 累计监测值
+     */
+    private BigDecimal dataCouValue;
+
+    /**
+     * 数据标识
+     */
+    private String dataFlag;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+}

+ 18 - 0
environment-hj212-service/src/main/java/com/zksy/environmentHJ212/mapper/DayDataInfoMapper.java

@@ -0,0 +1,18 @@
+package com.zksy.environmentHJ212.mapper;
+
+import com.zksy.environmentHJ212.domain.DayDataInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author Administrator
+* @description 针对表【day_data_info(hj212-日数据)】的数据库操作Mapper
+* @createDate 2025-05-30 10:25:30
+* @Entity com.zksy.environmentHJ212.domain.DayDataInfo
+*/
+public interface DayDataInfoMapper extends BaseMapper<DayDataInfo> {
+
+}
+
+
+
+

+ 18 - 0
environment-hj212-service/src/main/java/com/zksy/environmentHJ212/mapper/HourDataInfoMapper.java

@@ -0,0 +1,18 @@
+package com.zksy.environmentHJ212.mapper;
+
+import com.zksy.environmentHJ212.domain.HourDataInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author Administrator
+* @description 针对表【hour_data_info(hj212-小时数据)】的数据库操作Mapper
+* @createDate 2025-05-30 10:05:04
+* @Entity com.zksy.environmentHJ212.domain.HourDataInfo
+*/
+public interface HourDataInfoMapper extends BaseMapper<HourDataInfo> {
+
+}
+
+
+
+

+ 13 - 0
environment-hj212-service/src/main/java/com/zksy/environmentHJ212/service/DayDataInfoService.java

@@ -0,0 +1,13 @@
+package com.zksy.environmentHJ212.service;
+
+import com.zksy.environmentHJ212.domain.DayDataInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author Administrator
+* @description 针对表【day_data_info(hj212-日数据)】的数据库操作Service
+* @createDate 2025-05-30 10:25:30
+*/
+public interface DayDataInfoService extends IService<DayDataInfo> {
+    void saveDayData(String oldDataStr,String[] dataArr);
+}

+ 13 - 0
environment-hj212-service/src/main/java/com/zksy/environmentHJ212/service/HourDataInfoService.java

@@ -0,0 +1,13 @@
+package com.zksy.environmentHJ212.service;
+
+import com.zksy.environmentHJ212.domain.HourDataInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author Administrator
+* @description 针对表【hour_data_info(hj212-小时数据)】的数据库操作Service
+* @createDate 2025-05-30 10:05:04
+*/
+public interface HourDataInfoService extends IService<HourDataInfo> {
+    void saveHourData(String oldDataStr,String[] dataArr);
+}

+ 49 - 0
environment-hj212-service/src/main/java/com/zksy/environmentHJ212/service/impl/DayDataInfoServiceImpl.java

@@ -0,0 +1,49 @@
+package com.zksy.environmentHJ212.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zksy.environmentHJ212.domain.DayDataInfo;
+import com.zksy.environmentHJ212.domain.HourDataInfo;
+import com.zksy.environmentHJ212.service.DayDataInfoService;
+import com.zksy.environmentHJ212.mapper.DayDataInfoMapper;
+import com.zksy.environmentHJ212.utils.DateTimeUtil;
+import com.zksy.environmentHJ212.utils.MonitorDatasynch;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+* @author Administrator
+* @description 针对表【day_data_info(hj212-日数据)】的数据库操作Service实现
+* @createDate 2025-05-30 10:25:30
+*/
+@Service
+public class DayDataInfoServiceImpl extends ServiceImpl<DayDataInfoMapper, DayDataInfo>
+    implements DayDataInfoService{
+
+    @Override
+    public void saveDayData(String oldDataStr, String[] dataArr) {
+        List<DayDataInfo> dayDataInfos = MonitorDatasynch.parseData(oldDataStr, dataArr, DayDataInfo::new,
+                builder -> {
+                    builder.addFieldMapper("Cou", DayDataInfo::setDataCouValue, BigDecimal::new);
+                    builder.addFieldMapper("Min", DayDataInfo::setDataMinValue, BigDecimal::new);
+                    builder.addFieldMapper("Avg", DayDataInfo::setDataAvgValue, BigDecimal::new);
+                    builder.addFieldMapper("Max", DayDataInfo::setDataMaxValue, BigDecimal::new);
+                    builder.addFieldMapper("Flag", DayDataInfo::setDataFlag, String::valueOf);
+                    builder.setCodeMapper(DayDataInfo::setCode);
+                    builder.setRemarkMapper(DayDataInfo::setRemark);
+                    builder.setMnMapper(DayDataInfo::setMn);
+                    builder.setFlagMapper(DayDataInfo::setFlag);
+                    builder.setDataTimeMapper((entity, timeStr) ->
+                            entity.setDataTime(DateTimeUtil.parseDateTime(timeStr)));
+                    builder.setCreateTimeMapper(DayDataInfo::setCreateTime);
+                    builder.setIdMapper(DayDataInfo::setId);
+                });
+        System.out.println("dayDatanfos=="+dayDataInfos);
+        super.saveBatch(dayDataInfos);
+    }
+}
+
+
+
+

+ 49 - 0
environment-hj212-service/src/main/java/com/zksy/environmentHJ212/service/impl/HourDataInfoServiceImpl.java

@@ -0,0 +1,49 @@
+package com.zksy.environmentHJ212.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zksy.environmentHJ212.domain.HourDataInfo;
+import com.zksy.environmentHJ212.domain.po.MinuteDataInfo;
+import com.zksy.environmentHJ212.service.HourDataInfoService;
+import com.zksy.environmentHJ212.mapper.HourDataInfoMapper;
+import com.zksy.environmentHJ212.utils.DateTimeUtil;
+import com.zksy.environmentHJ212.utils.MonitorDatasynch;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+* @author Administrator
+* @description 针对表【hour_data_info(hj212-小时数据)】的数据库操作Service实现
+* @createDate 2025-05-30 10:05:04
+*/
+@Service
+public class HourDataInfoServiceImpl extends ServiceImpl<HourDataInfoMapper, HourDataInfo>
+    implements HourDataInfoService{
+
+    @Override
+    public void saveHourData(String oldDataStr, String[] dataArr) {
+        List<HourDataInfo> hourDataInfos = MonitorDatasynch.parseData(oldDataStr, dataArr, HourDataInfo::new,
+                builder -> {
+                    builder.addFieldMapper("Cou", HourDataInfo::setDataCouValue, BigDecimal::new);
+                    builder.addFieldMapper("Min", HourDataInfo::setDataMinValue, BigDecimal::new);
+                    builder.addFieldMapper("Avg", HourDataInfo::setDataAvgValue, BigDecimal::new);
+                    builder.addFieldMapper("Max", HourDataInfo::setDataMaxValue, BigDecimal::new);
+                    builder.addFieldMapper("Flag", HourDataInfo::setDataFlag, String::valueOf);
+                    builder.setCodeMapper(HourDataInfo::setCode);
+                    builder.setRemarkMapper(HourDataInfo::setRemark);
+                    builder.setMnMapper(HourDataInfo::setMn);
+                    builder.setFlagMapper(HourDataInfo::setFlag);
+                    builder.setDataTimeMapper((entity, timeStr) ->
+                            entity.setDataTime(DateTimeUtil.parseDateTime(timeStr)));
+                    builder.setCreateTimeMapper(HourDataInfo::setCreateTime);
+                    builder.setIdMapper(HourDataInfo::setId);
+                });
+        System.out.println("hourDataInfos=="+hourDataInfos);
+        super.saveBatch(hourDataInfos);
+    }
+}
+
+
+
+

+ 21 - 1
environment-hj212-service/src/main/java/com/zksy/environmentHJ212/service/impl/MinuteDataInfoServiceImpl.java

@@ -4,15 +4,35 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zksy.environmentHJ212.domain.po.MinuteDataInfo;
 import com.zksy.environmentHJ212.mapper.MinuteDataInfoMapper;
 import com.zksy.environmentHJ212.service.MinuteDataInfoService;
+import com.zksy.environmentHJ212.utils.DateTimeUtil;
 import com.zksy.environmentHJ212.utils.MonitorDatasynch;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
 import java.util.List;
+import java.util.UUID;
+
 @Service
 public class MinuteDataInfoServiceImpl extends ServiceImpl<MinuteDataInfoMapper, MinuteDataInfo> implements MinuteDataInfoService {
     @Override
     public void saveMonitordata(String oldDataStr,String[] dataArr) {
-        List<MinuteDataInfo> minuteDataInfos = MonitorDatasynch.minuteDataInfoData(oldDataStr,dataArr);
+        List<MinuteDataInfo> minuteDataInfos = MonitorDatasynch.parseData(oldDataStr, dataArr, MinuteDataInfo::new,
+                builder -> {
+                    builder.addFieldMapper("Cou", MinuteDataInfo::setDataCouValue, BigDecimal::new);
+                    builder.addFieldMapper("Min", MinuteDataInfo::setDataMinValue, BigDecimal::new);
+                    builder.addFieldMapper("Avg", MinuteDataInfo::setDataAvgValue, BigDecimal::new);
+                    builder.addFieldMapper("Max", MinuteDataInfo::setDataMaxValue, BigDecimal::new);
+                    builder.addFieldMapper("Flag", MinuteDataInfo::setDataFlag, String::valueOf);
+                    builder.setCodeMapper(MinuteDataInfo::setCode);
+                    builder.setRemarkMapper(MinuteDataInfo::setRemark);
+                    builder.setMnMapper(MinuteDataInfo::setMn);
+                    builder.setFlagMapper(MinuteDataInfo::setFlag);
+                    builder.setDataTimeMapper((entity, timeStr) ->
+                            entity.setDataTime(DateTimeUtil.parseDateTime(timeStr)));
+                    builder.setCreateTimeMapper(MinuteDataInfo::setCreateTime);
+                    builder.setIdMapper(MinuteDataInfo::setId);
+                });
         System.out.println("minuteDataInfos=="+minuteDataInfos);
         super.saveBatch(minuteDataInfos);
     }

+ 240 - 12
environment-hj212-service/src/main/java/com/zksy/environmentHJ212/utils/MonitorDatasynch.java

@@ -2,20 +2,23 @@ package com.zksy.environmentHJ212.utils;
 
 import com.zksy.environmentHJ212.domain.po.MinuteDataInfo;
 import com.zksy.environmentHJ212.domain.po.PsMonitorSz;
+import com.zksy.environmentHJ212.service.DayDataInfoService;
+import com.zksy.environmentHJ212.service.HourDataInfoService;
 import com.zksy.environmentHJ212.service.MinuteDataInfoService;
 import com.zksy.environmentHJ212.service.PsMonitorSzService;
 import io.netty.channel.ChannelHandlerContext;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Service;
 
-import java.math.BigDecimal;
 import java.net.InetSocketAddress;
 import java.time.LocalDateTime;
 import java.util.*;
-import java.util.regex.Pattern;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
 import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE;
@@ -29,15 +32,17 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT
 @Slf4j
 @Scope(SCOPE_PROTOTYPE)
 public class MonitorDatasynch {
-
     private final PsMonitorSzService psMonitorSzService;
-
     private final MinuteDataInfoService minuteDataInfoService;
+    private final HourDataInfoService hourDataInfoService;
+    private final DayDataInfoService  dayDataInfoService;
 
     @Autowired
-    public MonitorDatasynch(PsMonitorSzService psMonitorSzService, MinuteDataInfoService minuteDataInfoService) {
+    public MonitorDatasynch(PsMonitorSzService psMonitorSzService, MinuteDataInfoService minuteDataInfoService, HourDataInfoService hourDataInfoService, DayDataInfoService dayDataInfoService) {
         this.psMonitorSzService = psMonitorSzService;
         this.minuteDataInfoService = minuteDataInfoService;
+        this.hourDataInfoService = hourDataInfoService;
+        this.dayDataInfoService = dayDataInfoService;
     }
     private static LinkedHashMap<String, String> fieldMap = new LinkedHashMap<>();
     static {
@@ -85,11 +90,17 @@ public class MonitorDatasynch {
                         String ipPort = host+":"+port;
                         List<PsMonitorSz> psMonitorSzList = psMonitorSzService.pushMonitorData(oldDataStr,dataArr,ipPort);
                         psMonitorSzService.saveBatch(psMonitorSzList);
-                    } else if ("2051".equals(cn.substring(3)) || "2061".equals(cn.substring(3))){
-                        //分钟,小时数据
+                    } else if ("2051".equals(cn.substring(3))){
+                        //分钟数据
                         minuteDataInfoService.saveMonitordata(oldDataStr,dataArr);
-                    }else{
-                        System.err.println("报警"+oldDataStr);
+                    }else if ("2061".equals(cn.substring(3))){
+                        //小时数据
+                        hourDataInfoService.saveHourData(oldDataStr,dataArr);
+                    }else if ("2031".equals(cn.substring(3))){
+                        //日数据
+                        dayDataInfoService.saveDayData(oldDataStr,dataArr);
+                    }else {
+                        log.info("其它数据========", oldDataStr);
                     }
 
                 } catch (Exception e) {
@@ -104,7 +115,7 @@ public class MonitorDatasynch {
         }
         return response;
     }
-    public static List<MinuteDataInfo> minuteDataInfoData(String oldDataStr,String[] dataArr) {
+    /*public static List<MinuteDataInfo> minuteDataInfoData(String oldDataStr,String[] dataArr) {
         ArrayList<String> arrayList = new ArrayList<>();
         List<MinuteDataInfo> minuteDataInfolist = new ArrayList<>();
         for (String param : dataArr) {
@@ -183,5 +194,222 @@ public class MonitorDatasynch {
             }
         }
         return minuteDataInfolist;
-    }
+    }*/
+        public static <T> List<T> parseData(String oldDataStr, String[] dataArr, Supplier<T> entitySupplier,
+                                            Consumer<EntityFieldMapperBuilder<T>> configurer) {
+            EntityFieldMapperBuilder<T> builder = new EntityFieldMapperBuilder<>(entitySupplier);
+            configurer.accept(builder);
+            EntityFieldMapper<T> mapper = builder.build();
+
+            List<String> validParams = extractValidParams(dataArr);
+            Map<String, String> commonParams = extractCommonParams(dataArr);
+
+            List<T> entityList = new ArrayList<>();
+            for (String entityParam : validParams) {
+                String code = extractCode(entityParam);
+                if (code == null) {
+                    continue;
+                }
+
+                T entity = mapper.createEntity();
+                mapper.setCode(entity, code);
+                mapper.setRemark(entity, oldDataStr);
+
+                String[] parameters = entityParam.split(",");
+                for (String param : parameters) {
+                    String[] keyValue = param.split("=", 2);
+                    if (keyValue.length != 2) {
+                        continue;
+                    }
+                    mapper.mapField(entity, code, keyValue[0], keyValue[1]);
+                }
+
+                mapper.setCommonFields(entity, commonParams);
+                mapper.setCreateTime(entity);
+                mapper.setId(entity);
+
+                entityList.add(entity);
+            }
+            return entityList;
+        }
+
+        private static List<String> extractValidParams(String[] dataArr) {
+            List<String> validParams = new ArrayList<>();
+            for (String param : dataArr) {
+                if (param.contains("&&")) {
+                    param = param.replace("&&", ",");
+                }
+                if (param.contains(",")) {
+                    validParams.add(param);
+                }
+            }
+            return validParams;
+        }
+
+        private static Map<String, String> extractCommonParams(String[] dataArr) {
+            Map<String, String> commonParams = new HashMap<>();
+            for (String param : dataArr) {
+                if (param.contains("&&") && !param.contains(",")) {
+                    String[] parts = param.replace("&&", ",").split(",");
+                    if (parts.length > 1 && parts[1].startsWith("DataTime=")) {
+                        commonParams.put("DataTime", parts[1].substring("DataTime=".length()));
+                    }
+                }
+                String[] keyValue = param.split("=", 2);
+                if (keyValue.length == 2) {
+                    commonParams.put(keyValue[0], keyValue[1]);
+                }
+            }
+            return commonParams;
+        }
+
+        private static String extractCode(String entityParam) {
+            if (entityParam.contains("-")) {
+                return entityParam.substring(0, entityParam.indexOf("-"));
+            }
+            return null;
+        }
+
+        public static class EntityFieldMapperBuilder<T> {
+            private final Supplier<T> entitySupplier;
+            private final Map<String, BiConsumer<T, Object>> fieldMappers = new HashMap<>();
+            private BiConsumer<T, String> codeMapper;
+            private BiConsumer<T, String> remarkMapper;
+            private BiConsumer<T, String> mnMapper;
+            private BiConsumer<T, String> flagMapper;
+            private BiConsumer<T, String> dataTimeMapper;
+            private BiConsumer<T, LocalDateTime> createTimeMapper;
+            private BiConsumer<T, String> idMapper;
+
+            public EntityFieldMapperBuilder(Supplier<T> entitySupplier) {
+                this.entitySupplier = entitySupplier;
+            }
+
+            public <V> EntityFieldMapperBuilder<T> addFieldMapper(String suffix, BiConsumer<T, V> setter, Function<String, V> converter) {
+                fieldMappers.put(suffix, (entity, value) -> setter.accept(entity, converter.apply((String) value)));
+                return this;
+            }
+
+            public EntityFieldMapperBuilder<T> setCodeMapper(BiConsumer<T, String> codeMapper) {
+                this.codeMapper = codeMapper;
+                return this;
+            }
+
+            public EntityFieldMapperBuilder<T> setRemarkMapper(BiConsumer<T, String> remarkMapper) {
+                this.remarkMapper = remarkMapper;
+                return this;
+            }
+
+            public EntityFieldMapperBuilder<T> setMnMapper(BiConsumer<T, String> mnMapper) {
+                this.mnMapper = mnMapper;
+                return this;
+            }
+
+            public EntityFieldMapperBuilder<T> setFlagMapper(BiConsumer<T, String> flagMapper) {
+                this.flagMapper = flagMapper;
+                return this;
+            }
+
+            public EntityFieldMapperBuilder<T> setDataTimeMapper(BiConsumer<T, String> dataTimeMapper) {
+                this.dataTimeMapper = dataTimeMapper;
+                return this;
+            }
+
+            public EntityFieldMapperBuilder<T> setCreateTimeMapper(BiConsumer<T, LocalDateTime> createTimeMapper) {
+                this.createTimeMapper = createTimeMapper;
+                return this;
+            }
+
+            public EntityFieldMapperBuilder<T> setIdMapper(BiConsumer<T, String> idMapper) {
+                this.idMapper = idMapper;
+                return this;
+            }
+
+            public EntityFieldMapper<T> build() {
+                return new EntityFieldMapper<>(
+                        entitySupplier, fieldMappers, codeMapper, remarkMapper,
+                        mnMapper, flagMapper, dataTimeMapper, createTimeMapper, idMapper
+                );
+            }
+        }
+
+        public static class EntityFieldMapper<T> {
+            private final Supplier<T> entitySupplier;
+            private final Map<String, BiConsumer<T, Object>> fieldMappers;
+            private final BiConsumer<T, String> codeMapper;
+            private final BiConsumer<T, String> remarkMapper;
+            private final BiConsumer<T, String> mnMapper;
+            private final BiConsumer<T, String> flagMapper;
+            private final BiConsumer<T, String> dataTimeMapper;
+            private final BiConsumer<T, LocalDateTime> createTimeMapper;
+            private final BiConsumer<T, String> idMapper;
+
+            public EntityFieldMapper(
+                    Supplier<T> entitySupplier, Map<String, BiConsumer<T, Object>> fieldMappers,
+                    BiConsumer<T, String> codeMapper, BiConsumer<T, String> remarkMapper,
+                    BiConsumer<T, String> mnMapper, BiConsumer<T, String> flagMapper,
+                    BiConsumer<T, String> dataTimeMapper, BiConsumer<T, LocalDateTime> createTimeMapper,
+                    BiConsumer<T, String> idMapper) {
+                this.entitySupplier = entitySupplier;
+                this.fieldMappers = fieldMappers;
+                this.codeMapper = codeMapper;
+                this.remarkMapper = remarkMapper;
+                this.mnMapper = mnMapper;
+                this.flagMapper = flagMapper;
+                this.dataTimeMapper = dataTimeMapper;
+                this.createTimeMapper = createTimeMapper;
+                this.idMapper = idMapper;
+            }
+
+            public T createEntity() {
+                return entitySupplier.get();
+            }
+
+            public void setCode(T entity, String code) {
+                if (codeMapper != null) {
+                    codeMapper.accept(entity, code);
+                }
+            }
+
+            public void setRemark(T entity, String remark) {
+                if (remarkMapper != null) {
+                    remarkMapper.accept(entity, remark);
+                }
+            }
+
+            public void mapField(T entity, String code, String key, String value) {
+                for (Map.Entry<String, BiConsumer<T, Object>> entry : fieldMappers.entrySet()) {
+                    String suffix = entry.getKey();
+                    BiConsumer<T, Object> mapper = entry.getValue();
+                    if (key.equals(code + "-" + suffix)) {
+                        mapper.accept(entity, value);
+                        break;
+                    }
+                }
+            }
+
+            public void setCommonFields(T entity, Map<String, String> commonParams) {
+                if (mnMapper != null && commonParams.containsKey("MN")) {
+                    mnMapper.accept(entity, commonParams.get("MN"));
+                }
+                if (flagMapper != null && commonParams.containsKey("Flag")) {
+                    flagMapper.accept(entity, commonParams.get("Flag"));
+                }
+                if (dataTimeMapper != null && commonParams.containsKey("DataTime")) {
+                    dataTimeMapper.accept(entity, commonParams.get("DataTime"));
+                }
+            }
+
+            public void setCreateTime(T entity) {
+                if (createTimeMapper != null) {
+                    createTimeMapper.accept(entity, LocalDateTime.now());
+                }
+            }
+
+            public void setId(T entity) {
+                if (idMapper != null) {
+                    idMapper.accept(entity, UUID.randomUUID().toString().replace("-", ""));
+                }
+            }
+        }
 }

+ 28 - 0
environment-hj212-service/src/main/resources/mapper/DayDataInfoMapper.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zksy.environmentHJ212.mapper.DayDataInfoMapper">
+
+    <resultMap id="BaseResultMap" type="com.zksy.environmentHJ212.domain.DayDataInfo">
+            <id property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="dataTime" column="data_time" jdbcType="TIMESTAMP"/>
+            <result property="code" column="code" jdbcType="VARCHAR"/>
+            <result property="mn" column="mn" jdbcType="VARCHAR"/>
+            <result property="flag" column="flag" jdbcType="VARCHAR"/>
+            <result property="dataAvgValue" column="data_avg_value" jdbcType="DECIMAL"/>
+            <result property="dataMinValue" column="data_min_value" jdbcType="DECIMAL"/>
+            <result property="dataMaxValue" column="data_max_value" jdbcType="DECIMAL"/>
+            <result property="dataCouValue" column="data_cou_value" jdbcType="DECIMAL"/>
+            <result property="dataFlag" column="data_flag" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="remark" column="remark" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,data_time,code,
+        mn,flag,data_avg_value,
+        data_min_value,data_max_value,data_cou_value,
+        data_flag,create_time,remark
+    </sql>
+</mapper>

+ 28 - 0
environment-hj212-service/src/main/resources/mapper/HourDataInfoMapper.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zksy.environmentHJ212.mapper.HourDataInfoMapper">
+
+    <resultMap id="BaseResultMap" type="com.zksy.environmentHJ212.domain.HourDataInfo">
+            <id property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="dataTime" column="data_time" jdbcType="TIMESTAMP"/>
+            <result property="code" column="code" jdbcType="VARCHAR"/>
+            <result property="mn" column="mn" jdbcType="VARCHAR"/>
+            <result property="flag" column="flag" jdbcType="VARCHAR"/>
+            <result property="dataAvgValue" column="data_avg_value" jdbcType="DECIMAL"/>
+            <result property="dataMinValue" column="data_min_value" jdbcType="DECIMAL"/>
+            <result property="dataMaxValue" column="data_max_value" jdbcType="DECIMAL"/>
+            <result property="dataCouValue" column="data_cou_value" jdbcType="DECIMAL"/>
+            <result property="dataFlag" column="data_flag" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="remark" column="remark" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,data_time,code,
+        mn,flag,data_avg_value,
+        data_min_value,data_max_value,data_cou_value,
+        data_flag,create_time,remark
+    </sql>
+</mapper>