From 7d6062d5390b4849c3e5a353f3746465130d2960 Mon Sep 17 00:00:00 2001
From: zhangyue <82248909@qq.com>
Date: Mon, 21 Sep 2026 11:18:32 +0800
Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=A9=BA=E6=B0=94=E5=9C=9F?=
=?UTF-8?q?=E5=A3=A4=E8=AE=BE=E5=88=AB=E5=A1=AB=E5=85=85=E4=BB=BB=E5=8A=A1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../service/ISurvHisdataAirService.java | 4 +
.../Impl/SurvHisdataAirServiceImpl.java | 172 ++++++++++++++++++
.../Impl/SurvHisdataSoilServiceImpl.java | 2 +-
.../Impl/SurvTransdataSoilServiceImpl.java | 22 ++-
.../java/com/lanhai/task/DataExamineTask.java | 23 +++
.../java/com/lanhai/util/DateTimeUtils.java | 19 ++
src/test/java/com/lanhai/test/testway.java | 5 +-
7 files changed, 241 insertions(+), 6 deletions(-)
diff --git a/src/main/java/com/lanhai/service/ISurvHisdataAirService.java b/src/main/java/com/lanhai/service/ISurvHisdataAirService.java
index cfa7958..684d68c 100644
--- a/src/main/java/com/lanhai/service/ISurvHisdataAirService.java
+++ b/src/main/java/com/lanhai/service/ISurvHisdataAirService.java
@@ -1,7 +1,10 @@
package com.lanhai.service;
+import com.lanhai.entity.SurvDeviceDeploy;
import com.lanhai.entity.SurvHisdataAir;
import com.baomidou.mybatisplus.extension.service.IService;
+import com.lanhai.entity.SurvTransdataAir;
+import com.lanhai.o.iot.task.DataExamineDetail;
/**
*
@@ -11,4 +14,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface ISurvHisdataAirService extends IService {
+ SurvTransdataAir genDataAuto(SurvDeviceDeploy deploy, DataExamineDetail config);
}
diff --git a/src/main/java/com/lanhai/service/Impl/SurvHisdataAirServiceImpl.java b/src/main/java/com/lanhai/service/Impl/SurvHisdataAirServiceImpl.java
index 4272872..1654c0e 100644
--- a/src/main/java/com/lanhai/service/Impl/SurvHisdataAirServiceImpl.java
+++ b/src/main/java/com/lanhai/service/Impl/SurvHisdataAirServiceImpl.java
@@ -1,11 +1,34 @@
package com.lanhai.service.Impl;
+import cn.hutool.core.bean.BeanUtil;
+import com.lanhai.constant.IotConstants;
+import com.lanhai.entity.SurvDeviceDeploy;
import com.lanhai.entity.SurvHisdataAir;
+import com.lanhai.entity.SurvStationInfo;
+import com.lanhai.entity.SurvTransdataAir;
import com.lanhai.mapper.SurvHisdataAirMapper;
+import com.lanhai.o.iot.task.DataExamineDetail;
+import com.lanhai.o.iot.task.DataExamineRule;
import com.lanhai.service.ISurvHisdataAirService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.lanhai.service.ISurvStationInfoService;
+import com.lanhai.util.BigDecimalRandomAdjuster;
+import com.lanhai.util.DateTimeConverter;
+import com.lanhai.util.DateTimeUtils;
+import com.lanhai.util.TUtil;
+import com.xxl.job.core.context.XxlJobHelper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
/**
*
* 空气污染监测历史数据 服务实现类
@@ -13,6 +36,155 @@ import org.springframework.stereotype.Service;
*
*/
@Service
+@Slf4j
public class SurvHisdataAirServiceImpl extends ServiceImpl implements ISurvHisdataAirService {
+ @Lazy
+ @Autowired
+ private SurvTransdataAirServiceImpl airService;
+ @Autowired
+ @Lazy
+ private ISurvStationInfoService survStationInfoService;
+
+
+ public SurvTransdataAir genDataAuto(SurvDeviceDeploy deploy, DataExamineDetail config) {
+ if(deploy!=null && config!=null) {
+ if (config.getRules() != null && !config.getRules().isEmpty()) {
+ String deployCode = deploy.getDeployCode();
+ try {
+ LocalDateTime nowTime = LocalDateTime.now();
+ SurvTransdataAir newestData = airService.getOneByDeviceId(deploy.getId());
+ String orgId = null;
+ if (newestData != null) {
+ orgId = newestData.getId();
+ if (newestData.getDataDateTime() != null) {
+ log.error(newestData.getDataDateTime()+"====================时间检查=============="+nowTime);
+ long secs = DateTimeUtils.getSecondsDiff(newestData.getDataDateTime(), nowTime);
+ if (secs < config.getExamineGap()) {//间隔不足时不生成
+ log.warn("-------------空气设备:{}:{},土壤/水间隔为:{}秒,限制时间:{}秒,跳过--------------", deploy.getDeployDes(),deploy.getDeployCode(),secs,config.getExamineGap());
+ XxlJobHelper.log("--------------空气设备:{}:{},土壤/水间隔为:{}秒,,限制时间:{}秒,跳过---------------", deploy.getDeployDes(),deploy.getDeployCode(),secs,config.getExamineGap());
+ return null;
+ }
+ }
+ }
+
+ Map ruleMap = new HashMap<>();
+ for (DataExamineRule rule : config.getRules()) {
+ ruleMap.put(rule.getFields(), rule);
+ }
+ SurvHisdataAir saveEnt = new SurvHisdataAir();
+ if (newestData == null) {
+ newestData = new SurvTransdataAir();
+ SurvHisdataAir hisData = getRecentData(deployCode,config.getHistoryRange());
+ if(hisData!=null){ //第一逻辑,如果有最近的历史数据,则使用历史数据作为基准值
+ XxlJobHelper.log("=====空气设备:{}===查询到历史数据,使用历史数据作为基准值==========",deployCode);
+ BeanUtil.copyProperties(hisData,newestData);
+ saveEnt.setRuleType(IotConstants.RULE_HISTORY);
+ }else{//第二逻辑,使用预设的标准值
+ XxlJobHelper.log("=====空气设备:{}===使用预设标准值进行生成==========",deployCode);
+ for (String s : ruleMap.keySet()) {
+ TUtil.setFieldValue(newestData, s, ruleMap.get(s).getStandard());
+ }
+ saveEnt.setRuleType(IotConstants.RULE_PRE);
+ }
+ }else{
+ long dateGap = DateTimeUtils.getDaysDiff(newestData.getDataDateTime(), nowTime);
+ XxlJobHelper.log("======空气设备:{}-{}=====土壤/水数据间隔{}天===限制天数:{}====",deploy.getDeployDes(),deploy.getDeployCode(),dateGap,config.getHistoryRange());
+ if (dateGap > config.getHistoryRange()) {//最新数据已经超过时限范围,则使用预设数据
+ XxlJobHelper.log("xxxx使用预设数据xxxxx");
+ for (String s : ruleMap.keySet()) {
+ TUtil.setFieldValue(newestData, s, ruleMap.get(s).getStandard());
+ }
+ saveEnt.setRuleType(IotConstants.RULE_PRE);
+ }else{
+ XxlJobHelper.log("xxxx使用原数据规则类型:{}xxxxx",newestData.getRuleType());
+ saveEnt.setRuleType(newestData.getRuleType());
+ }
+
+ }
+
+
+
+ saveEnt.setDeployId(deploy.getId());
+ saveEnt.setCorpId(deploy.getId());
+ saveEnt.setTenantId(deploy.getTenantId());
+
+ saveEnt.setStationCode(deploy.getStationCode());
+ saveEnt.setDeviceName(deploy.getDeployDes());
+
+ if(StringUtils.isNotBlank(deploy.getStationCode())){
+ SurvStationInfo info = survStationInfoService.getByCode(deploy.getStationCode());
+ if(info!=null){
+ saveEnt.setStationName(info.getStationName());
+ saveEnt.setStationId(info.getId());
+ }
+ }
+
+
+ saveEnt.setDataDateTime(nowTime);
+ saveEnt.setDataGatherType(IotConstants.MARK_GENDATA);
+
+
+
+
+ saveEnt.setDeployCode(deploy.getDeployCode());
+ saveEnt.setTenantId(deploy.getTenantId());
+ saveEnt.setTransDate(nowTime);
+ saveEnt.setReVision(0);
+ saveEnt.setCreatedBy("taskGen");
+ saveEnt.setCreateTime(nowTime);
+ saveEnt.setUpdatedBy("taskGen");
+ saveEnt.setIsDel(0);
+ saveEnt.setUpdatedTime(nowTime);
+
+
+ //生成数据
+ for (String key : ruleMap.keySet()) {
+ DataExamineRule rule = ruleMap.get(key);
+ String vals = TUtil.getFieldValue(newestData, rule.getFields(), String.class);
+ if (StringUtils.isNotBlank(vals)) {
+ BigDecimal fixedRange = new BigDecimal(rule.getFactor());
+ int scale = rule.getScale();//小数位
+ String correctVal = BigDecimalRandomAdjuster.randomAdjustByFixedRange(new BigDecimal(vals), fixedRange, scale);
+ if(correctVal.contains("-") || "0".equals(correctVal)){//如果是负数或0用原来的值
+ correctVal = vals;
+ }
+ TUtil.setFieldValue(saveEnt, rule.getFields(), correctVal);
+ } else {
+ log.error("==========空气设备:{}指标:{}配置错误==============,跳过",deploy.getDeployCode(), rule.getFields());
+ XxlJobHelper.log("==========空气设备:{},编号:{}指标:{}配置错误==============,跳过", deploy.getDeployDes(), deploy.getDeployCode(), rule.getFields());
+ }
+ }
+ save(saveEnt);
+ BeanUtil.copyProperties(saveEnt, newestData);
+ newestData.setId(orgId);
+ newestData.setTenantId(deploy.getTenantId());
+ newestData.setDataDateTime(nowTime);
+ newestData.setRuleType(newestData.getRuleType());
+ newestData.setDataGatherType(newestData.getDataGatherType());
+ airService.saveOrUpdate(newestData);
+ return newestData;
+ }catch (Exception e) {
+ e.printStackTrace();
+ XxlJobHelper.log(e.getMessage());
+ log.error(e.getMessage());
+ }
+ }
+ }
+ return null;
+ }
+
+
+
+ private SurvHisdataAir getRecentData(String deployCode,Integer dayRange) {
+ LocalDateTime daysAgo = LocalDateTime.now().minusDays(dayRange);
+ SurvHisdataAir oldAir = lambdaQuery()
+ .eq(SurvHisdataAir::getDeployCode,deployCode)
+ .ge(SurvHisdataAir::getDataDateTime, DateTimeConverter.toDate(daysAgo))
+ .orderByDesc(SurvHisdataAir::getDataDateTime)
+ .last("limit 1")
+ .one();
+
+ return oldAir;
+ }
}
diff --git a/src/main/java/com/lanhai/service/Impl/SurvHisdataSoilServiceImpl.java b/src/main/java/com/lanhai/service/Impl/SurvHisdataSoilServiceImpl.java
index e8395ac..060f628 100644
--- a/src/main/java/com/lanhai/service/Impl/SurvHisdataSoilServiceImpl.java
+++ b/src/main/java/com/lanhai/service/Impl/SurvHisdataSoilServiceImpl.java
@@ -179,4 +179,4 @@ public class SurvHisdataSoilServiceImpl extends ServiceImpl