package com.doumee.service.business.impl; import com.doumee.core.conditoner.ConditionerUtil; import com.doumee.core.conditoner.model.request.CompanyGsManageRequest; import com.doumee.core.conditoner.model.response.CompanyGsInfoResponse; import com.doumee.core.conditoner.model.response.ConditionerBaseResponse; import com.doumee.dao.business.dto.YwConditionerReportQueryDTO; import com.doumee.dao.business.dto.YwConditionerUsageReportPageDTO; import com.doumee.dao.business.dto.YwConditionerUsageReportVO; import com.doumee.service.business.ConditionerBizService; import com.doumee.service.business.YwConditionerReportService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletResponse; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @Service public class YwConditionerReportServiceImpl implements YwConditionerReportService { @Autowired private ConditionerBizService conditionerBizService; @Override public YwConditionerUsageReportPageDTO findPage(YwConditionerReportQueryDTO query) { return conditionerBizService.queryUsageReport(query); } @Override public String syncUsage(YwConditionerReportQueryDTO query) { return conditionerBizService.syncUsage(query); } @Override public List> merchantOptions() { conditionerBizService.ensureLogin(); CompanyGsManageRequest req = new CompanyGsManageRequest(); ConditionerBaseResponse> resp = ConditionerUtil.getGs(req); if (resp == null || resp.getData() == null) { return Collections.emptyList(); } return resp.getData().stream().map(gs -> { Map m = new LinkedHashMap<>(); m.put("gsId", gs.getId()); m.put("gsName", gs.getGs_name()); return m; }).collect(Collectors.toList()); } @Override public void exportExcel(YwConditionerReportQueryDTO query, HttpServletResponse response) { if (query == null) { query = new YwConditionerReportQueryDTO(); } query.setPage(1); query.setCapacity(1_000_000); YwConditionerUsageReportPageDTO page = findPage(query); try { String fileName = URLEncoder.encode("空调用量报表.csv", StandardCharsets.UTF_8.name()); response.setContentType("text/csv;charset=UTF-8"); response.setHeader("Content-Disposition", "attachment;filename=" + fileName); PrintWriter writer = new PrintWriter(new OutputStreamWriter(response.getOutputStream(), StandardCharsets.UTF_8)); writer.write('\ufeff'); List cols = page.getDateColumns() != null ? page.getDateColumns() : Collections.emptyList(); StringBuilder header = new StringBuilder("设备ID,设备名称,总时长(h),总电量(kWh),总电费(元)"); for (String col : cols) { header.append(',').append(col).append("电量(kWh),") .append(col).append("时长(h),") .append(col).append("电费(元)"); } writer.println(header); if (page.getRecords() != null) { for (YwConditionerUsageReportVO row : page.getRecords()) { StringBuilder line = new StringBuilder(); line.append(csv(row.getDevId())).append(',') .append(csv(formatDevDisplayName(row))).append(',') .append(csv(row.getTotalTime())).append(',') .append(csv(row.getTotalDl())).append(',') .append(csv(row.getTotalDf())); for (String col : cols) { String dateKey = colToDateKey(query, col); YwConditionerUsageReportVO.YwConditionerUsageDailyVO day = row.getDaily() != null && dateKey != null ? row.getDaily().get(dateKey) : null; line.append(',').append(csv(day != null ? day.getDl() : "")) .append(',').append(csv(day != null ? day.getTime() : "")) .append(',').append(csv(day != null ? day.getDf() : "")); } writer.println(line); } } writer.flush(); } catch (Exception e) { throw new RuntimeException("导出失败", e); } } private static String csv(Object val) { if (val == null) { return ""; } String s = String.valueOf(val).replace("\"", "\"\""); if (s.contains(",") || s.contains("\"") || s.contains("\n")) { return "\"" + s + "\""; } return s; } private static String formatDevDisplayName(YwConditionerUsageReportVO row) { if (row == null) { return "-"; } StringBuilder sb = new StringBuilder(); appendDisplayPart(sb, row.getFloorName()); appendDisplayPart(sb, row.getRoomName()); appendDisplayPart(sb, row.getDevName()); return sb.length() == 0 ? "-" : sb.toString(); } private static void appendDisplayPart(StringBuilder sb, String part) { if (StringUtils.isBlank(part)) { return; } if (sb.length() > 0) { sb.append('/'); } sb.append(part.trim()); } private String colToDateKey(YwConditionerReportQueryDTO query, String col) { if (query != null && "day".equalsIgnoreCase(query.getReportType())) { return col; } String month = query != null ? query.getMonth() : null; if (month == null || col == null || !col.contains(".")) { return col; } String[] parts = col.split("\\."); if (parts.length != 2) { return col; } String year = month.split("-")[0]; int m = Integer.parseInt(parts[0]); int d = Integer.parseInt(parts[1]); return String.format("%s-%02d-%02d", year, m, d); } }