package com.gunshi.project.ss.service; import cn.hutool.poi.excel.ExcelWriter; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gunshi.db.dto.DateTimeRangeSo; import com.gunshi.project.ss.common.model.vo.*; import com.gunshi.project.ss.entity.dto.ArtificialJcskGnssDeleteDto; import com.gunshi.project.ss.common.model.so.JcskGnssRPageSo; import com.gunshi.project.ss.common.model.so.OsmoticDetailQuerySo; import com.gunshi.project.ss.common.model.so.OsmoticQuerySo; import com.gunshi.project.ss.entity.vo.*; import com.gunshi.project.ss.mapper.AttResBaseMapper; import com.gunshi.project.ss.common.mapper.JcskGnssBMapper; import com.gunshi.project.ss.common.mapper.JcskGnssRMapper; import com.gunshi.project.ss.common.mapper.JcskSyRMapper; import com.gunshi.project.ss.common.model.JcskGnssR; import com.gunshi.project.ss.util.DataHandleUtil; import com.gunshi.project.ss.util.DateUtil; import com.gunshi.project.ss.util.ExcelUtil; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; @Service @Slf4j @Transactional(rollbackFor = Exception.class) public class JcskGnssRService extends ServiceImpl { @Resource private AttResBaseMapper attResBaseMapper; @Autowired private JcskSyRMapper jcskSyRMapper; @Autowired private JcskGnssBMapper jcskGnssBMapper; private static final String X_PREFIX = "/E"; private static final String Y_PREFIX = "/N"; private static final String H_PREFIX = "/U"; public Page pageQuery(JcskGnssRPageSo page) { Page res = this.baseMapper.pageQuery(page.getPageSo().toPage(), page); return res; } public String getStcd() { List attResBaseVos = attResBaseMapper.queryList(); AttResBaseVo attResBaseVo = attResBaseVos.get(0); return attResBaseVo == null ? "":attResBaseVo.getStcd(); } public List listValue() { List list = baseMapper.listValue(); list.stream().forEach(o ->{ o.setStationCode(o.getCd()); }); if(CollectionUtils.isEmpty(list)){ return list; } OsmoticQuerySo so = new OsmoticQuerySo(); List stationCodes = list.stream().map(JcskGnessListVo::getCd).collect(Collectors.toList()); String maxTm = list.stream().filter(o->o.getTm() != null).max(Comparator.comparing(JcskGnessListVo::getTm)).get().getTm(); String minTm = list.stream().filter(o->o.getTm() != null).min(Comparator.comparing(JcskGnessListVo::getTm)).get().getTm(); so.setStationCodes(stationCodes); DateTimeRangeSo dateTimeRangeSo = new DateTimeRangeSo(); dateTimeRangeSo.setStart(DateUtil.convertStringToDate(minTm)); dateTimeRangeSo.setEnd(DateUtil.convertStringToDate(maxTm)); so.setDateTimeRangeSo(dateTimeRangeSo); List warnList = baseMapper.queryWarn(so); list.stream().map(o->{ if(o.getTm() != null && DateUtil.hoursBetweenDate(DateUtil.convertStringToDate(o.getTm()), new Date()) > 48){ o.setFlag(1); } Boolean a = warnList.stream().filter(t->t.getCd().equals(o.getCd()) && t.getTm().equals(o.getTm()) && t.getDirection().toUpperCase().equals("X")).findAny().isPresent(); if(a){ o.setXStatus(1); } Boolean b = warnList.stream().filter(t->t.getCd().equals(o.getCd()) && t.getTm().equals(o.getTm()) && t.getDirection().toUpperCase().equals("Y")).findAny().isPresent(); if(b){ o.setYStatus(1); } Boolean c = warnList.stream().filter(t->t.getCd().equals(o.getCd()) && t.getTm().equals(o.getTm()) && t.getDirection().toUpperCase().equals("H")).findAny().isPresent(); if(c){ o.setHStatus(1); } return o; }).collect(Collectors.toList()); return list; } public List yearStat(OsmoticQuerySo osmoticQuerySo) { List resList = new ArrayList<>(); commonQueryHandle(osmoticQuerySo); //查询位移监测记录 List valueList = baseMapper.queryReorganizeValue(osmoticQuerySo); List dateList = DateUtil.getDatesBetween(osmoticQuerySo.getDateTimeRangeSo().getStart(), osmoticQuerySo.getDateTimeRangeSo().getEnd(), false); //数据处理 for(String str : dateList){ OsmoticShiftVo2 vo = new OsmoticShiftVo2(); vo.setTm(str); // 筛选出该日期8点的数据 List collect = valueList.stream() .filter(o -> { if (o.getTm() != null && o.getTm().startsWith(str)) { // 提取时间部分,检查是否为08:00:00 String timePart = o.getTm().substring(11, 13); // 获取 HH:mm:ss 部分 return "08".equals(timePart); } return false; }) .peek(o->o.setTm(str)) .collect(Collectors.toList()); vo.setList(collect); resList.add(vo); } return resList; } public List rangeStat(OsmoticQuerySo osmoticQuerySo) { List resList = new ArrayList<>(); //查询位移监测记录 List valueList = baseMapper.queryReorganizeValue(osmoticQuerySo); List dateList = DateUtil.getDatesBetween(osmoticQuerySo.getDateTimeRangeSo().getStart(), osmoticQuerySo.getDateTimeRangeSo().getEnd(), false); //数据处理 for(String str : dateList){ OsmoticShiftVo2 vo = new OsmoticShiftVo2(); vo.setTm(str); // 筛选出该日期8点的数据 List collect = valueList.stream() .filter(o -> { if (o.getTm() != null && o.getTm().startsWith(str)) { // 提取时间部分,检查是否为08:00:00 String timePart = o.getTm().substring(11, 13); // 获取 HH:mm:ss 部分 return "08".equals(timePart); } return false; }) .peek(o->o.setTm(str)) .collect(Collectors.toList()); vo.setList(collect); resList.add(vo); } return resList; } // 新增:生成指定年份的所有日期(确保只包含当年日期) private List generateYearDates(Integer year) { List dates = new ArrayList<>(); LocalDate start = LocalDate.of(year, 1, 1); LocalDate end = LocalDate.of(year, 12, 31); LocalDate current = start; while (!current.isAfter(end)) { dates.add(current.toString()); // 格式为yyyy-MM-dd current = current.plusDays(1); } return dates; } private OsmoticQuerySo commonQueryHandle(OsmoticQuerySo osmoticQuerySo){ String year = osmoticQuerySo.getYear(); try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date start = sdf.parse(year + "-01-01 00:00:00"); Date end = sdf.parse(year + "-12-31 23:59:59"); // 建议使用 23:59:59 DateTimeRangeSo so = new DateTimeRangeSo(); so.setStart(start); so.setEnd(end); osmoticQuerySo.setDateTimeRangeSo(so); return osmoticQuerySo; } catch (Exception e) { throw new IllegalArgumentException("日期格式错误: " + year, e); } } public List yearStatValue(OsmoticQuerySo osmoticQuerySo) { // 定义时间格式化器 List resList = new ArrayList<>(); try { commonQueryHandle(osmoticQuerySo); //查询位移监测记录 List valueList = baseMapper.queryValue(osmoticQuerySo); //按测站分组 Map> map = valueList.stream().collect(Collectors.groupingBy(OsmoticShiftValueVo2::getCd)); map.entrySet().forEach(o->{ String key = o.getKey(); List value = o.getValue(); OsmoticChartVo2 xVo = new OsmoticChartVo2(); OsmoticShiftValueVo2 xMax = value.stream().max(Comparator.comparing(OsmoticShiftValueVo2::getDe)).get(); OsmoticShiftValueVo2 xMin = value.stream().min(Comparator.comparing(OsmoticShiftValueVo2::getDe)).get(); xVo.setCd(key + X_PREFIX); xVo.setMaxValue(xMax.getDe()); xVo.setMaxTm(xMax.getTm()); xVo.setMinValue(xMin.getDe()); xVo.setMinTm(xMin.getTm()); xVo.setDiff(xMax.getDe().subtract(xMin.getDe())); resList.add(xVo); OsmoticChartVo2 yVo = new OsmoticChartVo2(); OsmoticShiftValueVo2 yMax = value.stream().max(Comparator.comparing(OsmoticShiftValueVo2::getDn)).get(); OsmoticShiftValueVo2 yMin = value.stream().min(Comparator.comparing(OsmoticShiftValueVo2::getDn)).get(); yVo.setCd(key + Y_PREFIX); yVo.setMaxValue(yMax.getDn()); yVo.setMaxTm(yMax.getTm()); yVo.setMinValue(yMin.getDn()); yVo.setMinTm(yMin.getTm()); yVo.setDiff(yMax.getDn().subtract(yMin.getDn())); resList.add(yVo); OsmoticChartVo2 hVo = new OsmoticChartVo2(); OsmoticShiftValueVo2 hMax = value.stream().max(Comparator.comparing(OsmoticShiftValueVo2::getDu)).get(); OsmoticShiftValueVo2 hMin = value.stream().min(Comparator.comparing(OsmoticShiftValueVo2::getDu)).get(); hVo.setCd(key + H_PREFIX); hVo.setMaxValue(hMax.getDu()); hVo.setMaxTm(hMax.getTm()); hVo.setMinValue(hMin.getDu()); hVo.setMinTm(hMin.getTm()); hVo.setDiff(hMax.getDu().subtract(hMin.getDu())); resList.add(hVo); }); } catch (Exception e) { log.info("year/state/value报错"); e.printStackTrace(); throw new IllegalArgumentException("报错"); } return resList; } public List rangeStatValue(OsmoticQuerySo osmoticQuerySo) { // 定义时间格式化器 List resList = new ArrayList<>(); try { //查询位移监测记录 List valueList = baseMapper.queryValue(osmoticQuerySo); //按测站分组 Map> map = valueList.stream().collect(Collectors.groupingBy(OsmoticShiftValueVo2::getCd)); map.entrySet().forEach(o->{ String key = o.getKey(); List value = o.getValue(); OsmoticChartVo2 xVo = new OsmoticChartVo2(); OsmoticShiftValueVo2 xMax = value.stream().max(Comparator.comparing(OsmoticShiftValueVo2::getDe)).get(); OsmoticShiftValueVo2 xMin = value.stream().min(Comparator.comparing(OsmoticShiftValueVo2::getDe)).get(); xVo.setCd(key + X_PREFIX); xVo.setMaxValue(xMax.getDe()); xVo.setMaxTm(xMax.getTm()); xVo.setMinValue(xMin.getDe()); xVo.setMinTm(xMin.getTm()); xVo.setDiff(xMax.getDe().subtract(xMin.getDe())); resList.add(xVo); OsmoticChartVo2 yVo = new OsmoticChartVo2(); OsmoticShiftValueVo2 yMax = value.stream().max(Comparator.comparing(OsmoticShiftValueVo2::getDn)).get(); OsmoticShiftValueVo2 yMin = value.stream().min(Comparator.comparing(OsmoticShiftValueVo2::getDn)).get(); yVo.setCd(key + Y_PREFIX); yVo.setMaxValue(yMax.getDn()); yVo.setMaxTm(yMax.getTm()); yVo.setMinValue(yMin.getDn()); yVo.setMinTm(yMin.getTm()); yVo.setDiff(yMax.getDn().subtract(yMin.getDn())); resList.add(yVo); OsmoticChartVo2 hVo = new OsmoticChartVo2(); OsmoticShiftValueVo2 hMax = value.stream().max(Comparator.comparing(OsmoticShiftValueVo2::getDu)).get(); OsmoticShiftValueVo2 hMin = value.stream().min(Comparator.comparing(OsmoticShiftValueVo2::getDu)).get(); hVo.setCd(key + H_PREFIX); hVo.setMaxValue(hMax.getDu()); hVo.setMaxTm(hMax.getTm()); hVo.setMinValue(hMin.getDu()); hVo.setMinTm(hMin.getTm()); hVo.setDiff(hMax.getDu().subtract(hMin.getDu())); resList.add(hVo); }); } catch (Exception e) { log.info("year/state/value报错"); e.printStackTrace(); throw new IllegalArgumentException("报错"); } return resList; } public void yearStatExport(OsmoticQuerySo osmoticQuerySo, HttpServletResponse response) { String fileName = "年度位移统计"; String sheetName = "年度位移统计"; //上方表格数据 List resList = yearStat(osmoticQuerySo); //下方特征值数据 List chartList = yearStatValue(osmoticQuerySo); List stationCodes = osmoticQuerySo.getStationCodes(); //表头信息 List> headList = new ArrayList<>(); List heads1 = new ArrayList<>(); heads1.add("序号"); heads1.add("序号"); headList.add(heads1); List heads2 = new ArrayList<>(); heads2.add("监测日期"); heads2.add("监测日期"); headList.add(heads2); for(String code : stationCodes){ List headsX = new ArrayList<>(); headsX.add(code); headsX.add("X"); headList.add(headsX); List headsY = new ArrayList<>(); headsY.add(code); headsY.add("Y"); headList.add(headsY); List headsH = new ArrayList<>(); headsH.add(code); headsH.add("H"); headList.add(headsH); } List> list = new ArrayList<>(); for (int j = 0;j < resList.size(); j++) { OsmoticShiftVo2 vo = resList.get(j); Map test = new LinkedHashMap<>(); test.put("t0",j+1); test.put("t1", vo.getTm()); for(int i = 0;i < stationCodes.size();i++){ String code = stationCodes.get(i); OsmoticShiftValueVo2 valueVo = vo.getList().stream().filter(o->code.equals(o.getCd())).findFirst().orElse(null); test.put(code + X_PREFIX,valueVo != null ? valueVo.getDe() : ""); test.put(code + Y_PREFIX,valueVo != null ? valueVo.getDn() : ""); test.put(code + H_PREFIX,valueVo != null ? valueVo.getDu() : ""); } list.add(test); } Map max = new LinkedHashMap<>(); max.put("t0","全年度特征值统计"); max.put("t1", "最大值"); for(int i = 0;i < stationCodes.size();i++){ String code = stationCodes.get(i); max.put(code+X_PREFIX,chartList.stream().filter(o->(code+X_PREFIX).equals(o.getCd())).findFirst().orElseGet(OsmoticChartVo2::new).getMaxValue()); max.put(code+Y_PREFIX,chartList.stream().filter(o->(code+Y_PREFIX).equals(o.getCd())).findFirst().orElseGet(OsmoticChartVo2::new).getMaxValue()); max.put(code+H_PREFIX,chartList.stream().filter(o->(code+H_PREFIX).equals(o.getCd())).findFirst().orElseGet(OsmoticChartVo2::new).getMaxValue()); } list.add(max); Map maxTm = new LinkedHashMap<>(); maxTm.put("t0","全年度特征值统计"); maxTm.put("t1", "日期"); for(int i = 0;i < stationCodes.size();i++){ String code = stationCodes.get(i); maxTm.put(code+X_PREFIX,chartList.stream().filter(o->(code+X_PREFIX).equals(o.getCd())).findFirst().orElseGet(OsmoticChartVo2::new).getMaxTm()); maxTm.put(code+Y_PREFIX,chartList.stream().filter(o->(code+Y_PREFIX).equals(o.getCd())).findFirst().orElseGet(OsmoticChartVo2::new).getMaxTm()); maxTm.put(code+H_PREFIX,chartList.stream().filter(o->(code+H_PREFIX).equals(o.getCd())).findFirst().orElseGet(OsmoticChartVo2::new).getMaxTm()); } list.add(maxTm); Map min = new LinkedHashMap<>(); min.put("t0","全年度特征值统计"); min.put("t1", "最小值"); for(int i = 0;i < stationCodes.size();i++){ String code = stationCodes.get(i); min.put(code+X_PREFIX,chartList.stream().filter(o->(code+X_PREFIX).equals(o.getCd())).findFirst().orElseGet(OsmoticChartVo2::new).getMinValue()); min.put(code+Y_PREFIX,chartList.stream().filter(o->(code+Y_PREFIX).equals(o.getCd())).findFirst().orElseGet(OsmoticChartVo2::new).getMinValue()); min.put(code+H_PREFIX,chartList.stream().filter(o->(code+H_PREFIX).equals(o.getCd())).findFirst().orElseGet(OsmoticChartVo2::new).getMinValue()); } list.add(min); Map minTm = new LinkedHashMap<>(); minTm.put("t0","全年度特征值统计"); minTm.put("t1", "日期"); for(int i = 0;i < stationCodes.size();i++){ String code = stationCodes.get(i); minTm.put(code+X_PREFIX,chartList.stream().filter(o->(code+X_PREFIX).equals(o.getCd())).findFirst().orElseGet(OsmoticChartVo2::new).getMinTm()); minTm.put(code+Y_PREFIX,chartList.stream().filter(o->(code+Y_PREFIX).equals(o.getCd())).findFirst().orElseGet(OsmoticChartVo2::new).getMinTm()); minTm.put(code+H_PREFIX,chartList.stream().filter(o->(code+H_PREFIX).equals(o.getCd())).findFirst().orElseGet(OsmoticChartVo2::new).getMinTm()); } list.add(minTm); Map diff = new LinkedHashMap<>(); diff.put("t0","全年度特征值统计"); diff.put("t1", "年变幅"); for(int i = 0;i < stationCodes.size();i++){ String code = stationCodes.get(i); diff.put(code+X_PREFIX,chartList.stream().filter(o->(code+X_PREFIX).equals(o.getCd())).findFirst().orElseGet(OsmoticChartVo2::new).getDiff()); diff.put(code+Y_PREFIX,chartList.stream().filter(o->(code+Y_PREFIX).equals(o.getCd())).findFirst().orElseGet(OsmoticChartVo2::new).getDiff()); diff.put(code+H_PREFIX,chartList.stream().filter(o->(code+H_PREFIX).equals(o.getCd())).findFirst().orElseGet(OsmoticChartVo2::new).getDiff()); } list.add(diff); ExcelUtil.exportExcel(headList, DataHandleUtil.tableData(list),2,new int[]{0},fileName,response,sheetName); } public List detailValue(OsmoticDetailQuerySo so) { List list = baseMapper.detailValue(so); OsmoticQuerySo osmoticQuerySo = new OsmoticQuerySo(); BeanUtils.copyProperties(so,osmoticQuerySo); List stRzVos = jcskSyRMapper.queryLineRz(osmoticQuerySo,getStcd()); return bindShiftDetail(list,stRzVos); } private String getHourTime(String timeStr) { try { if (timeStr == null || timeStr.length() < 16) { return timeStr; } // 假设时间格式为 "yyyy-MM-dd HH:mm:ss" // 取到小时部分,分钟和秒设为00 return timeStr.substring(0, 14) + "00:00"; } catch (Exception e) { return timeStr; } } private List bindShiftDetail(List list, List stRzVos) { // 分离人工录入数据和自动采集数据 List manualData = list.stream() .filter(v -> v.getIsArtificial() != null && v.getIsArtificial() == 1) .collect(Collectors.toList()); List autoData = list.stream() .filter(v -> v.getIsArtificial() == null || v.getIsArtificial() == 0) .collect(Collectors.toList()); // 如果是人工录入数据,直接使用原始数据,不进行时间合并 if (!manualData.isEmpty()) { return manualData.stream() .map(manual -> { // 为人工录入数据匹配整点的库水位数据 String hourTime = getHourTime(manual.getTm()); stRzVos.stream() .filter(rz -> hourTime.equals(rz.getTm())) .findFirst() .ifPresent(rz -> manual.setRz(rz.getRz())); return manual; }) .sorted(Comparator.comparing(OsmoticShiftValueVo2::getTm).reversed()) .collect(Collectors.toList()); } // 如果是自动采集数据,保持原有逻辑 HashSet timeSet = new HashSet<>(); autoData.forEach(v -> timeSet.add(v.getTm())); stRzVos.forEach(v -> timeSet.add(v.getTm())); List result = new ArrayList<>(); timeSet.forEach(time -> { OsmoticShiftValueVo2 vo = new OsmoticShiftValueVo2(); vo.setTm(time); result.add(vo); }); List resList = result.stream().map(vo -> { // 匹配库水位数据 - 自动数据也匹配整点库水位 String hourTime = getHourTime(vo.getTm()); stRzVos.stream() .filter(rz -> hourTime.equals(rz.getTm())) .findFirst() .ifPresent(rz -> vo.setRz(rz.getRz())); // 匹配位移数据 autoData.stream() .filter(shift -> vo.getTm().equals(shift.getTm())) .findFirst() .ifPresent(shift -> { vo.setDe(shift.getDe()); vo.setDn(shift.getDn()); vo.setDu(shift.getDu()); vo.setIsArtificial(shift.getIsArtificial()); }); return vo; }).collect(Collectors.toList()); // 过滤掉没有监测数据的记录(即位移数据为空的记录) List filteredList = resList.stream() .filter(vo -> vo.getDe() != null || vo.getDn() != null || vo.getDu() != null) .collect(Collectors.toList()); return filteredList.stream() .sorted(Comparator.comparing(OsmoticShiftValueVo2::getTm).reversed()) .collect(Collectors.toList()); } public List getChAndCd() { List chs = jcskGnssBMapper.selectCH(); List res = new ArrayList<>(); for (String ch : chs) { GnssCdAndCdVo vo = new GnssCdAndCdVo(); vo.setCh(ch); List cds = jcskGnssBMapper.selectCDbyCh(ch); vo.setChildrens(cds); res.add(vo); } return res; } public Page historyPage(JcskGnssRPageSo page) { return this.baseMapper.historyPage(page.getPageSo().toPage(),page); } public Page artificialPage(JcskGnssRPageSo page) { Page res = this.baseMapper.artificialPage(page.getPageSo().toPage(),page); return res; } /** * 将Date转为String * @param date * @return */ public String transforDateToString(Date date) { // 将Date转换为LocalDateTime if(date == null){ return null; } LocalDateTime localDateTime = date.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDateTime(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String formattedDate = localDateTime.format(formatter); return formattedDate; } public void artificialExport(JcskGnssRPageSo page, HttpServletResponse response) { Page res = this.baseMapper.artificialPage(page.getPageSo().toPage(), page); List records = res.getRecords(); // 创建导出数据列表 List> exportData = new ArrayList<>(); for (JcskGnssR record : records) { Map row = new HashMap<>(); row.put("cd",record.getCd()); row.put("isArtificial", record.getIsArtificial() != null && record.getIsArtificial() == 1 ? "人工录入" : "自动采集"); row.put("updateTm", record.getUpdateTm().toString()); row.put("x",record.getDe()); row.put("y",record.getDn()); row.put("h",record.getDu()); row.put("tm",record.getTm().toString()); exportData.add(row); } // 通过工具类创建writer ExcelWriter writer = cn.hutool.poi.excel.ExcelUtil.getWriter(); // 自定义标题(去掉水库代码、水工建筑物编号、stcd、mpcd) writer.addHeaderAlias("cd", "测点编号"); writer.addHeaderAlias("tm", "监测时间"); writer.addHeaderAlias("x", "X方向形变值(mm)"); writer.addHeaderAlias("y", "Y方向形变值(mm)"); writer.addHeaderAlias("h", "H方向形变值(mm)"); writer.addHeaderAlias("isArtificial","录入方式"); writer.addHeaderAlias("updateTm","更新时间"); // 只写出设置了别名的字段 writer.setOnlyAlias(true); // 一次性写出内容 writer.write(exportData, true); // 设置响应内容类型 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"); try { // 设置响应头信息 String fileName = URLEncoder.encode("位移人工录入数据", "UTF-8"); response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx"); // 将writer对象刷新到响应输出流中 writer.flush(response.getOutputStream(), true); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("导出Excel失败", e); } finally { // 关闭writer,释放内存 writer.close(); } } public boolean saveData(JcskGnssR dto) { dto.setIsArtificial(1); dto.setUpdateTm(LocalDateTime.now()); int insert = this.baseMapper.insert(dto); return insert > 0; } public boolean updateData(JcskGnssR dto) { dto.setUpdateTm(LocalDateTime.now()); LocalDateTime oldTm = dto.getTm(); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(JcskGnssR::getIsArtificial, 1); queryWrapper.eq(JcskGnssR::getTm, oldTm); queryWrapper.eq(JcskGnssR::getCd, dto.getCd()); dto.setCd(dto.getNewUpdateCd()); dto.setTm(dto.getNewUpdateTm()); int update = this.baseMapper.update(dto, queryWrapper); return update > 0; } public boolean deleteData(ArtificialJcskGnssDeleteDto dto) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(JcskGnssR::getIsArtificial, 1); queryWrapper.eq(JcskGnssR::getTm, dto.getTm()); queryWrapper.eq(JcskGnssR::getCd, dto.getCd()); int delete = this.baseMapper.delete(queryWrapper); return delete > 0; } public JcskGnssR queryByCDNM(String stationCode) { return this.baseMapper.queryByCDNM(stationCode); } }