iailab-module-data/iailab-module-data-biz/db/mysql/tenant.sql
@@ -410,3 +410,24 @@ PRIMARY KEY (id) USING BTREE, UNIQUE KEY `uk_point_no` (`point_no`) USING BTREE ) 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='定时归档设置表'; 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; } } 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; } } 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); } } 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> { } 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> { } 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; } 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; } 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); } 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); } 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; } } 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 { }