1:预警结构修改
parent
c07f286215
commit
78e8d31dd7
|
|
@ -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.Update;
|
||||
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.model.HisWaterData;
|
||||
import com.gunshi.project.hsz.service.HisWaterDataService;
|
||||
|
|
@ -35,40 +36,37 @@ public class HisWaterDataController {
|
|||
|
||||
@Operation(summary = "分页")
|
||||
@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));
|
||||
}
|
||||
|
||||
|
||||
@Operation(summary = "新增")
|
||||
@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);
|
||||
return R.ok(result ? dto : null);
|
||||
return R.ok(result);
|
||||
}
|
||||
|
||||
@Operation(summary = "修改")
|
||||
@PostMapping("/update")
|
||||
public R<HisWaterData> update(@Validated(Update.class) @RequestBody HisWaterData dto) {
|
||||
boolean result = hisWaterDataService.updateById(dto);
|
||||
return R.ok(result ? dto : null);
|
||||
public R<Boolean> update(@Validated(Update.class) @RequestBody HisWaterDataVo dto) {
|
||||
boolean result = hisWaterDataService.updateData(dto);
|
||||
return R.ok(result);
|
||||
}
|
||||
|
||||
@Operation(summary = "删除")
|
||||
@GetMapping("/del/{id}")
|
||||
public R<Boolean> del(@Schema(name = "id") @PathVariable("id") Serializable id) {
|
||||
if (Objects.isNull(hisWaterDataService.getById(id))) {
|
||||
throw new IllegalArgumentException("当前数据不存在");
|
||||
}
|
||||
return R.ok(hisWaterDataService.removeById(id));
|
||||
return R.ok(hisWaterDataService.removeData(id));
|
||||
}
|
||||
|
||||
@Operation(summary = "导出")
|
||||
@PostMapping("/export")
|
||||
public void export(@RequestBody @Validated HisWaterDataPageSo pageSo, HttpServletResponse response) {
|
||||
pageSo.getPageSo().setPageSize(99999);
|
||||
Page<HisWaterData> hisWaterDataPage = hisWaterDataService.pageQuery(pageSo);
|
||||
List<HisWaterData> records = hisWaterDataPage.getRecords();
|
||||
Page<HisWaterDataVo> hisWaterDataPage = hisWaterDataService.pageQuery(pageSo);
|
||||
List<HisWaterDataVo> records = hisWaterDataPage.getRecords();
|
||||
hisWaterDataService.export(records,response);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,8 +2,13 @@ package com.gunshi.project.hsz.entity.vo;
|
|||
|
||||
import com.gunshi.project.hsz.model.HisWaterData;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
public class HisWaterDataVo {
|
||||
public class HisWaterDataVo extends HisWaterData{
|
||||
|
||||
private List<HisWaterData> list;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,22 @@
|
|||
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.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 org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.apache.ibatis.annotations.Select;
|
||||
|
||||
@Mapper
|
||||
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);
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,11 +20,11 @@ public class HisWaterData {
|
|||
|
||||
@TableField("year")
|
||||
@Schema(description = "年度")
|
||||
private String year;
|
||||
private Integer year;
|
||||
|
||||
@TableField("month")
|
||||
@Schema(description = "月份")
|
||||
private String month;
|
||||
private Integer month;
|
||||
|
||||
@TableField("avg_water")
|
||||
@Schema(description = "月份平均蓄水量")
|
||||
|
|
@ -35,4 +35,11 @@ public class HisWaterData {
|
|||
private BigDecimal totalWater;
|
||||
|
||||
|
||||
/**
|
||||
* 类型(1年 2月)
|
||||
*/
|
||||
@TableField(value="type")
|
||||
@Schema(description="类型(1年 2月)")
|
||||
private Integer type;
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,128 +1,176 @@
|
|||
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.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
|
||||
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.model.HisWaterData;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.poi.ss.usermodel.Row;
|
||||
import org.apache.poi.ss.usermodel.Sheet;
|
||||
import org.apache.poi.ss.usermodel.Workbook;
|
||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
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.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Service
|
||||
@Slf4j
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public class HisWaterDataService extends ServiceImpl<HisWaterDataMapper, HisWaterData> {
|
||||
public Page<HisWaterData> pageQuery(HisWaterDataPageSo page) {
|
||||
LambdaQueryWrapper<HisWaterData> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.last("order by year desc,month asc");
|
||||
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);
|
||||
}
|
||||
}
|
||||
public Page<HisWaterDataVo> pageQuery(HisWaterDataPageSo page) {
|
||||
Page<HisWaterDataVo> hisWaterDataPage = this.baseMapper.queryPage(page.getPageSo().toPage(),page);
|
||||
fillList(hisWaterDataPage);
|
||||
return hisWaterDataPage;
|
||||
}
|
||||
|
||||
public boolean saveData(HisWaterData dto) {
|
||||
private void fillList(Page<HisWaterDataVo> ret) {
|
||||
if (ret.getRecords() != null) {
|
||||
queryChild(ret.getRecords());
|
||||
}
|
||||
}
|
||||
|
||||
private void queryChild(List<HisWaterDataVo> records) {
|
||||
for (HisWaterDataVo record : records) {
|
||||
LambdaQueryWrapper<HisWaterData> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.eq(HisWaterData::getYear,dto.getYear());
|
||||
queryWrapper.eq(HisWaterData::getMonth,dto.getMonth());
|
||||
HisWaterData hisWaterData = this.baseMapper.selectOne(queryWrapper);
|
||||
if (hisWaterData != null) {
|
||||
throw new IllegalArgumentException(dto.getYear() + "年-" + dto.getMonth() +"月,数据已存在,请勿重复添加");
|
||||
queryWrapper.eq(HisWaterData::getYear, record.getYear())
|
||||
.eq(HisWaterData::getType,record.getType())
|
||||
.orderByAsc(HisWaterData::getMonth);
|
||||
record.setList(this.list(queryWrapper));
|
||||
}
|
||||
return this.baseMapper.insert(dto) > 0;
|
||||
}
|
||||
|
||||
public void export(List<HisWaterData> records, HttpServletResponse response) {
|
||||
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 {
|
||||
Workbook workbook = new XSSFWorkbook();
|
||||
Sheet sheet = workbook.createSheet("蓄水量数据");
|
||||
|
||||
int rowNum = 0;
|
||||
|
||||
// 按年度分组
|
||||
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);
|
||||
|
||||
// 写入年度和总蓄水量(每个值单独单元格)
|
||||
Row yearRow = sheet.createRow(rowNum++);
|
||||
yearRow.createCell(0).setCellValue("年:");
|
||||
yearRow.createCell(1).setCellValue(year);
|
||||
yearRow.createCell(2).setCellValue("总蓄水量(万m³):");
|
||||
yearRow.createCell(3).setCellValue(totalWater.toString());
|
||||
|
||||
// 写入月份数据
|
||||
for (HisWaterData data : yearData) {
|
||||
Row monthRow = sheet.createRow(rowNum++);
|
||||
monthRow.createCell(0).setCellValue("月份:");
|
||||
monthRow.createCell(1).setCellValue(data.getMonth());
|
||||
monthRow.createCell(2).setCellValue("平均蓄水量(万m³):");
|
||||
if (data.getAvgWater() != null) {
|
||||
monthRow.createCell(3).setCellValue(data.getAvgWater().toString());
|
||||
} else {
|
||||
monthRow.createCell(3).setCellValue("");
|
||||
}
|
||||
}
|
||||
|
||||
// 年度之间空一行
|
||||
rowNum++;
|
||||
}
|
||||
|
||||
// 简单自适应列宽
|
||||
for (int i = 0; i < 4; i++) {
|
||||
sheet.autoSizeColumn(i);
|
||||
}
|
||||
|
||||
// 设置响应头
|
||||
String fileName = URLEncoder.encode("历史蓄水量数据", "UTF-8").replaceAll("\\+", "%20");
|
||||
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
||||
response.setHeader("Content-Disposition", "attachment; filename=water_data.xlsx");
|
||||
response.setCharacterEncoding("utf-8");
|
||||
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
|
||||
|
||||
// 写入响应流
|
||||
workbook.write(response.getOutputStream());
|
||||
workbook.close();
|
||||
// 创建ExcelWriter
|
||||
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
|
||||
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 自动列宽
|
||||
.build();
|
||||
|
||||
} catch (Exception e) {
|
||||
// 创建主工作表
|
||||
WriteSheet writeSheet = EasyExcel.writerSheet("历史蓄水量数据").build();
|
||||
|
||||
// 当前行数据
|
||||
List<List<Object>> dataList = new ArrayList<>();
|
||||
|
||||
// 遍历每年的数据
|
||||
for (HisWaterDataVo yearData : records) {
|
||||
// 添加年份标题行
|
||||
List<Object> yearRow = new ArrayList<>();
|
||||
yearRow.add(yearData.getYear() + "年");
|
||||
yearRow.add(""); // 第二列为空
|
||||
dataList.add(yearRow);
|
||||
|
||||
// 添加表头
|
||||
List<Object> headerRow = new ArrayList<>();
|
||||
headerRow.add("月份");
|
||||
headerRow.add("月份平均蓄水量");
|
||||
dataList.add(headerRow);
|
||||
|
||||
// 添加月份数据
|
||||
if (yearData.getList() != null) {
|
||||
for (HisWaterData monthData : yearData.getList()) {
|
||||
List<Object> monthRow = new ArrayList<>();
|
||||
monthRow.add(monthData.getMonth() + "月");
|
||||
monthRow.add(monthData.getAvgWater());
|
||||
dataList.add(monthRow);
|
||||
}
|
||||
}
|
||||
|
||||
// 添加年度总蓄水量行
|
||||
List<Object> totalRow = new ArrayList<>();
|
||||
totalRow.add("年度总蓄水量");
|
||||
totalRow.add(yearData.getTotalWater());
|
||||
dataList.add(totalRow);
|
||||
|
||||
// 添加空行分隔
|
||||
dataList.add(new ArrayList<>());
|
||||
dataList.add(new ArrayList<>());
|
||||
}
|
||||
|
||||
// 创建表格并写入数据
|
||||
WriteTable writeTable = EasyExcel.writerTable()
|
||||
.needHead(false) // 不显示表头,因为我们手动添加了
|
||||
.build();
|
||||
|
||||
// 写入数据
|
||||
excelWriter.write(dataList, writeSheet, writeTable);
|
||||
|
||||
// 关闭流
|
||||
excelWriter.finish();
|
||||
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException("导出Excel失败", e);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -352,6 +352,7 @@ public class WarningRuleTask {
|
|||
List<HisWaterData> hisWaterDataList = hisWaterDataService.lambdaQuery()
|
||||
.eq(HisWaterData::getYear, year)
|
||||
.eq(HisWaterData::getMonth, month)
|
||||
.eq(HisWaterData::getType,2)
|
||||
.list();
|
||||
|
||||
BigDecimal baseWaterStorage = BigDecimal.ZERO;
|
||||
|
|
|
|||
Loading…
Reference in New Issue