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