燕山石化溯源三维电子沙盘-【后端】-服务
1
13693261870
2024-11-13 2f55cebbad3dea187a5f91d16ec80a9677dab699
src/main/java/com/yssh/service/XlsReportService.java
@@ -5,10 +5,12 @@
import com.yssh.entity.xls.DayExcel;
import com.yssh.entity.xls.MonthExcel;
import com.yssh.entity.xls.WeekExcel;
import com.yssh.entity.xls.XlsReport;
import com.yssh.mapper.XlsReportMapper;
import com.yssh.utils.CalculateUtils;
import com.yssh.utils.DateUtils;
import com.yssh.utils.ExcelUtils;
import com.yssh.utils.WebUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
@@ -16,15 +18,11 @@
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
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());
@@ -54,17 +52,11 @@
    private double bjz;
    /**
     * Excel是否已存在
     * 报警值
     */
    private boolean xlsExists(String type, String name) {
        int rows = mapper.reportExists(type, name);
    @Value("${report.templates}")
    private String templates;
        return rows > 0;
    }
    /**
     * 获取导出路径
     */
    private String getExpPath(String type) {
        String path = reportPath + File.separator + type;
@@ -76,18 +68,13 @@
        return path;
    }
    /**
     * 获取Excel模板
     */
    private String getXslTemplate(String type) throws IOException {
        ClassPathResource resource = new ClassPathResource(String.format("templates/%s.xlsx", type));
        //ClassPathResource resource = new ClassPathResource(String.format("templates/%s.xlsx", type));
        //return resource.exists() ? resource.getFile().getPath() : null;
        return resource.exists() ? resource.getFile().getPath() : null;
        return String.format(templates + File.separator + type + ".xlsx");
    }
    /**
     * 创建Excel
     */
    private <T> void createExcel(String source, String target, List<T> list) {
        Map<String, List<T>> map = new HashMap<>();
        map.put("data", list);
@@ -95,28 +82,65 @@
        ExcelUtils.writeToTemplate(source, target, map);
    }
    /**
     * 创建Excel
     */
    private String getStrDate(String type, Date date) {
        return DateUtils.parseDateToStr("month".equals(type) ? DateUtils.YYYYMM : DateUtils.YYYYMMDD, date);
    }
    private String getTarget(String type, Date date) {
        String strData = getStrDate(type, date);
        return String.format("%s\\%s.xlsx", getExpPath(type), strData);
    }
    private boolean xlsExists(String type, Date date) {
        String target = getTarget(type, date);
        File f = new File(target);
        return f.exists() && !f.isDirectory();
    }
    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);
        String strData = getStrDate(type, date);
        String target = getTarget(type, date);
        createExcel(source, target, list);
        if (!xlsExists(type, date)) {
            createExcel(source, target, list);
        }
        return String.format("%s\\%s.xlsx", type, strData);
    }
    /**
     * 获取受影响因素及原因
     */
    private boolean recordExists(String type, Date date) {
        String name = String.format("%s.xlsx", getStrDate(type, date));
        int rows = mapper.reportExists(type, name);
        return rows > 0;
    }
    private <T> void saveResult(String type, Date date, List<T> list) throws Exception {
        String filePath = createExcel(type, date, list);
        if (recordExists(type, date)) return;
        String name = filePath.replace(type + "\\", "");
        date = DateUtils.trimTime(date);
        XlsReport xls = new XlsReport();
        xls.setName(name);
        xls.setType(type);
        xls.setPath(filePath);
        xls.setCreateTime(date);
        mapper.insertReport(xls);
    }
    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<>();
            sub.add(DateUtils.getYyyyMmDdHh(su.getCreateTime()));
            if (null != su.getAddr1())
                sub.add(su.getAddr1() + ",概率:" + (su.getOdds1() * 100) + "%,X:" + su.getX1() + ",Y:" + su.getY1());
            if (null != su.getAddr2())
@@ -131,75 +155,179 @@
    }
    /**
     * 创建日报:DayExcel day = new DayExcel("AI-" + (i < 10 ? "0" : "") + i, "lj", "ljtb", "ys", "3m/s", "东南", "°c");
     * 创建日报: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));
            String type = "day";
            Date yesterday = DateUtils.getAPeriodOfTime(date, -1, Calendar.DATE); // 2023-07-24
            if (xlsExists(type, yesterday) && recordExists(type, yesterday)) return;
            String yyyy = DateUtils.parseDateToStr(DateUtils.YYYY, yesterday); // 2023
            String yyyymmdd = DateUtils.parseDateToStr(DateUtils.YYYYMMDD, yesterday); // 20230724
            Integer yearStart = Integer.parseInt(yyyy + "010100"); // 2023010100
            Integer dayStart = Integer.parseInt(yyyymmdd + "00"); // 2023072400
            Integer end = Integer.parseInt(yyyymmdd + "23"); // 2023072423
            String lastYear = DateUtils.parseDateToStr(DateUtils.YYYY, DateUtils.lastYear(yesterday)); // 2022
            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);
                double rjz = mapper.selectDayAvg(yyyymmdd + "%", name); // 日均值
                double lj = mapper.selectAccumulate(yearStart, end, name); // 累计
                double ljjz = mapper.selectYearAccumulate(yyyy + "%", name); // 今年累计均值
                double qnLjjz = mapper.selectYearAccumulate(lastYear + "%", name); // 去年累计均值
                String ljtb = 0 == qnLjjz ? "--" : CalculateUtils.round2((ljjz - qnLjjz) / qnLjjz * 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<SuYuan700> suList = mapper.selectSuYuanByTime(id, yyyy_mm_dd + " 00:00:00", yyyy_mm_dd + " 23:00:00");
                List<SuYuan700> suList = mapper.selectSuYuanByStartAndEnd(id, name, yjz, dayStart, end);
                String ys = getYs(suList); // 受影响因素及原因
                list.add(new DayExcel("" + rjz, "" + lj, "" + ljtb, ys, "", "", ""));
                list.add(new DayExcel("" + rjz, "" + lj, ljtb, ys, "", "", ""));
            }
            String filePath = createExcel("day", yesterday, list);
            saveResult(type, yesterday, list);
        } catch (Exception ex) {
            logger.error(ex.getMessage(), ex);
        }
    }
    /**
     * 创建周报
     * 创建周报:new WeekExcel("AI-" + (i < 10 ? "0" : "") + i, "zhb", "ztq", "ztb", "zhb2", "lj", "ljtb", "syn", "ys", "fs", "fx", "°c");
     */
    public void createWeekReport(Date date) {
        try {
            Date start = DateUtils.getAPeriodOfTime(date, -7, Calendar.DATE);
            Date end = DateUtils.getAPeriodOfTime(date, -1, Calendar.DATE);
            String type = "week";
            Date mon = DateUtils.getAPeriodOfTime(date, -7, Calendar.DATE); // 2023-07-24
            Date sun = DateUtils.getAPeriodOfTime(date, -1, Calendar.DATE); // 2023-07-30
            if (xlsExists(type, sun) && recordExists(type, sun)) return;
            Date lastMon = DateUtils.getAPeriodOfTime(date, -14, Calendar.DATE); // 2023-07-17
            Date lastSun = DateUtils.getAPeriodOfTime(date, -8, Calendar.DATE); // 2023-07-23
            Date lastYear1 = DateUtils.getAPeriodOfTime(mon, -1, Calendar.YEAR); // 2022-07-24
            Date lastYear7 = DateUtils.getAPeriodOfTime(sun, -1, Calendar.YEAR); // 2022-07-30
            Integer intMon = Integer.parseInt(DateUtils.parseDateToStr(DateUtils.YYYYMMDD, mon) + "00"); // 2023072400
            Integer intSun = Integer.parseInt(DateUtils.parseDateToStr(DateUtils.YYYYMMDD, sun) + "23"); // 2023073023
            Integer intLastMon = Integer.parseInt(DateUtils.parseDateToStr(DateUtils.YYYYMMDD, lastMon) + "00"); // 2023071700
            Integer intLastSun = Integer.parseInt(DateUtils.parseDateToStr(DateUtils.YYYYMMDD, lastSun) + "23"); // 2023072323
            Integer intLastYear1 = Integer.parseInt(DateUtils.parseDateToStr(DateUtils.YYYYMMDD, lastYear1) + "00"); // 2022072400
            Integer intLastYear7 = Integer.parseInt(DateUtils.parseDateToStr(DateUtils.YYYYMMDD, lastYear7) + "23"); // 2022073023
            String year = DateUtils.parseDateToStr(DateUtils.YYYY, sun); // 2023
            Integer yearStart = Integer.parseInt(year + "010100"); // 2023010100
            String lastYear = DateUtils.parseDateToStr(DateUtils.YYYY, DateUtils.lastYear(sun)); // 2022
            int weekOfYear = DateUtils.getWeekOfYear(sun); // 31
            Date lastYearSun = DateUtils.getWeekOfYearForSun(Integer.parseInt(lastYear), weekOfYear); // 2022-07-24
            Date lastYearMon = DateUtils.getAPeriodOfTime(lastYearSun, -6, Calendar.DATE); // 2022-07-18
            Integer intLastYearMon = Integer.parseInt(DateUtils.parseDateToStr(DateUtils.YYYYMMDD, lastYearMon) + "00"); // 2022071800
            Integer intLastYearSun = Integer.parseInt(DateUtils.parseDateToStr(DateUtils.YYYYMMDD, lastYearSun) + "23"); // 2022072423
            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 name = "AI-" + (i < 10 ? "0" : "") + i;
                double sz = mapper.selectAccumulate(intMon, intSun, name); // 上周
            String filePath = createExcel("week", end, list);
                double ssz = mapper.selectAccumulate(intLastMon, intLastSun, name); // 上上周
                String zhb = 0 == ssz ? "--" : CalculateUtils.round2((sz - ssz) / ssz * 100) + "%"; // 周环比
                double qntq = mapper.selectAccumulate(intLastYear1, intLastYear7, name); // 去年同期
                String ztq = 0 == qntq ? "--" : CalculateUtils.round2((sz - qntq) / qntq * 100) + "%"; // 周同期
                double qntz = mapper.selectAccumulate(intLastYearMon, intLastYearSun, name); // 去年同周
                String ztb = 0 == qntz ? "--" : CalculateUtils.round2((sz - qntz) / qntz * 100) + "%"; // 周同比
                double lj = mapper.selectAccumulate(yearStart, intSun, name); // 累计
                double ljjz = mapper.selectYearAccumulate(year + "%", name); // 今年累计均值
                double qnLjjz = mapper.selectYearAccumulate(lastYear + "%", name); // 去年累计均值
                String ljtb = 0 == qnLjjz ? "--" : CalculateUtils.round2((ljjz - qnLjjz) / qnLjjz * 100) + "%"; // 累计同比
                String syn = 0 == qnLjjz ? "--" : CalculateUtils.round2((ljjz - qnLjjz) / qnLjjz * 100) + "%"; // 较上一年度变化幅度
                MonitorPointPosition point = commonService.select3dCheckPointByName(name);
                String id = point.getId().substring(0, point.getId().lastIndexOf("_") + 1) + "0";
                List<SuYuan700> suList = mapper.selectSuYuanByStartAndEnd(id, name, yjz, intMon, intSun);
                String ys = getYs(suList); // 受影响因素及原因
                list.add(new WeekExcel("" + sz, zhb, ztq, ztb, "" + lj, ljtb, syn, ys, "", "", ""));
            }
            saveResult(type, sun, list);
        } catch (Exception ex) {
            logger.error(ex.getMessage(), ex);
        }
    }
    /**
     * 创建月报
     * 创建月报:new MonthExcel("AI-" + (i < 10 ? "0" : "") + i, "yhb", "ytq", "ytb", "lj", "ljtb", "qyn", "ys", "fs", "fx", "°c");
     */
    public void createMonthReport(Date date) {
        try {
            Date yesterday = DateUtils.getAPeriodOfTime(date, -1, Calendar.DATE);
            Date start = DateUtils.getMonthStart(yesterday);
            Date end = DateUtils.getMonthEnd(yesterday);
            String type = "month";
            Date yesterday = DateUtils.getAPeriodOfTime(date, -1, Calendar.DATE); // 2023-07-31
            Date monthStart = DateUtils.getMonthStart(yesterday); // 2023-07-01
            Date monthEnd = DateUtils.getMonthEnd(yesterday); // 2023-07-31
            if (xlsExists(type, monthEnd) && recordExists(type, monthEnd)) return;
            int intMonthStart = Integer.parseInt(DateUtils.parseDateToStr(DateUtils.YYYYMMDD, monthStart) + "00"); // 2023070100
            int intMonthEnd = Integer.parseInt(DateUtils.parseDateToStr(DateUtils.YYYYMMDD, monthEnd) + "23"); // 2023073123
            Date lastMonth = DateUtils.getAPeriodOfTime(yesterday, -1, Calendar.MONTH); // 2023-06-30
            Date lastMonthStart = DateUtils.getMonthStart(lastMonth); // 2023-06-01
            Date lastMonthEnd = DateUtils.getMonthEnd(lastMonth); // 2023-06-30
            int intLastMonthStart = Integer.parseInt(DateUtils.parseDateToStr(DateUtils.YYYYMMDD, lastMonthStart) + "00"); // 2023060100
            int intLastMonthEnd = Integer.parseInt(DateUtils.parseDateToStr(DateUtils.YYYYMMDD, lastMonthEnd) + "23"); // 2023063023
            int lastYearMonthStart = intMonthStart - 1000000; // 2023070100
            int lastYearMonthEnd = intMonthEnd - 1000000; // 2023073123
            String year = DateUtils.parseDateToStr(DateUtils.YYYY, yesterday); // 2023
            Integer yearStart = Integer.parseInt(year + "010100"); // 2023010100
            Date lastDay = DateUtils.lastYear(yesterday); // 2022-07-31
            String lastYear = DateUtils.parseDateToStr(DateUtils.YYYY, lastDay); // 2022
            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 name = "AI-" + (i < 10 ? "0" : "") + i;
                double sy = mapper.selectAccumulate(intMonthStart, intMonthEnd, name); // 上月
            String filePath = createExcel("month", end, list);
                double ssy = mapper.selectAccumulate(intLastMonthStart, intLastMonthEnd, name); // 上上月
                String yhb = 0 == ssy ? "--" : CalculateUtils.round2((sy - ssy) / ssy * 100) + "%"; // 月环比
                double qntq = mapper.selectAccumulate(lastYearMonthStart, lastYearMonthEnd, name); // 去年同期
                String ytq = 0 == qntq ? "--" : CalculateUtils.round2((sy - qntq) / qntq * 100) + "%"; // 月同期
                String ytb = 0 == qntq ? "--" : CalculateUtils.round2((sy - qntq) / qntq * 100) + "%"; // 月同比
                double lj = mapper.selectAccumulate(yearStart, intMonthEnd, name); // 累计
                double ljjz = mapper.selectYearAccumulate(year + "%", name); // 今年累计均值
                double qnLjjz = mapper.selectYearAccumulate(lastYear + "%", name); // 去年累计均值
                String ljtb = 0 == qnLjjz ? "--" : CalculateUtils.round2((ljjz - qnLjjz) / qnLjjz * 100) + "%"; // 累计同比
                String qyn = 0 == qnLjjz ? "--" : CalculateUtils.round2((ljjz - qnLjjz) / qnLjjz * 100) + "%"; // 较上一年度变化幅度
                MonitorPointPosition point = commonService.select3dCheckPointByName(name);
                String id = point.getId().substring(0, point.getId().lastIndexOf("_") + 1) + "0";
                List<SuYuan700> suList = mapper.selectSuYuanByStartAndEnd(id, name, yjz, intMonthStart, intMonthEnd);
                String ys = getYs(suList); // 受影响因素及原因
                list.add(new MonthExcel("" + sy, yhb, ytq, ytb, "" + lj, ljtb, qyn, ys, "", "", ""));
            }
            saveResult(type, monthEnd, list);
        } catch (Exception ex) {
            logger.error(ex.getMessage(), ex);
        }
    }
    public void downloadById(Integer id, HttpServletResponse res) {
        XlsReport xlsReport = mapper.selectById(id);
        if (null == xlsReport) return;
        String file = reportPath + File.separator + xlsReport.getPath();
        File f = new File(file);
        if (!f.exists() || f.isDirectory()) return;
        try {
            WebUtils.download(file, xlsReport.getName(), false, res);
        } catch (Exception ex) {
            logger.error(ex.getMessage(), ex);
        }