1:预警结构修改

master
yangzhe123 2025-11-25 13:28:32 +08:00
parent c07f286215
commit 78e8d31dd7
6 changed files with 169 additions and 97 deletions

View File

@ -7,6 +7,7 @@ import com.gunshi.project.hsz.common.model.so.JcskSlBPageSo;
import com.gunshi.project.hsz.common.validate.markers.Insert; import com.gunshi.project.hsz.common.validate.markers.Insert;
import com.gunshi.project.hsz.common.validate.markers.Update; import com.gunshi.project.hsz.common.validate.markers.Update;
import com.gunshi.project.hsz.entity.so.HisWaterDataPageSo; import com.gunshi.project.hsz.entity.so.HisWaterDataPageSo;
import com.gunshi.project.hsz.entity.vo.HisWaterDataVo;
import com.gunshi.project.hsz.mapper.HisWaterDataMapper; import com.gunshi.project.hsz.mapper.HisWaterDataMapper;
import com.gunshi.project.hsz.model.HisWaterData; import com.gunshi.project.hsz.model.HisWaterData;
import com.gunshi.project.hsz.service.HisWaterDataService; import com.gunshi.project.hsz.service.HisWaterDataService;
@ -35,40 +36,37 @@ public class HisWaterDataController {
@Operation(summary = "分页") @Operation(summary = "分页")
@PostMapping("/page") @PostMapping("/page")
public R<Page<HisWaterData>> page(@RequestBody @Validated HisWaterDataPageSo page) { public R<Page<HisWaterDataVo>> page(@RequestBody @Validated HisWaterDataPageSo page) {
return R.ok(hisWaterDataService.pageQuery(page)); return R.ok(hisWaterDataService.pageQuery(page));
} }
@Operation(summary = "新增") @Operation(summary = "新增")
@PostMapping("/insert") @PostMapping("/insert")
public R<HisWaterData> insert(@Validated(Insert.class) @RequestBody HisWaterData dto) { public R<Boolean> insert(@Validated(Insert.class) @RequestBody HisWaterDataVo dto) {
boolean result = hisWaterDataService.saveData(dto); boolean result = hisWaterDataService.saveData(dto);
return R.ok(result ? dto : null); return R.ok(result);
} }
@Operation(summary = "修改") @Operation(summary = "修改")
@PostMapping("/update") @PostMapping("/update")
public R<HisWaterData> update(@Validated(Update.class) @RequestBody HisWaterData dto) { public R<Boolean> update(@Validated(Update.class) @RequestBody HisWaterDataVo dto) {
boolean result = hisWaterDataService.updateById(dto); boolean result = hisWaterDataService.updateData(dto);
return R.ok(result ? dto : null); return R.ok(result);
} }
@Operation(summary = "删除") @Operation(summary = "删除")
@GetMapping("/del/{id}") @GetMapping("/del/{id}")
public R<Boolean> del(@Schema(name = "id") @PathVariable("id") Serializable id) { public R<Boolean> del(@Schema(name = "id") @PathVariable("id") Serializable id) {
if (Objects.isNull(hisWaterDataService.getById(id))) { return R.ok(hisWaterDataService.removeData(id));
throw new IllegalArgumentException("当前数据不存在");
}
return R.ok(hisWaterDataService.removeById(id));
} }
@Operation(summary = "导出") @Operation(summary = "导出")
@PostMapping("/export") @PostMapping("/export")
public void export(@RequestBody @Validated HisWaterDataPageSo pageSo, HttpServletResponse response) { public void export(@RequestBody @Validated HisWaterDataPageSo pageSo, HttpServletResponse response) {
pageSo.getPageSo().setPageSize(99999); pageSo.getPageSo().setPageSize(99999);
Page<HisWaterData> hisWaterDataPage = hisWaterDataService.pageQuery(pageSo); Page<HisWaterDataVo> hisWaterDataPage = hisWaterDataService.pageQuery(pageSo);
List<HisWaterData> records = hisWaterDataPage.getRecords(); List<HisWaterDataVo> records = hisWaterDataPage.getRecords();
hisWaterDataService.export(records,response); hisWaterDataService.export(records,response);
} }
} }

View File

@ -2,8 +2,13 @@ package com.gunshi.project.hsz.entity.vo;
import com.gunshi.project.hsz.model.HisWaterData; import com.gunshi.project.hsz.model.HisWaterData;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data @Data
public class HisWaterDataVo { public class HisWaterDataVo extends HisWaterData{
private List<HisWaterData> list;
} }

View File

@ -1,9 +1,22 @@
package com.gunshi.project.hsz.mapper; package com.gunshi.project.hsz.mapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.gunshi.project.hsz.entity.so.HisWaterDataPageSo;
import com.gunshi.project.hsz.entity.vo.HisWaterDataVo;
import com.gunshi.project.hsz.model.HisWaterData; import com.gunshi.project.hsz.model.HisWaterData;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
@Mapper @Mapper
public interface HisWaterDataMapper extends BaseMapper<HisWaterData> { public interface HisWaterDataMapper extends BaseMapper<HisWaterData> {
@Select("""
select * from his_water_data where type = 1
order by year desc
""")
Page<HisWaterDataVo> queryPage(Page<Object> page, @Param("obj") HisWaterDataPageSo queryWrapper);
} }

View File

@ -20,11 +20,11 @@ public class HisWaterData {
@TableField("year") @TableField("year")
@Schema(description = "年度") @Schema(description = "年度")
private String year; private Integer year;
@TableField("month") @TableField("month")
@Schema(description = "月份") @Schema(description = "月份")
private String month; private Integer month;
@TableField("avg_water") @TableField("avg_water")
@Schema(description = "月份平均蓄水量") @Schema(description = "月份平均蓄水量")
@ -35,4 +35,11 @@ public class HisWaterData {
private BigDecimal totalWater; private BigDecimal totalWater;
/**
* 1 2
*/
@TableField(value="type")
@Schema(description="类型1年 2月")
private Integer type;
} }

View File

@ -1,128 +1,176 @@
package com.gunshi.project.hsz.service; package com.gunshi.project.hsz.service;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.WriteTable;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gunshi.project.hsz.entity.so.HisWaterDataPageSo; import com.gunshi.project.hsz.entity.so.HisWaterDataPageSo;
import com.gunshi.project.hsz.entity.vo.HisWaterDataVo;
import com.gunshi.project.hsz.mapper.HisWaterDataMapper; import com.gunshi.project.hsz.mapper.HisWaterDataMapper;
import com.gunshi.project.hsz.model.HisWaterData; import com.gunshi.project.hsz.model.HisWaterData;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Row; import org.springframework.beans.BeanUtils;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal; import java.io.IOException;
import java.io.Serializable;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Service @Service
@Slf4j @Slf4j
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public class HisWaterDataService extends ServiceImpl<HisWaterDataMapper, HisWaterData> { public class HisWaterDataService extends ServiceImpl<HisWaterDataMapper, HisWaterData> {
public Page<HisWaterData> pageQuery(HisWaterDataPageSo page) { public Page<HisWaterDataVo> pageQuery(HisWaterDataPageSo page) {
LambdaQueryWrapper<HisWaterData> queryWrapper = new LambdaQueryWrapper<>(); Page<HisWaterDataVo> hisWaterDataPage = this.baseMapper.queryPage(page.getPageSo().toPage(),page);
queryWrapper.last("order by year desc,month asc"); fillList(hisWaterDataPage);
Page<HisWaterData> hisWaterDataPage = this.baseMapper.selectPage(page.getPageSo().toPage(), queryWrapper);
List<HisWaterData> records = hisWaterDataPage.getRecords();
// 按年度分组
Map<String, List<HisWaterData>> groupedByYear = records.stream()
.collect(Collectors.groupingBy(HisWaterData::getYear));
// 遍历每个年度,计算并设置年度总蓄水量
for (Map.Entry<String, List<HisWaterData>> entry : groupedByYear.entrySet()) {
String year = entry.getKey();
List<HisWaterData> yearData = entry.getValue();
// 计算年度总蓄水量
BigDecimal totalWater = yearData.stream()
.map(HisWaterData::getAvgWater)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
// 为每个该年度的数据设置总蓄水量
for (HisWaterData data : yearData) {
data.setTotalWater(totalWater);
}
}
return hisWaterDataPage; return hisWaterDataPage;
} }
public boolean saveData(HisWaterData dto) { private void fillList(Page<HisWaterDataVo> ret) {
LambdaQueryWrapper<HisWaterData> queryWrapper = new LambdaQueryWrapper<>(); if (ret.getRecords() != null) {
queryWrapper.eq(HisWaterData::getYear,dto.getYear()); queryChild(ret.getRecords());
queryWrapper.eq(HisWaterData::getMonth,dto.getMonth());
HisWaterData hisWaterData = this.baseMapper.selectOne(queryWrapper);
if (hisWaterData != null) {
throw new IllegalArgumentException(dto.getYear() + "年-" + dto.getMonth() +"月,数据已存在,请勿重复添加");
} }
return this.baseMapper.insert(dto) > 0;
} }
public void export(List<HisWaterData> records, HttpServletResponse response) { private void queryChild(List<HisWaterDataVo> records) {
for (HisWaterDataVo record : records) {
LambdaQueryWrapper<HisWaterData> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(HisWaterData::getYear, record.getYear())
.eq(HisWaterData::getType,record.getType())
.orderByAsc(HisWaterData::getMonth);
record.setList(this.list(queryWrapper));
}
}
public boolean saveData(HisWaterDataVo dto) {
checkParam(dto);
HisWaterData hisWaterData = new HisWaterData();
BeanUtils.copyProperties(dto,hisWaterData);
List<HisWaterData> list = dto.getList();
list.add(hisWaterData);
boolean flag = saveBatch(list);
return flag;
}
private void checkParam(HisWaterDataVo dto) {
Long id = dto.getId();
LambdaQueryWrapper<HisWaterData> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(HisWaterData::getYear,dto.getYear())
.eq(HisWaterData::getType,1);
if(id != null){
queryWrapper.ne(HisWaterData::getId,id);
}
if(this.count(queryWrapper ) > 0){
throw new IllegalArgumentException("该年份已存在历史降雨资料");
}
Long len = dto.getList().stream().map(HisWaterData::getMonth).distinct().collect(Collectors.counting());
if(dto.getList().size() != len.intValue()){
throw new IllegalArgumentException("月份不可重复");
}
}
public boolean updateData(HisWaterDataVo dto) {
checkParam(dto);
HisWaterData hisWaterData = new HisWaterData();
BeanUtils.copyProperties(dto,hisWaterData);
updateById(hisWaterData);
deleteMonthData(dto.getYear());
List<HisWaterData> list = dto.getList();
return saveBatch(list);
}
private void deleteMonthData(Integer year) {
LambdaQueryWrapper<HisWaterData> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(HisWaterData::getYear,year)
.eq(HisWaterData::getType,2);
this.remove(queryWrapper);
}
public Boolean removeData(Serializable id) {
HisWaterData hisWaterData = this.getById(id);
deleteMonthData(hisWaterData.getYear());
return this.removeById(id);
}
public void export(List<HisWaterDataVo> records, HttpServletResponse response) {
try { try {
Workbook workbook = new XSSFWorkbook(); // 设置响应头
Sheet sheet = workbook.createSheet("蓄水量数据"); String fileName = URLEncoder.encode("历史蓄水量数据", "UTF-8").replaceAll("\\+", "%20");
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
int rowNum = 0; // 创建ExcelWriter
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 自动列宽
.build();
// 按年度分组 // 创建主工作表
Map<String, List<HisWaterData>> groupedByYear = records.stream() WriteSheet writeSheet = EasyExcel.writerSheet("历史蓄水量数据").build();
.collect(Collectors.groupingBy(HisWaterData::getYear));
// 遍历每个年度 // 当前行数据
for (Map.Entry<String, List<HisWaterData>> entry : groupedByYear.entrySet()) { List<List<Object>> dataList = new ArrayList<>();
String year = entry.getKey();
List<HisWaterData> yearData = entry.getValue();
// 计算年度总蓄水量 // 遍历每年的数据
BigDecimal totalWater = yearData.stream() for (HisWaterDataVo yearData : records) {
.map(HisWaterData::getAvgWater) // 添加年份标题行
.filter(Objects::nonNull) List<Object> yearRow = new ArrayList<>();
.reduce(BigDecimal.ZERO, BigDecimal::add); yearRow.add(yearData.getYear() + "年");
yearRow.add(""); // 第二列为空
dataList.add(yearRow);
// 写入年度和总蓄水量(每个值单独单元格) // 添加表头
Row yearRow = sheet.createRow(rowNum++); List<Object> headerRow = new ArrayList<>();
yearRow.createCell(0).setCellValue("年:"); headerRow.add("月份");
yearRow.createCell(1).setCellValue(year); headerRow.add("月份平均蓄水量");
yearRow.createCell(2).setCellValue("总蓄水量(万m³)"); dataList.add(headerRow);
yearRow.createCell(3).setCellValue(totalWater.toString());
// 写入月份数据 // 添加月份数据
for (HisWaterData data : yearData) { if (yearData.getList() != null) {
Row monthRow = sheet.createRow(rowNum++); for (HisWaterData monthData : yearData.getList()) {
monthRow.createCell(0).setCellValue("月份:"); List<Object> monthRow = new ArrayList<>();
monthRow.createCell(1).setCellValue(data.getMonth()); monthRow.add(monthData.getMonth() + "月");
monthRow.createCell(2).setCellValue("平均蓄水量(万m³)"); monthRow.add(monthData.getAvgWater());
if (data.getAvgWater() != null) { dataList.add(monthRow);
monthRow.createCell(3).setCellValue(data.getAvgWater().toString());
} else {
monthRow.createCell(3).setCellValue("");
} }
} }
// 年度之间空一行 // 添加年度总蓄水量行
rowNum++; List<Object> totalRow = new ArrayList<>();
totalRow.add("年度总蓄水量");
totalRow.add(yearData.getTotalWater());
dataList.add(totalRow);
// 添加空行分隔
dataList.add(new ArrayList<>());
dataList.add(new ArrayList<>());
} }
// 简单自适应列宽 // 创建表格并写入数据
for (int i = 0; i < 4; i++) { WriteTable writeTable = EasyExcel.writerTable()
sheet.autoSizeColumn(i); .needHead(false) // 不显示表头,因为我们手动添加了
} .build();
// 设置响应头 // 写入数据
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); excelWriter.write(dataList, writeSheet, writeTable);
response.setHeader("Content-Disposition", "attachment; filename=water_data.xlsx");
// 写入响应流 // 关闭流
workbook.write(response.getOutputStream()); excelWriter.finish();
workbook.close();
} catch (Exception e) { } catch (IOException e) {
throw new RuntimeException("导出Excel失败", e); throw new RuntimeException("导出Excel失败", e);
} }
} }

View File

@ -352,6 +352,7 @@ public class WarningRuleTask {
List<HisWaterData> hisWaterDataList = hisWaterDataService.lambdaQuery() List<HisWaterData> hisWaterDataList = hisWaterDataService.lambdaQuery()
.eq(HisWaterData::getYear, year) .eq(HisWaterData::getYear, year)
.eq(HisWaterData::getMonth, month) .eq(HisWaterData::getMonth, month)
.eq(HisWaterData::getType,2)
.list(); .list();
BigDecimal baseWaterStorage = BigDecimal.ZERO; BigDecimal baseWaterStorage = BigDecimal.ZERO;