From 3205a2e89a90739848f8fa68f58185e876d4d577 Mon Sep 17 00:00:00 2001
From: dongyukun <1208714201@qq.com>
Date: 星期四, 20 二月 2025 16:02:24 +0800
Subject: [PATCH] 时序数据归档

---
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/ArcPointSettingService.java          |   14 +
 iailab-module-data/iailab-module-data-biz/db/mysql/tenant.sql                                                                     |   23 ++
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/dao/ArcPointSettingDao.java                  |   11 +
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/ArcPointDataServiceImpl.java    |  232 +++++++++++++++++++++++++
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/enums/ArcCalculateTypeEnum.java             |   38 ++++
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/ArcPointSettingServiceImpl.java |    5 
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/ArcPointDataService.java             |    9 +
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/entity/ArcPointDataEntity.java               |   42 ++++
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/controller/admin/ArcPointController.java     |   34 +++
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/enums/ArcTypeEnum.java                      |   40 ++++
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/dao/ArcPointDataDao.java                     |   11 +
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/entity/ArcPointSettingEntity.java            |   56 ++++++
 12 files changed, 514 insertions(+), 1 deletions(-)

diff --git a/iailab-module-data/iailab-module-data-biz/db/mysql/tenant.sql b/iailab-module-data/iailab-module-data-biz/db/mysql/tenant.sql
index 11158d6..67722df 100644
--- a/iailab-module-data/iailab-module-data-biz/db/mysql/tenant.sql
+++ b/iailab-module-data/iailab-module-data-biz/db/mysql/tenant.sql
@@ -409,4 +409,25 @@
                            `collect_time` DATETIME   COMMENT '采集时间' ,
                            PRIMARY KEY (id) USING BTREE,
                            UNIQUE KEY `uk_point_no` (`point_no`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT = '测点采集状态表';
\ No newline at end of file
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT = '测点采集状态表';
+
+CREATE TABLE `t_arc_data` (
+                              `id` varchar(255) NOT NULL COMMENT 'id',
+                              `arc_id` varchar(255) DEFAULT NULL COMMENT '归档id',
+                              `arc_time` varchar(255) DEFAULT NULL COMMENT '归档时间',
+                              `value` varchar(255) DEFAULT NULL COMMENT '归档时间',
+                              `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+                              PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='归档数据表';
+
+CREATE TABLE `t_arc_setting` (
+                                 `id` varchar(255) NOT NULL COMMENT 'id',
+                                 `name` varchar(255) DEFAULT NULL COMMENT '名称',
+                                 `type` varchar(255) DEFAULT NULL COMMENT '归档周期(shift、day、month、year)',
+                                 `point` varchar(255) DEFAULT NULL COMMENT '归档点位',
+                                 `calculate` varchar(255) DEFAULT NULL COMMENT '计算方法(none、sum、diff、avg)',
+                                 `is_enable` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '是否启用',
+                                 `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+                                 `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+                                 PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='定时归档设置表';
\ No newline at end of file
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/enums/ArcCalculateTypeEnum.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/enums/ArcCalculateTypeEnum.java
new file mode 100644
index 0000000..a286a87
--- /dev/null
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/enums/ArcCalculateTypeEnum.java
@@ -0,0 +1,38 @@
+package com.iailab.module.data.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author DongYukun
+ * @Description
+ * @createTime 2025年02月20日
+ */
+@Getter
+@AllArgsConstructor
+public enum ArcCalculateTypeEnum {
+    
+    NONE("NONE","不计算"),
+
+    SUM("SUM","累计"),
+
+    DIFF("DIFF", "差"),
+
+    AVG("AVG", "平均");
+
+    private String code;
+    private String desc;
+
+    public static ArcCalculateTypeEnum getEumByCode(String code) {
+        if (code == null) {
+            return null;
+        }
+
+        for (ArcCalculateTypeEnum statusEnum : ArcCalculateTypeEnum.values()) {
+            if (statusEnum.getCode().equals(code)) {
+                return statusEnum;
+            }
+        }
+        return null;
+    }
+}
\ No newline at end of file
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/enums/ArcTypeEnum.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/enums/ArcTypeEnum.java
new file mode 100644
index 0000000..5fc70d7
--- /dev/null
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/enums/ArcTypeEnum.java
@@ -0,0 +1,40 @@
+package com.iailab.module.data.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author DongYukun
+ * @Description
+ * @createTime 2025年02月20日
+ */
+@Getter
+@AllArgsConstructor
+public enum ArcTypeEnum {
+
+    HOUR("HOUR","时"),
+
+    SHIFT("SHIFT","班"),
+
+    DAY("DAY","日"),
+
+    MONTH("MONTH", "月"),
+
+    YEAR("YEAR", "年");
+
+    private String code;
+    private String desc;
+
+    public static ArcTypeEnum getEumByCode(String code) {
+        if (code == null) {
+            return null;
+        }
+
+        for (ArcTypeEnum statusEnum : ArcTypeEnum.values()) {
+            if (statusEnum.getCode().equals(code)) {
+                return statusEnum;
+            }
+        }
+        return null;
+    }
+}
\ No newline at end of file
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/controller/admin/ArcPointController.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/controller/admin/ArcPointController.java
new file mode 100644
index 0000000..29ccd1c
--- /dev/null
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/controller/admin/ArcPointController.java
@@ -0,0 +1,34 @@
+package com.iailab.module.data.point.controller.admin;
+
+import com.iailab.framework.common.pojo.CommonResult;
+import com.iailab.module.data.point.dto.DaPointDTO;
+import com.iailab.module.data.point.service.ArcPointDataService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.checkerframework.checker.units.qual.A;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.UUID;
+
+import static com.iailab.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "数据归档,测点")
+@RestController
+@RequestMapping("/data/da/point")
+@Validated
+public class ArcPointController {
+
+    @Autowired
+    private ArcPointDataService arcPointDataService;
+
+
+    @PostMapping("archiving")
+    public CommonResult<Boolean> archiving(@RequestBody String type) {
+        arcPointDataService.archiving(type);
+        return success(true);
+    }
+}
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/dao/ArcPointDataDao.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/dao/ArcPointDataDao.java
new file mode 100644
index 0000000..83dc064
--- /dev/null
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/dao/ArcPointDataDao.java
@@ -0,0 +1,11 @@
+package com.iailab.module.data.point.dao;
+
+import com.iailab.framework.common.dao.BaseDao;
+import com.iailab.framework.tenant.core.db.dynamic.TenantDS;
+import com.iailab.module.data.point.entity.ArcPointDataEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+@TenantDS
+@Mapper
+public interface ArcPointDataDao extends BaseDao<ArcPointDataEntity> {
+}
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/dao/ArcPointSettingDao.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/dao/ArcPointSettingDao.java
new file mode 100644
index 0000000..6c2d62e
--- /dev/null
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/dao/ArcPointSettingDao.java
@@ -0,0 +1,11 @@
+package com.iailab.module.data.point.dao;
+
+import com.iailab.framework.common.dao.BaseDao;
+import com.iailab.framework.tenant.core.db.dynamic.TenantDS;
+import com.iailab.module.data.point.entity.ArcPointSettingEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+@TenantDS
+@Mapper
+public interface ArcPointSettingDao extends BaseDao<ArcPointSettingEntity> {
+}
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/entity/ArcPointDataEntity.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/entity/ArcPointDataEntity.java
new file mode 100644
index 0000000..3600a36
--- /dev/null
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/entity/ArcPointDataEntity.java
@@ -0,0 +1,42 @@
+package com.iailab.module.data.point.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@TableName("t_arc_data")
+public class ArcPointDataEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.ASSIGN_UUID)
+    private String id;
+
+    /**
+     * 归档id
+     */
+    private String arcId;
+
+    /**
+     * 值
+     */
+    private String value;
+
+    /**
+     * 归档时间
+     */
+    private String arcTime;
+
+    /**
+     * 创建时间
+     */
+    private String createTime;
+
+}
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/entity/ArcPointSettingEntity.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/entity/ArcPointSettingEntity.java
new file mode 100644
index 0000000..02f61d7
--- /dev/null
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/entity/ArcPointSettingEntity.java
@@ -0,0 +1,56 @@
+package com.iailab.module.data.point.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@TableName("t_arc_setting")
+public class ArcPointSettingEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.ASSIGN_UUID)
+    private String id;
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 归档周期(shift、day、month、year)
+     */
+    private String type;
+
+    /**
+     * 归档点位
+     */
+    private String point;
+
+    /**
+     * 计算方法(none、sum、diff、avg)
+     */
+    private String calculate;
+
+    /**
+     * 是否启用
+     */
+    private String isEnable;
+
+    /**
+     * 创建时间
+     */
+    private String createTime;
+
+    /**
+     * 更新时间
+     */
+    private String updateTime;
+}
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/ArcPointDataService.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/ArcPointDataService.java
new file mode 100644
index 0000000..cdec3bb
--- /dev/null
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/ArcPointDataService.java
@@ -0,0 +1,9 @@
+package com.iailab.module.data.point.service;
+
+import com.iailab.framework.common.service.BaseService;
+import com.iailab.module.data.point.entity.ArcPointDataEntity;
+
+public interface ArcPointDataService extends BaseService<ArcPointDataEntity> {
+    //根据归档类型进行归档
+    void archiving(String type);
+}
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/ArcPointSettingService.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/ArcPointSettingService.java
new file mode 100644
index 0000000..5c0e67b
--- /dev/null
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/ArcPointSettingService.java
@@ -0,0 +1,14 @@
+package com.iailab.module.data.point.service;
+
+import com.iailab.framework.common.service.BaseService;
+import com.iailab.module.data.point.entity.ArcPointSettingEntity;
+import com.iailab.module.data.point.entity.DaCumulatePointEntity;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public interface ArcPointSettingService extends BaseService<ArcPointSettingEntity> {
+
+    List<ArcPointSettingEntity> getListByType(String code);
+}
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/ArcPointDataServiceImpl.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/ArcPointDataServiceImpl.java
new file mode 100644
index 0000000..c695f29
--- /dev/null
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/ArcPointDataServiceImpl.java
@@ -0,0 +1,232 @@
+package com.iailab.module.data.point.service.impl;
+
+import com.iailab.framework.common.service.impl.BaseServiceImpl;
+import com.iailab.module.data.api.point.DataPointApiImpl;
+import com.iailab.module.data.api.point.dto.ApiPointValueDTO;
+import com.iailab.module.data.api.point.dto.ApiPointValueQueryDTO;
+import com.iailab.module.data.common.enums.ArcCalculateTypeEnum;
+import com.iailab.module.data.point.dao.ArcPointDataDao;
+import com.iailab.module.data.point.entity.ArcPointDataEntity;
+import com.iailab.module.data.point.entity.ArcPointSettingEntity;
+import com.iailab.module.data.point.service.ArcPointDataService;
+import com.iailab.module.data.common.enums.ArcTypeEnum;
+import com.iailab.module.data.point.service.ArcPointSettingService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+
+@Service
+public class ArcPointDataServiceImpl extends BaseServiceImpl<ArcPointDataDao, ArcPointDataEntity> implements ArcPointDataService {
+
+    @Autowired
+    private ArcPointSettingService arcPointSettingService;
+
+    @Autowired
+    private DataPointApiImpl dataPointApi;
+
+    //根据归档类型进行归档
+    @Override
+    public void archiving(String type) {
+        switch (ArcTypeEnum.getEumByCode(type)) {
+            case HOUR:
+                //查询对应类型的归档设置列表
+                List<ArcPointSettingEntity> arcHourList = arcPointSettingService.getListByType(ArcTypeEnum.HOUR.getCode());
+                //遍历列表
+                arcHourList.forEach(item -> {
+                    log.debug("开始归档,point:"+item.getPoint());
+                    //获取开始时间
+                    Calendar calendar = Calendar.getInstance();
+                    calendar.add(Calendar.HOUR_OF_DAY, -1);
+                    Date startTime = calendar.getTime();
+                    //通过point编号查询数据
+                    ApiPointValueQueryDTO queryDto = new ApiPointValueQueryDTO();
+                    queryDto.setPointNo(item.getPoint());
+                    queryDto.setStart(startTime);
+                    queryDto.setEnd(new Date());
+                    List<ApiPointValueDTO> valueList = dataPointApi.queryPointHistoryValue(queryDto);
+                    //判断根据计算类型计算
+                    BigDecimal value = calculate(item.getCalculate(), valueList);
+                    //归档
+                    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH");
+                    String arcTime = dateFormat.format(startTime);
+                    ArcPointDataEntity arcPointDataEntity = new ArcPointDataEntity();
+                    arcPointDataEntity.setId(String.valueOf(new Date().getTime()));
+                    arcPointDataEntity.setArcTime(arcTime);
+                    arcPointDataEntity.setArcId(item.getId());
+                    arcPointDataEntity.setValue(String.valueOf(value));
+                    insert(arcPointDataEntity);
+                    log.debug("归档完成,point:"+item.getPoint());
+                });
+                break;
+            case SHIFT:
+                //查询对应类型的归档设置列表
+                List<ArcPointSettingEntity> arcShiftList = arcPointSettingService.getListByType(ArcTypeEnum.SHIFT.getCode());
+                //遍历列表
+                arcShiftList.forEach(item -> {
+                    log.debug("开始归档,point:"+item.getPoint());
+                    //获取开始时间
+                    Calendar calendar = Calendar.getInstance();
+                    calendar.add(Calendar.HOUR_OF_DAY, -12);
+                    Date startTime = calendar.getTime();
+                    //通过point编号查询数据
+                    ApiPointValueQueryDTO queryDto = new ApiPointValueQueryDTO();
+                    queryDto.setPointNo(item.getPoint());
+                    queryDto.setStart(startTime);
+                    queryDto.setEnd(new Date());
+                    List<ApiPointValueDTO> valueList = dataPointApi.queryPointHistoryValue(queryDto);
+                    //判断根据计算类型计算
+                    BigDecimal value = calculate(item.getCalculate(), valueList);
+                    //归档
+                    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH");
+                    String arcTime = dateFormat.format(startTime);
+                    ArcPointDataEntity arcPointDataEntity = new ArcPointDataEntity();
+                    arcPointDataEntity.setId(String.valueOf(new Date().getTime()));
+                    arcPointDataEntity.setArcTime(arcTime);
+                    arcPointDataEntity.setArcId(item.getId());
+                    arcPointDataEntity.setValue(String.valueOf(value));
+                    insert(arcPointDataEntity);
+                    log.debug("归档完成,point:"+item.getPoint());
+                });
+                break;
+            case DAY:
+                //查询对应类型的归档设置列表
+                List<ArcPointSettingEntity> arcDayList = arcPointSettingService.getListByType(ArcTypeEnum.DAY.getCode());
+                //遍历列表
+                arcDayList.forEach(item -> {
+                    log.debug("开始归档,point:"+item.getPoint());
+                    //获取开始时间
+                    Calendar calendar = Calendar.getInstance();
+                    calendar.add(Calendar.DAY_OF_MONTH, -1);
+                    Date startTime = calendar.getTime();
+                    //通过point编号查询数据
+                    ApiPointValueQueryDTO queryDto = new ApiPointValueQueryDTO();
+                    queryDto.setPointNo(item.getPoint());
+                    queryDto.setStart(startTime);
+                    queryDto.setEnd(new Date());
+                    List<ApiPointValueDTO> valueList = dataPointApi.queryPointHistoryValue(queryDto);
+                    //判断根据计算类型计算
+                    BigDecimal value = calculate(item.getCalculate(), valueList);
+                    //归档
+                    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+                    String arcTime = dateFormat.format(startTime);
+                    ArcPointDataEntity arcPointDataEntity = new ArcPointDataEntity();
+                    arcPointDataEntity.setId(String.valueOf(new Date().getTime()));
+                    arcPointDataEntity.setArcTime(arcTime);
+                    arcPointDataEntity.setArcId(item.getId());
+                    arcPointDataEntity.setValue(String.valueOf(value));
+                    insert(arcPointDataEntity);
+                    log.debug("归档完成,point:"+item.getPoint());
+                });
+                break;
+            case MONTH:
+                //查询对应类型的归档设置列表
+                List<ArcPointSettingEntity> arcMonthList = arcPointSettingService.getListByType(ArcTypeEnum.MONTH.getCode());
+                //遍历列表
+                arcMonthList.forEach(item -> {
+                    log.debug("开始归档,point:"+item.getPoint());
+                    //获取开始时间
+                    Calendar calendar = Calendar.getInstance();
+                    calendar.add(Calendar.MONTH, -1);
+                    Date startTime = calendar.getTime();
+                    //通过point编号查询数据
+                    ApiPointValueQueryDTO queryDto = new ApiPointValueQueryDTO();
+                    queryDto.setPointNo(item.getPoint());
+                    queryDto.setStart(startTime);
+                    queryDto.setEnd(new Date());
+                    List<ApiPointValueDTO> valueList = dataPointApi.queryPointHistoryValue(queryDto);
+                    //判断根据计算类型计算
+                    BigDecimal value = calculate(item.getCalculate(), valueList);
+                    //归档
+                    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM");
+                    String arcTime = dateFormat.format(startTime);
+                    ArcPointDataEntity arcPointDataEntity = new ArcPointDataEntity();
+                    arcPointDataEntity.setId(String.valueOf(new Date().getTime()));
+                    arcPointDataEntity.setArcTime(arcTime);
+                    arcPointDataEntity.setArcId(item.getId());
+                    arcPointDataEntity.setValue(String.valueOf(value));
+                    insert(arcPointDataEntity);
+                    log.debug("归档完成,point:"+item.getPoint());
+                });
+                break;
+            case YEAR:
+                //查询对应类型的归档设置列表
+                List<ArcPointSettingEntity> arcYearList = arcPointSettingService.getListByType(ArcTypeEnum.YEAR.getCode());
+                //遍历列表
+                arcYearList.forEach(item -> {
+                    log.debug("开始归档,point:"+item.getPoint());
+                    //获取开始时间
+                    Calendar calendar = Calendar.getInstance();
+                    calendar.add(Calendar.YEAR, -1);
+                    Date startTime = calendar.getTime();
+                    //通过point编号查询数据
+                    ApiPointValueQueryDTO queryDto = new ApiPointValueQueryDTO();
+                    queryDto.setPointNo(item.getPoint());
+                    queryDto.setStart(startTime);
+                    queryDto.setEnd(new Date());
+                    List<ApiPointValueDTO> valueList = dataPointApi.queryPointHistoryValue(queryDto);
+                    //判断根据计算类型计算
+                    BigDecimal value = calculate(item.getCalculate(), valueList);
+                    //归档
+                    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy");
+                    String arcTime = dateFormat.format(startTime);
+                    ArcPointDataEntity arcPointDataEntity = new ArcPointDataEntity();
+                    arcPointDataEntity.setId(String.valueOf(new Date().getTime()));
+                    arcPointDataEntity.setArcTime(arcTime);
+                    arcPointDataEntity.setArcId(item.getId());
+                    arcPointDataEntity.setValue(String.valueOf(value));
+                    insert(arcPointDataEntity);
+                    log.debug("归档完成,point:"+item.getPoint());
+                });
+                break;
+
+        }
+    }
+
+    private BigDecimal calculate(String calculate, List<ApiPointValueDTO> valueList) {
+        log.debug("开始计算");
+        if (valueList == null || valueList.isEmpty()) {
+            throw new IllegalArgumentException("valueList 为空");
+        }
+
+        BigDecimal value = BigDecimal.ZERO;
+        ArcCalculateTypeEnum calculateType = ArcCalculateTypeEnum.getEumByCode(calculate);
+
+        switch (calculateType) {
+            case NONE:
+                value = BigDecimal.valueOf(valueList.get(valueList.size() - 1).getV());
+                break;
+            case SUM:
+                for (ApiPointValueDTO dto : valueList) {
+                    value = value.add(BigDecimal.valueOf(dto.getV()));
+                }
+                break;
+            case DIFF:
+                if (valueList.size() < 2) {
+                    throw new IllegalArgumentException("valueList size小于2");
+                }
+                BigDecimal prev = BigDecimal.valueOf(valueList.get(0).getV());
+                for (int i = 1; i < valueList.size(); i++) {
+                    BigDecimal curr = BigDecimal.valueOf(valueList.get(i).getV());
+                    value = value.add(curr.subtract(prev));
+                    prev = curr;
+                }
+                break;
+            case AVG:
+                for (ApiPointValueDTO dto : valueList) {
+                    value = value.add(BigDecimal.valueOf(dto.getV()));
+                }
+                value = value.divide(BigDecimal.valueOf(valueList.size()), 2, BigDecimal.ROUND_HALF_UP);
+                break;
+            default:
+                throw new IllegalArgumentException("没有对应计算方法");
+        }
+        return value;
+    }
+}
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/ArcPointSettingServiceImpl.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/ArcPointSettingServiceImpl.java
new file mode 100644
index 0000000..ac4248b
--- /dev/null
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/ArcPointSettingServiceImpl.java
@@ -0,0 +1,5 @@
+package com.iailab.module.data.point.service.impl;
+
+public class ArcPointSettingServiceImpl {
+
+}

--
Gitblit v1.9.3