1:回归方程精度修改

master
yangzhe123 2025-12-10 17:04:37 +08:00
parent a64b448365
commit 1c20338cbb
12 changed files with 288 additions and 142 deletions

View File

@ -57,4 +57,11 @@ public interface JcskSyBMapper extends BaseMapper<JcskSyB> {
</script> </script>
""") """)
String selectDvcdByStcdAndMpcd(@Param("stcd")String stcd,@Param("mpcd") String mpcd); String selectDvcdByStcdAndMpcd(@Param("stcd")String stcd,@Param("mpcd") String mpcd);
@Select("""
select DISTINCT(t1.dvcd) from jcsk_sy_b t1
""")
List<String> selectAllDvcd();
} }

View File

@ -2,6 +2,7 @@ package com.gunshi.project.hsz.common.model;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.gunshi.db.annotation.IgnoreAutoMapperAndDao; import com.gunshi.db.annotation.IgnoreAutoMapperAndDao;
import com.gunshi.project.hsz.common.model.vo.JcskByRProcessVo; import com.gunshi.project.hsz.common.model.vo.JcskByRProcessVo;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
@ -59,6 +60,7 @@ public class JcskByR {
* 2 * 2
*/ */
@TableField("ob_date") @TableField("ob_date")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime obDate; private LocalDateTime obDate;
/** /**

View File

@ -64,6 +64,7 @@ public class JcskGnssR {
* *
*/ */
@TableField("tm") @TableField("tm")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime tm; private LocalDateTime tm;
/** /**

View File

@ -48,6 +48,7 @@ public class JcskSyR {
* *
*/ */
@TableField("mstm") @TableField("mstm")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime mstm; private LocalDateTime mstm;
/** /**
@ -79,6 +80,7 @@ public class JcskSyR {
* *
*/ */
@TableField("update_tm") @TableField("update_tm")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime updateTm; private LocalDateTime updateTm;

View File

@ -28,6 +28,16 @@ public class DebugController {
@Autowired @Autowired
private WarningRuleTask warningRuleTask; private WarningRuleTask warningRuleTask;
@GetMapping("/syRegressionCaculate")
public String syRegressionCaculate(){
try {
jcskDataTask.calculate();
return "SUCCESS";
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@GetMapping("/warnRule") @GetMapping("/warnRule")
public String warningRuleTast(){ public String warningRuleTast(){
try { try {

View File

@ -65,7 +65,7 @@ public class ForecastDispatchPlan implements Serializable {
@Schema(description = "开始时间") @Schema(description = "开始时间")
@NotNull(message = "开始时间不能为空") @NotNull(message = "开始时间不能为空")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime startTime; private LocalDateTime startTm;
/** /**
* *
@ -74,7 +74,7 @@ public class ForecastDispatchPlan implements Serializable {
@Schema(description = "结束时间") @Schema(description = "结束时间")
@NotNull(message = "结束时间不能为空") @NotNull(message = "结束时间不能为空")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime endTime; private LocalDateTime endTm;
/** /**
* *

View File

@ -54,6 +54,7 @@ public class ForecastDispatchPlanService extends ServiceImpl<ForecastDispatchPla
queryWrapper.like(ForecastDispatchPlan::getPlanName, pageSo.getPlanName()); queryWrapper.like(ForecastDispatchPlan::getPlanName, pageSo.getPlanName());
} }
Page<ForecastDispatchPlan> forecastDispatchPlanPage = this.baseMapper.selectPage(pageSo.getPageSo().toPage(), queryWrapper); Page<ForecastDispatchPlan> forecastDispatchPlanPage = this.baseMapper.selectPage(pageSo.getPageSo().toPage(), queryWrapper);
queryWrapper.orderByDesc(ForecastDispatchPlan::getCreateTime);
for (ForecastDispatchPlan record : forecastDispatchPlanPage.getRecords()) { for (ForecastDispatchPlan record : forecastDispatchPlanPage.getRecords()) {
List<ForecastDispatchCommand> forecastDispatchCommandList = forecastDispatchCommandService.lambdaQuery().eq(ForecastDispatchCommand::getPlanId, record.getId()).list(); List<ForecastDispatchCommand> forecastDispatchCommandList = forecastDispatchCommandService.lambdaQuery().eq(ForecastDispatchCommand::getPlanId, record.getId()).list();
record.setForecastDispatchCommands(forecastDispatchCommandList); record.setForecastDispatchCommands(forecastDispatchCommandList);
@ -233,8 +234,8 @@ public class ForecastDispatchPlanService extends ServiceImpl<ForecastDispatchPla
// 基本信息数据 // 基本信息数据
Row dataRow = sheet.createRow(startRow++); Row dataRow = sheet.createRow(startRow++);
int colNum = 0; int colNum = 0;
dataRow.createCell(colNum++).setCellValue(formatDateTime(plan.getStartTime())); dataRow.createCell(colNum++).setCellValue(formatDateTime(plan.getStartTm()));
dataRow.createCell(colNum++).setCellValue(formatDateTime(plan.getEndTime())); dataRow.createCell(colNum++).setCellValue(formatDateTime(plan.getEndTm()));
dataRow.createCell(colNum++).setCellValue(formatDateTime(plan.getCreateTime())); dataRow.createCell(colNum++).setCellValue(formatDateTime(plan.getCreateTime()));
dataRow.createCell(colNum++).setCellValue(getStringValue(plan.getCreator())); dataRow.createCell(colNum++).setCellValue(getStringValue(plan.getCreator()));
dataRow.createCell(colNum).setCellValue(plan.getReservoirControlLevel() != null ? dataRow.createCell(colNum).setCellValue(plan.getReservoirControlLevel() != null ?

View File

@ -52,4 +52,8 @@ public class JcskSyBService extends ServiceImpl<JcskSyBMapper, JcskSyB> {
public String getDvcdByStcdAndMpcd(String stcd, String mpcd) { public String getDvcdByStcdAndMpcd(String stcd, String mpcd) {
return this.baseMapper.selectDvcdByStcdAndMpcd(stcd,mpcd); return this.baseMapper.selectDvcdByStcdAndMpcd(stcd,mpcd);
} }
public List<String> getAllDvcd() {
return this.baseMapper.selectAllDvcd();
}
} }

View File

@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gunshi.db.dto.DateTimeRangeSo; import com.gunshi.db.dto.DateTimeRangeSo;
import com.gunshi.project.hsz.common.model.JcskSyR; import com.gunshi.project.hsz.common.model.JcskSyR;
import com.gunshi.project.hsz.common.model.vo.*; import com.gunshi.project.hsz.common.model.vo.*;
import com.gunshi.project.hsz.common.util.LocalDateTimeConverter;
import com.gunshi.project.hsz.entity.dto.ArtificialJcskSyDeleteDto; import com.gunshi.project.hsz.entity.dto.ArtificialJcskSyDeleteDto;
import com.gunshi.project.hsz.common.model.so.JcskSyRPageSo; import com.gunshi.project.hsz.common.model.so.JcskSyRPageSo;
import com.gunshi.project.hsz.common.model.so.OsmoticDetailQuerySo; import com.gunshi.project.hsz.common.model.so.OsmoticDetailQuerySo;
@ -796,139 +797,228 @@ public class JcskSyRService extends ServiceImpl<JcskSyRMapper, JcskSyR> {
* @return * @return
*/ */
public ProjectSafeCalculateVo calculate(@NotNull ProjectSafeCalculateDto dto) { public ProjectSafeCalculateVo calculate(@NotNull ProjectSafeCalculateDto dto) {
LambdaQueryWrapper<JcskSyB> queryWrapper = new LambdaQueryWrapper<>(); /**
ProjectSafeCalculateVo res = new ProjectSafeCalculateVo(); * startTimeendTime
//根据dvcd查询stcd和mpcd *
queryWrapper.eq(JcskSyB::getDvcd, dto.getDvcd()); * */
JcskSyB jcskSyB = jcskSyBService.getBaseMapper().selectOne(queryWrapper); LambdaQueryWrapper<SyRegressionData> wrapper = new LambdaQueryWrapper<>();
String stcd = jcskSyB.getStcd(); wrapper.eq(SyRegressionData::getDvcd,dto.getDvcd());
String mpcd = jcskSyB.getMpcd(); wrapper.eq(SyRegressionData::getStartTime,dto.getDateTimeRangeSo().getStart());
//取得这个时间段得所有八点得数据 wrapper.eq(SyRegressionData::getEndTime,dto.getDateTimeRangeSo().getEnd());
LambdaQueryWrapper<JcskSyREightAm> eightAmLambdaQueryWrapper = new LambdaQueryWrapper<>(); wrapper.orderByAsc(SyRegressionData::getOrder);
eightAmLambdaQueryWrapper.eq(JcskSyREightAm::getStcd, stcd); List<SyRegressionData> queryData = syRegressionDataService.getBaseMapper().selectList(wrapper);
eightAmLambdaQueryWrapper.eq(JcskSyREightAm::getMpcd, mpcd); if(!queryData.isEmpty()){
eightAmLambdaQueryWrapper.ge(JcskSyREightAm::getMstm,dto.getDateTimeRangeSo().getStart()); LambdaQueryWrapper<JcskSyB> queryWrapper = new LambdaQueryWrapper<>();
eightAmLambdaQueryWrapper.le(JcskSyREightAm::getMstm,dto.getDateTimeRangeSo().getEnd()); ProjectSafeCalculateVo res = new ProjectSafeCalculateVo();
eightAmLambdaQueryWrapper.orderByAsc(JcskSyREightAm::getMstm); //根据dvcd查询stcd和mpcd
List<JcskSyREightAm> jcskSyREightAms = jcskSyREightAmMapper.selectList(eightAmLambdaQueryWrapper); queryWrapper.eq(JcskSyB::getDvcd, dto.getDvcd());
AttResBase attResBase = attResBaseService.list().get(0); JcskSyB jcskSyB = jcskSyBService.getBaseMapper().selectOne(queryWrapper);
OsmoticQuerySo querySo = new OsmoticQuerySo(); String stcd = jcskSyB.getStcd();
querySo.setDateTimeRangeSo(dto.getDateTimeRangeSo()); String mpcd = jcskSyB.getMpcd();
List<StRzVo> stRzVos = baseMapper.qeury8AmRz(querySo,attResBase.getStcd()); //取得这个时间段得所有八点得数据
Map<String, BigDecimal> rzMap = stRzVos.stream() LambdaQueryWrapper<JcskSyREightAm> eightAmLambdaQueryWrapper = new LambdaQueryWrapper<>();
.collect(Collectors.toMap( eightAmLambdaQueryWrapper.eq(JcskSyREightAm::getStcd, stcd);
StRzVo::getTm, // key: 时间 eightAmLambdaQueryWrapper.eq(JcskSyREightAm::getMpcd, mpcd);
StRzVo::getRz, // value: 水位 eightAmLambdaQueryWrapper.ge(JcskSyREightAm::getMstm,dto.getDateTimeRangeSo().getStart());
(existing, replacement) -> existing // 如果key冲突保留已存在的 eightAmLambdaQueryWrapper.le(JcskSyREightAm::getMstm,dto.getDateTimeRangeSo().getEnd());
)); eightAmLambdaQueryWrapper.orderByAsc(JcskSyREightAm::getMstm);
//组合成为 时间 库水位 管道水位的数据 List<JcskSyREightAm> jcskSyREightAms = jcskSyREightAmMapper.selectList(eightAmLambdaQueryWrapper);
List<OsmoticPressDetailVo> data = new ArrayList<>(); AttResBase attResBase = attResBaseService.list().get(0);
Iterator<JcskSyREightAm> iterator = jcskSyREightAms.iterator(); OsmoticQuerySo querySo = new OsmoticQuerySo();
while (iterator.hasNext()) { DateTimeRangeSo dateTimeRangeSo = new DateTimeRangeSo();
JcskSyREightAm eightAm = iterator.next(); dateTimeRangeSo.setStart(dto.getDateTimeRangeSo().getStart());
if(eightAm.getMstm() == null || eightAm.getSpprwl() == null){ dateTimeRangeSo.setEnd(dto.getDateTimeRangeSo().getEnd());
iterator.remove(); querySo.setDateTimeRangeSo(dateTimeRangeSo);
} List<StRzVo> stRzVos = baseMapper.qeury8AmRz(querySo,attResBase.getStcd());
OsmoticPressDetailVo detailVo = new OsmoticPressDetailVo(); Map<String, BigDecimal> rzMap = stRzVos.stream()
.collect(Collectors.toMap(
// 设置监测时间和监测值(管道水位) StRzVo::getTm, // key: 时间
String mstmStr = eightAm.getMstm().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); StRzVo::getRz, // value: 水位
detailVo.setTm(mstmStr); (existing, replacement) -> existing // 如果key冲突保留已存在的
detailVo.setValue(eightAm.getSpprwl()); ));
//组合成为 时间 库水位 管道水位的数据
// 查找对应的库水位 List<OsmoticPressDetailVo> data = new ArrayList<>();
BigDecimal rzValue = findClosestRzValue(rzMap, mstmStr); Iterator<JcskSyREightAm> iterator = jcskSyREightAms.iterator();
if(rzValue == null){ while (iterator.hasNext()) {
iterator.remove(); JcskSyREightAm eightAm = iterator.next();
} if(eightAm.getMstm() == null || eightAm.getSpprwl() == null){
detailVo.setRz(rzValue);
//获取数据清洗规则
SyDataCheckRule rule = syDataCheckRuleService.getByDvcd(dto.getDvcd());
if(rule != null && rule.getIsAvailable() == 1){
//校验这条数据是否符合规则
if(rzValue.compareTo(rule.getRz()) >=0){
//如果当前库水位大于等于设置库水位,则跳过这条数据
iterator.remove(); iterator.remove();
} }
if(eightAm.getSpprwl().compareTo(rule.getSyValue()) <=0){ OsmoticPressDetailVo detailVo = new OsmoticPressDetailVo();
//如果当前监测值小于等于设置值,则跳过这套数据
// 设置监测时间和监测值(管道水位)
String mstmStr = eightAm.getMstm().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
detailVo.setTm(mstmStr);
detailVo.setValue(eightAm.getSpprwl());
// 查找对应的库水位
BigDecimal rzValue = findClosestRzValue(rzMap, mstmStr);
if(rzValue == null){
iterator.remove(); iterator.remove();
} }
detailVo.setRz(rzValue);
//获取数据清洗规则
SyDataCheckRule rule = syDataCheckRuleService.getByDvcd(dto.getDvcd());
if(rule != null && rule.getIsAvailable() == 1){
//校验这条数据是否符合规则
if(rzValue.compareTo(rule.getRz()) >=0){
//如果当前库水位大于等于设置库水位,则跳过这条数据
iterator.remove();
}
if(eightAm.getSpprwl().compareTo(rule.getSyValue()) <=0){
//如果当前监测值小于等于设置值,则跳过这套数据
iterator.remove();
}
}
data.add(detailVo);
} }
data.add(detailVo); if(data.isEmpty()){
} return res;
if(data.isEmpty()){ }
res.setDatas(data);
res.setOne(queryData.get(0) != null?queryData.get(0).getRegressionEquation():null);
res.setTwo(queryData.get(1) != null?queryData.get(1).getRegressionEquation():null);
res.setThree(queryData.get(2) != null?queryData.get(2).getRegressionEquation():null);
res.setFour(queryData.get(3) != null?queryData.get(3).getRegressionEquation():null);
return res;
}else{
LambdaQueryWrapper<JcskSyB> queryWrapper = new LambdaQueryWrapper<>();
ProjectSafeCalculateVo res = new ProjectSafeCalculateVo();
//根据dvcd查询stcd和mpcd
queryWrapper.eq(JcskSyB::getDvcd, dto.getDvcd());
JcskSyB jcskSyB = jcskSyBService.getBaseMapper().selectOne(queryWrapper);
String stcd = jcskSyB.getStcd();
String mpcd = jcskSyB.getMpcd();
//取得这个时间段得所有八点得数据
LambdaQueryWrapper<JcskSyREightAm> eightAmLambdaQueryWrapper = new LambdaQueryWrapper<>();
eightAmLambdaQueryWrapper.eq(JcskSyREightAm::getStcd, stcd);
eightAmLambdaQueryWrapper.eq(JcskSyREightAm::getMpcd, mpcd);
eightAmLambdaQueryWrapper.ge(JcskSyREightAm::getMstm,dto.getDateTimeRangeSo().getStart());
eightAmLambdaQueryWrapper.le(JcskSyREightAm::getMstm,dto.getDateTimeRangeSo().getEnd());
eightAmLambdaQueryWrapper.orderByAsc(JcskSyREightAm::getMstm);
List<JcskSyREightAm> jcskSyREightAms = jcskSyREightAmMapper.selectList(eightAmLambdaQueryWrapper);
AttResBase attResBase = attResBaseService.list().get(0);
OsmoticQuerySo querySo = new OsmoticQuerySo();
DateTimeRangeSo dateTimeRangeSo = new DateTimeRangeSo();
dateTimeRangeSo.setStart(dto.getDateTimeRangeSo().getStart());
dateTimeRangeSo.setEnd(dto.getDateTimeRangeSo().getEnd());
querySo.setDateTimeRangeSo(dateTimeRangeSo);
List<StRzVo> stRzVos = baseMapper.qeury8AmRz(querySo,attResBase.getStcd());
Map<String, BigDecimal> rzMap = stRzVos.stream()
.collect(Collectors.toMap(
StRzVo::getTm, // key: 时间
StRzVo::getRz, // value: 水位
(existing, replacement) -> existing // 如果key冲突保留已存在的
));
//组合成为 时间 库水位 管道水位的数据
List<OsmoticPressDetailVo> data = new ArrayList<>();
Iterator<JcskSyREightAm> iterator = jcskSyREightAms.iterator();
while (iterator.hasNext()) {
JcskSyREightAm eightAm = iterator.next();
if(eightAm.getMstm() == null || eightAm.getSpprwl() == null){
iterator.remove();
}
OsmoticPressDetailVo detailVo = new OsmoticPressDetailVo();
// 设置监测时间和监测值(管道水位)
String mstmStr = eightAm.getMstm().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
detailVo.setTm(mstmStr);
detailVo.setValue(eightAm.getSpprwl());
// 查找对应的库水位
BigDecimal rzValue = findClosestRzValue(rzMap, mstmStr);
if(rzValue == null){
iterator.remove();
}
detailVo.setRz(rzValue);
//获取数据清洗规则
SyDataCheckRule rule = syDataCheckRuleService.getByDvcd(dto.getDvcd());
if(rule != null && rule.getIsAvailable() == 1){
//校验这条数据是否符合规则
if(rzValue.compareTo(rule.getRz()) >=0){
//如果当前库水位大于等于设置库水位,则跳过这条数据
iterator.remove();
}
if(eightAm.getSpprwl().compareTo(rule.getSyValue()) <=0){
//如果当前监测值小于等于设置值,则跳过这套数据
iterator.remove();
}
}
data.add(detailVo);
}
if(data.isEmpty()){
return res;
}
res.setDatas(data);
List<SyRegressionData> saves = new ArrayList<>();
RegressionEquation first = RegressionAnalysis.calculateLinear(data);
LocalDateTime createTime = LocalDateTime.now();
if(first != null){
LambdaQueryWrapper<SyRegressionData> query = new LambdaQueryWrapper<>();
query.eq(SyRegressionData::getDvcd, dto.getDvcd());
query.eq(SyRegressionData::getOrder,1);
syRegressionDataService.remove(query);
res.setOne(first.toString());
SyRegressionData syRegressionData = new SyRegressionData();
syRegressionData.setOrder(1);
syRegressionData.setRegressionEquation(first.toString());
syRegressionData.setDvcd(dto.getDvcd());
syRegressionData.setStartTime(dto.getDateTimeRangeSo().getStart());
syRegressionData.setEndTime(dto.getDateTimeRangeSo().getEnd());
syRegressionData.setCreateTime(createTime);
saves.add(syRegressionData);
}
RegressionEquation second = RegressionAnalysis.calculateQuadratic(data);
if(second != null){
LambdaQueryWrapper<SyRegressionData> query = new LambdaQueryWrapper<>();
query.eq(SyRegressionData::getDvcd, dto.getDvcd());
query.eq(SyRegressionData::getOrder,2);
syRegressionDataService.remove(query);
res.setTwo(second.toString());
SyRegressionData syRegressionData = new SyRegressionData();
syRegressionData.setOrder(2);
syRegressionData.setRegressionEquation(second.toString());
syRegressionData.setDvcd(dto.getDvcd());
syRegressionData.setStartTime(dto.getDateTimeRangeSo().getStart());
syRegressionData.setEndTime(dto.getDateTimeRangeSo().getEnd());
syRegressionData.setCreateTime(createTime);
saves.add(syRegressionData);
}
RegressionEquation three = RegressionAnalysis.calculateCubic(data);
if(three != null){
LambdaQueryWrapper<SyRegressionData> query = new LambdaQueryWrapper<>();
query.eq(SyRegressionData::getDvcd, dto.getDvcd());
query.eq(SyRegressionData::getOrder,3);
syRegressionDataService.remove(query);
res.setThree(three.toString());
SyRegressionData syRegressionData = new SyRegressionData();
syRegressionData.setOrder(3);
syRegressionData.setRegressionEquation(three.toString());
syRegressionData.setDvcd(dto.getDvcd());
syRegressionData.setStartTime(dto.getDateTimeRangeSo().getStart());
syRegressionData.setEndTime(dto.getDateTimeRangeSo().getEnd());
syRegressionData.setCreateTime(createTime);
saves.add(syRegressionData);
}
RegressionEquation four = RegressionAnalysis.calculateQuartic(data);
if(four != null){
LambdaQueryWrapper<SyRegressionData> query = new LambdaQueryWrapper<>();
query.eq(SyRegressionData::getDvcd, dto.getDvcd());
query.eq(SyRegressionData::getOrder,4);
syRegressionDataService.remove(query);
res.setFour(four.toString());
SyRegressionData syRegressionData = new SyRegressionData();
syRegressionData.setOrder(4);
syRegressionData.setRegressionEquation(four.toString());
syRegressionData.setDvcd(dto.getDvcd());
syRegressionData.setStartTime(dto.getDateTimeRangeSo().getStart());
syRegressionData.setEndTime(dto.getDateTimeRangeSo().getEnd());
syRegressionData.setCreateTime(createTime);
saves.add(syRegressionData);
}
syRegressionDataService.saveBatch(saves);
return res; return res;
} }
List<SyRegressionData> saves = new ArrayList<>();
RegressionEquation first = RegressionAnalysis.calculateLinear(data);
LocalDateTime createTime = LocalDateTime.now();
if(first != null){
LambdaQueryWrapper<SyRegressionData> query = new LambdaQueryWrapper<>();
query.eq(SyRegressionData::getDvcd, dto.getDvcd());
query.eq(SyRegressionData::getOrder,1);
syRegressionDataService.remove(query);
res.setOne(first.toString());
SyRegressionData syRegressionData = new SyRegressionData();
syRegressionData.setOrder(1);
syRegressionData.setRegressionEquation(first.toString());
syRegressionData.setDvcd(dto.getDvcd());
syRegressionData.setStartTime(dto.getDateTimeRangeSo().getStart());
syRegressionData.setEndTime(dto.getDateTimeRangeSo().getEnd());
syRegressionData.setCreateTime(createTime);
saves.add(syRegressionData);
}
RegressionEquation second = RegressionAnalysis.calculateQuadratic(data);
if(second != null){
LambdaQueryWrapper<SyRegressionData> query = new LambdaQueryWrapper<>();
query.eq(SyRegressionData::getDvcd, dto.getDvcd());
query.eq(SyRegressionData::getOrder,2);
syRegressionDataService.remove(query);
res.setTwo(second.toString());
SyRegressionData syRegressionData = new SyRegressionData();
syRegressionData.setOrder(2);
syRegressionData.setRegressionEquation(second.toString());
syRegressionData.setDvcd(dto.getDvcd());
syRegressionData.setStartTime(dto.getDateTimeRangeSo().getStart());
syRegressionData.setEndTime(dto.getDateTimeRangeSo().getEnd());
syRegressionData.setCreateTime(createTime);
saves.add(syRegressionData);
}
RegressionEquation three = RegressionAnalysis.calculateCubic(data);
if(three != null){
LambdaQueryWrapper<SyRegressionData> query = new LambdaQueryWrapper<>();
query.eq(SyRegressionData::getDvcd, dto.getDvcd());
query.eq(SyRegressionData::getOrder,3);
syRegressionDataService.remove(query);
res.setThree(three.toString());
SyRegressionData syRegressionData = new SyRegressionData();
syRegressionData.setOrder(3);
syRegressionData.setRegressionEquation(three.toString());
syRegressionData.setDvcd(dto.getDvcd());
syRegressionData.setStartTime(dto.getDateTimeRangeSo().getStart());
syRegressionData.setEndTime(dto.getDateTimeRangeSo().getEnd());
syRegressionData.setCreateTime(createTime);
saves.add(syRegressionData);
}
RegressionEquation four = RegressionAnalysis.calculateQuartic(data);
if(four != null){
LambdaQueryWrapper<SyRegressionData> query = new LambdaQueryWrapper<>();
query.eq(SyRegressionData::getDvcd, dto.getDvcd());
query.eq(SyRegressionData::getOrder,4);
syRegressionDataService.remove(query);
res.setFour(four.toString());
SyRegressionData syRegressionData = new SyRegressionData();
syRegressionData.setOrder(4);
syRegressionData.setRegressionEquation(four.toString());
syRegressionData.setDvcd(dto.getDvcd());
syRegressionData.setStartTime(dto.getDateTimeRangeSo().getStart());
syRegressionData.setEndTime(dto.getDateTimeRangeSo().getEnd());
syRegressionData.setCreateTime(createTime);
saves.add(syRegressionData);
}
res.setDatas(data);
syRegressionDataService.saveBatch(saves);
return res;
} }
/** /**

View File

@ -307,7 +307,7 @@ public class RiceRqWaterService extends ServiceImpl<RiceRqWaterMapper, RiceRqWat
*/ */
if (isMonthInKaPeriod(sortedMonth, kaStartTime, kaEndTime)) { if (isMonthInKaPeriod(sortedMonth, kaStartTime, kaEndTime)) {
int kaDaysInMonth = calculateKaDaysInMonth(kaStartTime, kaEndTime, sortedMonth); int kaDaysInMonth = calculateKaDaysInMonth(kaStartTime, kaEndTime, sortedMonth);
BigDecimal kaConsumption = kaQuota.divide(BigDecimal.valueOf(totalKaDays), 100, RoundingMode.HALF_UP) BigDecimal kaConsumption = kaQuota.divide(BigDecimal.valueOf(totalKaDays), 2, RoundingMode.HALF_UP)
.multiply(BigDecimal.valueOf(kaDaysInMonth)); .multiply(BigDecimal.valueOf(kaDaysInMonth));
irrigationVolume = irrigationVolume.add(kaConsumption); irrigationVolume = irrigationVolume.add(kaConsumption);
} }
@ -326,8 +326,8 @@ public class RiceRqWaterService extends ServiceImpl<RiceRqWaterMapper, RiceRqWat
// irrigationVolume = BigDecimal.ZERO; // irrigationVolume = BigDecimal.ZERO;
// } // }
// 保留1位小数 // 保留2位小数
irrigationVolume = irrigationVolume.setScale(2, RoundingMode.HALF_UP); irrigationVolume = irrigationVolume.setScale(2,RoundingMode.UP);
riceIrrigationUse.setIrrigationUse(irrigationVolume); riceIrrigationUse.setIrrigationUse(irrigationVolume);
res.add(riceIrrigationUse); res.add(riceIrrigationUse);
@ -369,7 +369,7 @@ public class RiceRqWaterService extends ServiceImpl<RiceRqWaterMapper, RiceRqWat
* /11*(ps * /11*(ps
*/ */
BigDecimal dailyConsumption = growPeriod.getWaterRqStage() BigDecimal dailyConsumption = growPeriod.getWaterRqStage()
.divide(BigDecimal.valueOf(growPeriod.getDays()), 10, RoundingMode.HALF_UP); .divide(BigDecimal.valueOf(growPeriod.getDays()), 2, RoundingMode.HALF_UP);
//再去乘当前阶段在当前月份的天数 //再去乘当前阶段在当前月份的天数
BigDecimal monthlyConsumption = dailyConsumption.multiply(BigDecimal.valueOf(daysInMonth)); BigDecimal monthlyConsumption = dailyConsumption.multiply(BigDecimal.valueOf(daysInMonth));
totalConsumption = totalConsumption.add(monthlyConsumption); totalConsumption = totalConsumption.add(monthlyConsumption);
@ -480,10 +480,10 @@ public class RiceRqWaterService extends ServiceImpl<RiceRqWaterMapper, RiceRqWat
BigDecimal irrigationUse = riceIrrigationUse.getIrrigationUse(); BigDecimal irrigationUse = riceIrrigationUse.getIrrigationUse();
// 计算公式2/3 * irrigationUse * sArea / 10000 // 计算公式2/3 * irrigationUse * sArea / 10000
BigDecimal value = new BigDecimal("2") BigDecimal value = new BigDecimal("2")
.divide(new BigDecimal("3"), 10, RoundingMode.HALF_UP) // 2/3保留10位小数 .divide(new BigDecimal("3"), 9, RoundingMode.HALF_UP) // 2/3保留10位小数
.multiply(irrigationUse) .multiply(irrigationUse)
.multiply(sArea) .multiply(sArea)
.divide(new BigDecimal("10000"), 2, RoundingMode.HALF_UP); // 除以10000保留2位小数 .divide(new BigDecimal("10000")); // 除以10000保留2位小数
entity.setIrrigationUse(value); entity.setIrrigationUse(value);
res.add(entity); res.add(entity);
@ -524,7 +524,7 @@ public class RiceRqWaterService extends ServiceImpl<RiceRqWaterMapper, RiceRqWat
LocalDateTime startTime = riceWaterKi.getStartTime(); LocalDateTime startTime = riceWaterKi.getStartTime();
LocalDateTime endTime = riceWaterKi.getEndTime(); LocalDateTime endTime = riceWaterKi.getEndTime();
BigDecimal irrigationUse = calculateIrrigationUse(riceWaterKi, rainfallList, startTime, endTime); BigDecimal irrigationUse = calculateIrrigationUse(riceWaterKi, rainfallList, startTime, endTime);
data.setIrrigationUse(irrigationUse.setScale(2,RoundingMode.UP)); data.setIrrigationUse(irrigationUse.setScale(2,RoundingMode.HALF_UP));
res.add(data); res.add(data);
} }
} }
@ -533,10 +533,10 @@ public class RiceRqWaterService extends ServiceImpl<RiceRqWaterMapper, RiceRqWat
BigDecimal irrigationUse = re.getIrrigationUse(); BigDecimal irrigationUse = re.getIrrigationUse();
BigDecimal value = new BigDecimal("2") BigDecimal value = new BigDecimal("2")
.divide(new BigDecimal("3"), 10, RoundingMode.HALF_UP) // 2/3保留10位小数 .divide(new BigDecimal("3"), 9, RoundingMode.HALF_UP) // 2/3保留10位小数
.multiply(irrigationUse) .multiply(irrigationUse)
.multiply(sArea) .multiply(sArea)
.divide(new BigDecimal("10000"), 2, RoundingMode.HALF_UP); // 除以10000保留2位小数 .divide(new BigDecimal("10000")); // 除以10000保留2位小数
re.setIrrigationUse(value); re.setIrrigationUse(value);
} }
return res; return res;
@ -605,7 +605,7 @@ public class RiceRqWaterService extends ServiceImpl<RiceRqWaterMapper, RiceRqWat
// 按实际使用天数比例计算有效降雨量 // 按实际使用天数比例计算有效降雨量
return originalRainfall return originalRainfall
.multiply(BigDecimal.valueOf(daysInMonth)) .multiply(BigDecimal.valueOf(daysInMonth))
.divide(BigDecimal.valueOf(totalDaysInMonth), 10, RoundingMode.HALF_UP); .divide(BigDecimal.valueOf(totalDaysInMonth), 2, RoundingMode.HALF_UP);
} }
return BigDecimal.ZERO; return BigDecimal.ZERO;
@ -622,6 +622,7 @@ public class RiceRqWaterService extends ServiceImpl<RiceRqWaterMapper, RiceRqWat
BigDecimal monthTotal = BigDecimal.ZERO; BigDecimal monthTotal = BigDecimal.ZERO;
for (RiceWaterForecastMonth riceWaterForecastMonth : riceWaterForecastMonths) { for (RiceWaterForecastMonth riceWaterForecastMonth : riceWaterForecastMonths) {
monthTotal = monthTotal.add(riceWaterForecastMonth.getIrrigationUse()); monthTotal = monthTotal.add(riceWaterForecastMonth.getIrrigationUse());
// riceWaterForecastMonth.setIrrigationUse(riceWaterForecastMonth.getIrrigationUse().setScale(2,RoundingMode.HALF_UP));
} }
riceGrowConfig.setIrrigationUse(monthTotal); riceGrowConfig.setIrrigationUse(monthTotal);
//计算灌区水稻用水量-按周期 //计算灌区水稻用水量-按周期
@ -629,9 +630,10 @@ public class RiceRqWaterService extends ServiceImpl<RiceRqWaterMapper, RiceRqWat
BigDecimal cycleTotal = BigDecimal.ZERO; BigDecimal cycleTotal = BigDecimal.ZERO;
for (RiceWaterForecastCycle riceWaterForecastCycle : riceWaterForecastCycles) { for (RiceWaterForecastCycle riceWaterForecastCycle : riceWaterForecastCycles) {
cycleTotal = cycleTotal.add(riceWaterForecastCycle.getIrrigationUse()); cycleTotal = cycleTotal.add(riceWaterForecastCycle.getIrrigationUse());
// riceWaterForecastCycle.setIrrigationUse(riceWaterForecastCycle.getIrrigationUse().setScale(2,RoundingMode.HALF_UP));
} }
vo.setIrrigationMonthTotalUse(monthTotal); vo.setIrrigationMonthTotalUse(monthTotal.setScale(2,RoundingMode.HALF_UP));
vo.setIrrigationCycleTotalUse(cycleTotal); vo.setIrrigationCycleTotalUse(cycleTotal.setScale(2,RoundingMode.HALF_UP));
vo.setRiceWaterKis(riceWaterKis); vo.setRiceWaterKis(riceWaterKis);
vo.setRiceWaterForecastMonths(riceWaterForecastMonths); vo.setRiceWaterForecastMonths(riceWaterForecastMonths);
vo.setRiceWaterForecastCycles(riceWaterForecastCycles); vo.setRiceWaterForecastCycles(riceWaterForecastCycles);

View File

@ -325,6 +325,7 @@ public class RiceSupportBalanceService extends ServiceImpl<RiceSupportBalanceMap
if(!StringUtils.isBlank(pageSo.getIcplanName())){ if(!StringUtils.isBlank(pageSo.getIcplanName())){
queryWrapper.like(IcWaterForecast::getPlanName, pageSo.getIcplanName()); queryWrapper.like(IcWaterForecast::getPlanName, pageSo.getIcplanName());
} }
queryWrapper.orderByDesc(IcWaterForecast::getCreateTime);
Page<IcWaterForecast> icWaterForecastPage = icWaterForecastService.getBaseMapper().selectPage(pageSo.getPageSo().toPage(), queryWrapper); Page<IcWaterForecast> icWaterForecastPage = icWaterForecastService.getBaseMapper().selectPage(pageSo.getPageSo().toPage(), queryWrapper);
for (IcWaterForecast record : icWaterForecastPage.getRecords()) { for (IcWaterForecast record : icWaterForecastPage.getRecords()) {
List<IcWaterForecastDetail> icWaterForecastDetails = icWaterForecastDetailService.listByForecastId(record.getId()); List<IcWaterForecastDetail> icWaterForecastDetails = icWaterForecastDetailService.listByForecastId(record.getId());
@ -340,6 +341,7 @@ public class RiceSupportBalanceService extends ServiceImpl<RiceSupportBalanceMap
queryWrapper.like(RiceRqWater::getPlanName, pageSo.getRcplanName()); queryWrapper.like(RiceRqWater::getPlanName, pageSo.getRcplanName());
} }
queryWrapper.in(RiceRqWater::getYear, yearByRangeDate); queryWrapper.in(RiceRqWater::getYear, yearByRangeDate);
queryWrapper.orderByDesc(RiceRqWater::getCreateTime);
Page<RiceRqWater> riceRqWaterPage = riceRqWaterService.getBaseMapper().selectPage(pageSo.getPageSo().toPage(), queryWrapper); Page<RiceRqWater> riceRqWaterPage = riceRqWaterService.getBaseMapper().selectPage(pageSo.getPageSo().toPage(), queryWrapper);
List<RiceRqWater> records = riceRqWaterPage.getRecords(); List<RiceRqWater> records = riceRqWaterPage.getRecords();
for (RiceRqWater record : records) { for (RiceRqWater record : records) {

View File

@ -2,10 +2,14 @@ package com.gunshi.project.hsz.timetask;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.gunshi.core.result.R;
import com.gunshi.db.dto.DateTimeRangeSo; import com.gunshi.db.dto.DateTimeRangeSo;
import com.gunshi.project.hsz.common.model.*; import com.gunshi.project.hsz.common.model.*;
import com.gunshi.project.hsz.common.model.so.OsmoticQuerySo; import com.gunshi.project.hsz.common.model.so.OsmoticQuerySo;
import com.gunshi.project.hsz.common.model.vo.OsmoticShiftValueVo2; import com.gunshi.project.hsz.common.model.vo.OsmoticShiftValueVo2;
import com.gunshi.project.hsz.common.util.LocalDateTimeConverter;
import com.gunshi.project.hsz.entity.dto.ProjectSafeCalculateDto;
import com.gunshi.project.hsz.entity.vo.ProjectSafeCalculateVo;
import com.gunshi.project.hsz.mapper.JcskGnssREightAmMapper; import com.gunshi.project.hsz.mapper.JcskGnssREightAmMapper;
import com.gunshi.project.hsz.common.mapper.JcskSlBMapper; import com.gunshi.project.hsz.common.mapper.JcskSlBMapper;
import com.gunshi.project.hsz.mapper.JcskSlREightAmMapper; import com.gunshi.project.hsz.mapper.JcskSlREightAmMapper;
@ -14,6 +18,7 @@ import com.gunshi.project.hsz.model.*;
import com.gunshi.project.hsz.service.*; import com.gunshi.project.hsz.service.*;
import com.gunshi.project.hsz.util.DateTransforUtil; import com.gunshi.project.hsz.util.DateTransforUtil;
import com.gunshi.project.hsz.util.DateUtil; import com.gunshi.project.hsz.util.DateUtil;
import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -22,6 +27,8 @@ import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -78,6 +85,24 @@ public class JcskDataTask {
public static final Integer GNSS = 3; public static final Integer GNSS = 3;
// @Scheduled(cron = "0 30 8 * * ?")
@Async
public void calculate(){
List<String> dvcds = jcskSyBService.getAllDvcd();
for (String dvcd : dvcds) {
ProjectSafeCalculateDto dto = new ProjectSafeCalculateDto();
LocalDateTime now = LocalDateTime.now().withHour(23).withMinute(59).withSecond(59).withNano(0);
LocalDateTime lastYear = now.minusYears(1);
lastYear = lastYear.plusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
DateTimeRangeSo dateTimeRangeSo = new DateTimeRangeSo();
dateTimeRangeSo.setStart(LocalDateTimeConverter.toDate(lastYear));
dateTimeRangeSo.setEnd(LocalDateTimeConverter.toDate(now));
dto.setDateTimeRangeSo(dateTimeRangeSo);
dto.setDvcd(dvcd);
ProjectSafeCalculateVo ans = jcskSyRService.calculate(dto);
}
}
// /** // /**
// * 每5分钟扫描渗流。渗压、位移表 生成预警 // * 每5分钟扫描渗流。渗压、位移表 生成预警