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<Map<String, Object>> merchantOptions() {
|
conditionerBizService.ensureLogin();
|
CompanyGsManageRequest req = new CompanyGsManageRequest();
|
ConditionerBaseResponse<List<CompanyGsInfoResponse>> resp = ConditionerUtil.getGs(req);
|
if (resp == null || resp.getData() == null) {
|
return Collections.emptyList();
|
}
|
return resp.getData().stream().map(gs -> {
|
Map<String, Object> 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<String> 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);
|
}
|
}
|