package com.yssh.service;
|
|
import com.yssh.entity.MonitorPointPosition;
|
import com.yssh.entity.SuYuan700;
|
import com.yssh.entity.xls.DayExcel;
|
import com.yssh.entity.xls.MonthExcel;
|
import com.yssh.entity.xls.WeekExcel;
|
import com.yssh.mapper.XlsReportMapper;
|
import com.yssh.utils.CalculateUtils;
|
import com.yssh.utils.DateUtils;
|
import com.yssh.utils.ExcelUtils;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.core.io.ClassPathResource;
|
import org.springframework.stereotype.Service;
|
|
import javax.annotation.Resource;
|
import java.io.File;
|
import java.io.IOException;
|
import java.util.*;
|
|
/**
|
* Excel导出服务类
|
* @author WWW
|
* @author 2023-08-05
|
*/
|
@Service
|
public class XlsReportService {
|
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
|
|
@Resource
|
XlsReportMapper mapper;
|
|
@Resource
|
CommonService commonService;
|
|
/**
|
* 报告路径
|
*/
|
@Value("${report.path}")
|
private String reportPath;
|
|
/**
|
* 预警值
|
*/
|
@Value("${report.yjz}")
|
private double yjz;
|
|
/**
|
* 报警值
|
*/
|
@Value("${report.bjz}")
|
private double bjz;
|
|
/**
|
* Excel是否已存在
|
*/
|
private boolean xlsExists(String type, String name) {
|
int rows = mapper.reportExists(type, name);
|
|
return rows > 0;
|
}
|
|
/**
|
* 获取导出路径
|
*/
|
private String getExpPath(String type) {
|
String path = reportPath + File.separator + type;
|
|
File f = new File(path);
|
if (!f.exists() || !f.isDirectory()) {
|
f.mkdirs();
|
}
|
|
return path;
|
}
|
|
/**
|
* 获取Excel模板
|
*/
|
private String getXslTemplate(String type) throws IOException {
|
ClassPathResource resource = new ClassPathResource(String.format("templates/%s.xlsx", type));
|
|
return resource.exists() ? resource.getFile().getPath() : null;
|
}
|
|
/**
|
* 创建Excel
|
*/
|
private <T> void createExcel(String source, String target, List<T> list) {
|
Map<String, List<T>> map = new HashMap<>();
|
map.put("data", list);
|
|
ExcelUtils.writeToTemplate(source, target, map);
|
}
|
|
/**
|
* 创建Excel
|
*/
|
private <T> String createExcel(String type, Date date, List<T> list) throws Exception {
|
String source = getXslTemplate(type);
|
String strData = DateUtils.parseDateToStr("month".equals(type) ? DateUtils.YYYYMM : DateUtils.YYYYMMDD, date);
|
String target = String.format("%s\\%s.xlsx", getExpPath(type), strData);
|
|
createExcel(source, target, list);
|
|
return String.format("%s\\%s.xlsx", type, strData);
|
}
|
|
/**
|
* 获取受影响因素及原因
|
*/
|
public String getYs(List<SuYuan700> suList) {
|
if (null == suList || 0 == suList.size()) return "";
|
|
List<String> list = new ArrayList<>();
|
for (SuYuan700 su : suList) {
|
List<String> sub = new ArrayList<>();
|
if (null != su.getAddr1())
|
sub.add(su.getAddr1() + ",概率:" + (su.getOdds1() * 100) + "%,X:" + su.getX1() + ",Y:" + su.getY1());
|
if (null != su.getAddr2())
|
sub.add(su.getAddr2() + ",概率:" + (su.getOdds2() * 100) + "%,X:" + su.getX2() + ",Y:" + su.getY2());
|
if (null != su.getAddr3())
|
sub.add(su.getAddr3() + ",概率:" + (su.getOdds3() * 100) + "%,X:" + su.getX3() + ",Y:" + su.getY3());
|
|
list.add(String.join(";", sub));
|
}
|
|
return String.join("\n", list);
|
}
|
|
/**
|
* 创建日报:DayExcel day = new DayExcel("AI-" + (i < 10 ? "0" : "") + i, "lj", "ljtb", "ys", "3m/s", "东南", "°c");
|
*/
|
public void createDayReport(Date date) {
|
try {
|
Date yesterday = DateUtils.getAPeriodOfTime(date, -1, Calendar.DATE);
|
String yyyy = DateUtils.parseDateToStr(DateUtils.YYYY, yesterday);
|
String yyyymmdd = DateUtils.parseDateToStr(DateUtils.YYYYMMDD, yesterday);
|
String yyyy_mm_dd = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, yesterday);
|
Integer start = Integer.parseInt(yyyy + "0101");
|
Integer end = Integer.parseInt(yyyymmdd);
|
String lastYear = DateUtils.parseDateToStr(DateUtils.YYYY, DateUtils.lastYear(yesterday));
|
|
List<DayExcel> list = new ArrayList<>();
|
for (int i = 1; i < 47; i++) {
|
String name = "AI-" + (i < 10 ? "0" : "") + i;
|
double rjz = mapper.selectDayAvg(yyyymmdd + "%", name);
|
double lj = mapper.selectAccumulate(start, end, name);
|
double lastLj = mapper.selectYearAccumulate(lastYear, name);
|
double ljtb = CalculateUtils.round2((lj - lastLj) / lastLj * 100);
|
MonitorPointPosition point = commonService.select3dCheckPointByName(name);
|
String id = point.getId().substring(0, point.getId().lastIndexOf("_") + 1) + "0";
|
List<SuYuan700> suList = mapper.selectSuYuanByTime(id, yyyy_mm_dd + " 00:00:00", yyyy_mm_dd + " 23:00:00");
|
String ys = getYs(suList);
|
|
list.add(new DayExcel("" + rjz, "" + lj, "" + ljtb, ys, "", "", ""));
|
}
|
|
String filePath = createExcel("day", yesterday, list);
|
} catch (Exception ex) {
|
logger.error(ex.getMessage(), ex);
|
}
|
}
|
|
/**
|
* 创建周报
|
*/
|
public void createWeekReport(Date date) {
|
try {
|
Date start = DateUtils.getAPeriodOfTime(date, -7, Calendar.DATE);
|
Date end = DateUtils.getAPeriodOfTime(date, -1, Calendar.DATE);
|
|
List<WeekExcel> list = new ArrayList<>();
|
for (int i = 1; i < 47; i++) {
|
WeekExcel day = new WeekExcel("AI-" + (i < 10 ? "0" : "") + i, "zhb", "ztq", "ztb", "zhb2", "lj", "ljtb", "syn", "ys", "fs", "fx", "°c");
|
list.add(day);
|
}
|
|
String filePath = createExcel("week", end, list);
|
} catch (Exception ex) {
|
logger.error(ex.getMessage(), ex);
|
}
|
}
|
|
/**
|
* 创建月报
|
*/
|
public void createMonthReport(Date date) {
|
try {
|
Date yesterday = DateUtils.getAPeriodOfTime(date, -1, Calendar.DATE);
|
Date start = DateUtils.getMonthStart(yesterday);
|
Date end = DateUtils.getMonthEnd(yesterday);
|
|
List<MonthExcel> list = new ArrayList<>();
|
for (int i = 1; i < 47; i++) {
|
MonthExcel day = new MonthExcel("AI-" + (i < 10 ? "0" : "") + i, "yhb", "ytq", "ytb", "yhb2", "lj", "ljtb", "qyn", "ys", "fs", "fx", "°c");
|
list.add(day);
|
}
|
|
String filePath = createExcel("month", end, list);
|
} catch (Exception ex) {
|
logger.error(ex.getMessage(), ex);
|
}
|
}
|
}
|