dengzedong
2025-02-20 7dac3b6a502558d7f4a2de2a2ba1b6eb4b40e840
Merge remote-tracking branch 'origin/master'
已添加11个文件
已修改2个文件
522 ■■■■■ 文件已修改
iailab-module-data/iailab-module-data-biz/db/mysql/tenant.sql 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/enums/ArcCalculateTypeEnum.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/enums/ArcTypeEnum.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/item/entity/IndItemEntity.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/controller/admin/ArcPointController.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/dao/ArcPointDataDao.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/dao/ArcPointSettingDao.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/entity/ArcPointDataEntity.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/entity/ArcPointSettingEntity.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/ArcPointDataService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/ArcPointSettingService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/ArcPointDataServiceImpl.java 232 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/ArcPointSettingServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/db/mysql/tenant.sql
@@ -409,4 +409,31 @@
                           `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 = '测点采集状态表';
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT = '测点采集状态表';
ALTER TABLE `t_ind_item` ADD COLUMN `solidify_flag` varchar(36) NULL COMMENT '固化标识' AFTER `status`,
MODIFY COLUMN `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' AFTER `create_time`;
ALTER TABLE `t_ind_item_value`
    MODIFY COLUMN `data_time` datetime NULL DEFAULT NULL COMMENT '数据时间' AFTER `item_no`;
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/ind/item/entity/IndItemEntity.java
@@ -80,6 +80,7 @@
    /**
     * 固化标识
     */
    @TableField(updateStrategy = FieldStrategy.ALWAYS)
    private String solidifyFlag;
    /**
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 {
}