package com.dy.pipIrrModel.modelCalculate;
|
|
import com.dy.common.util.DateTime;
|
import com.dy.pipIrrGlobal.pojoMd.MdEt0;
|
import com.dy.pipIrrGlobal.voMd.VoCrops;
|
import com.dy.pipIrrGlobal.voPr.VoWeather;
|
import com.dy.pipIrrGlobal.voRm.VoWeatherMaxMinTmp;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.context.annotation.Scope;
|
import org.springframework.stereotype.Component;
|
|
import java.util.Date;
|
import java.util.List;
|
|
/**
|
* @Author: liurunyu
|
* @Date: 2025/8/18 16:26
|
* @Description
|
*/
|
@Slf4j
|
@Component(ModelCalculator.selfBeanName)
|
@Scope("prototype") //采用原型模式,每次请求新建一个实例对象
|
public class ModelCalculator {
|
public static final String selfBeanName = "modelCalculator";
|
|
private ModelCalculatorSv sv ;
|
|
@Autowired
|
public void setSv(ModelCalculatorSv sv){
|
this.sv = sv ;
|
}
|
|
public void execute(){
|
List<VoCrops> crops = this.sv.selectAllCrops() ;
|
if(crops != null && crops.size() > 0){
|
for (VoCrops crop : crops) {
|
if(crop.weatherId != null){
|
try{
|
VoWeather voWeather = this.sv.getWeather(crop.weatherId);
|
if(voWeather.lat != null){
|
this.executeOnCrop(crop, voWeather);
|
}
|
}catch (Exception e){
|
log.error("计算作物(id=" + crop.id + ")蒸腾数据时异常", e);
|
}
|
}
|
}
|
}
|
}
|
private void executeOnCrop(VoCrops vo, VoWeather voWeather) throws Exception{
|
String yesterday_ymd = DateTime.yesterday_yyyy_MM_dd(Integer.parseInt(DateTime.yyyy()), Integer.parseInt(DateTime.MM()), Integer.parseInt(DateTime.dd())) ; //昨天
|
Double factor = this.getCropsFactor(vo, yesterday_ymd) ;
|
if(factor != null){
|
//说明作物处于计算期(作物生长期)中
|
List<VoWeatherMaxMinTmp> tmps = this.sv.selectYesterdayMaxMinTemperature(vo.weatherId) ;
|
if(tmps != null && tmps.size() > 0){
|
VoWeatherMaxMinTmp voMmTmp = tmps.get(0);//只能有一条记录
|
Double et0 = this.calculateEt0(yesterday_ymd, vo, voWeather, voMmTmp, factor) ;//计算蒸腾数据
|
this.saveEt0(yesterday_ymd, vo, voWeather, voMmTmp, factor, et0) ;
|
}
|
}
|
}
|
private Double getCropsFactor(VoCrops vo, String yesterday) throws Exception{
|
Double factor = null ;
|
if(vo.stopped != null && vo.stopped != 1){
|
if(vo.startDt != null && vo.endDt != null){
|
String start = DateTime.yyyy() + "-" + vo.startDt ;
|
Long days = DateTime.daysBetweenyyyy_MM_dd(yesterday, start) ;
|
if(days >= 0){
|
if(vo.life4Start != null && vo.life4End != null){
|
if(days >= vo.life4Start && days <= vo.life4End){
|
factor = vo.life4Factor ;
|
}
|
if(days > vo.life4End){
|
factor = null ;
|
}
|
}
|
if(vo.life3Start != null && vo.life3End != null){
|
if(days >= vo.life3Start && days <= vo.life3End){
|
factor = vo.life3Factor ;
|
}
|
}
|
if(vo.life2Start != null && vo.life2End != null){
|
if(days >= vo.life2Start && days <= vo.life2End){
|
factor = vo.life2Factor ;
|
}
|
}
|
if(vo.life1Start != null && vo.life1End != null){
|
if(days >= vo.life1Start && days <= vo.life1End){
|
factor = vo.life1Factor ;
|
}
|
if(days < vo.life1Start){
|
factor = null ;
|
}
|
}
|
}else{
|
factor = null ;
|
}
|
}
|
}
|
return factor ;
|
}
|
|
private Double calculateEt0(String yesterday_ymd, VoCrops vo, VoWeather voWeather, VoWeatherMaxMinTmp voMmTmp, Double factor) throws Exception{
|
Long days = DateTime.daysBetweenyyyy_MM_dd(yesterday_ymd, DateTime.yyyy() + "-01-01");
|
Integer dayIndex = days.intValue() + 1 ;
|
|
Double fai = Hargreaves.rad(voWeather.lat);
|
|
Double sunMagnetismAngular = Hargreaves.sunMagnetismAngular(dayIndex);
|
|
Double sunEarthDistance = Hargreaves.sunEarthDistance(dayIndex);
|
|
Double sunTimeAngular = Hargreaves.sunTimeAngular(fai, sunMagnetismAngular);
|
|
Double zenithRadiation = Hargreaves.zenithRadiation(sunEarthDistance, sunTimeAngular, fai, sunMagnetismAngular);
|
|
Double et0 = Hargreaves.ET0(factor, voMmTmp.maxAirTemperature, voMmTmp.minAirTemperature, zenithRadiation);
|
return et0 ;
|
}
|
|
private void saveEt0(String yesterday_ymd, VoCrops vo, VoWeather voWeather, VoWeatherMaxMinTmp voMmTmp, Double factor, Double et0)throws Exception{
|
MdEt0 po = this.sv.selectByCropWeatherDt(vo.id, voWeather.id, yesterday_ymd);
|
if(po != null){
|
Date yesterday = DateTime.dateFrom_yyyy_MM_dd(yesterday_ymd) ;
|
this.sv.saveEt0(vo.id, voWeather.id, yesterday, voMmTmp.maxAirTemperature, voMmTmp.minAirTemperature, factor, et0) ;
|
}
|
}
|
}
|