package com.java110.fee.cmd.fee; import com.alibaba.fastjson.JSONObject; import com.java110.core.annotation.Java110Cmd; import com.java110.core.context.ICmdDataFlowContext; import com.java110.core.event.cmd.Cmd; import com.java110.core.event.cmd.CmdEvent; import com.java110.dto.fee.FeeDetailDto; import com.java110.intf.community.ICommunityInnerServiceSMO; import com.java110.intf.dev.IDictV1InnerServiceSMO; import com.java110.intf.fee.IReportFeeInnerServiceSMO; import com.java110.fee.smo.impl.FeeDetailInnerServiceSMOImpl; import com.java110.utils.exception.CmdException; import com.java110.utils.util.Assert; import com.java110.vo.FeeQueryParams; import com.java110.vo.ResultVo; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import java.text.ParseException; import java.util.List; import java.util.Map; @Java110Cmd(serviceCode = "fee.outWhiteOrderReportFeeCmd") public class ReportFeeWriteOrderAdapt extends Cmd { @Autowired private IReportFeeInnerServiceSMO reportFeeInnerServiceSMOImpl; @Autowired private ICommunityInnerServiceSMO communityInnerServiceSMOImpl; @Autowired private IDictV1InnerServiceSMO dictV1InnerServiceSMOImpl; @Autowired private FeeDetailInnerServiceSMOImpl feeDetailInnerServiceSMOImpl; private static final int MAX_ROW = 60000; @Override public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException { Assert.hasKey(reqJson, "communityId", "请求报文中未包含小区编号"); } @Override public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException { // 判断是否为导出操作 if (reqJson.containsKey("export") && reqJson.getBoolean("export")) { SXSSFWorkbook workbook = exportData(reqJson); try { HttpHeaders headers = new HttpHeaders(); headers.add("Content-Disposition", "attachment;filename=whiteOrderFeeReport.xlsx"); ResponseEntity responseEntity = new ResponseEntity<>( // workbook.toByteArray(), headers, HttpStatus.OK ); context.setResponseEntity(responseEntity); } catch (Exception e) { throw new CmdException("导出报表失败:" + e.getMessage()); } finally { workbook.dispose(); } return; } // 原查询逻辑保持不变 FeeQueryParams feeQueryParams = new FeeQueryParams(); feeQueryParams.setCommunityId(reqJson.getString("communityId")); feeQueryParams.setRow(reqJson.containsKey("row") ? Integer.valueOf(reqJson.getString("row")) : 20); feeQueryParams.setPage(reqJson.containsKey("page") ? Integer.valueOf(reqJson.get("page").toString()) : 1); feeQueryParams.setPage(feeQueryParams.getPage() * feeQueryParams.getRow() - feeQueryParams.getRow()); List result = reportFeeInnerServiceSMOImpl.repostPaidInFeeByWhiteOrder(feeQueryParams); String[][] reportList = new String[feeQueryParams.getRow() != null ? feeQueryParams.getRow() : 100][]; for (int i = 0; i < result.size(); i++) { Map map = result.get(i); String[] strings = new String[29]; for (int j = 1; j <= 27; j++) { if (map.containsKey("row" + j)) { strings[j - 1] = map.get("row" + j).toString(); } } reportList[i] = strings; } FeeDetailDto feeDetailDto = new FeeDetailDto(); feeDetailDto.setCommunityId(reqJson.getString("communityId")); int c = feeDetailInnerServiceSMOImpl.queryFeeDetailsCount(feeDetailDto); ResultVo resultVo = new ResultVo(reportList); resultVo.setTotal(Integer.parseInt(result.get(0).get("count").toString())); ResponseEntity responseEntity = new ResponseEntity<>(resultVo.toString(), HttpStatus.OK); context.setResponseEntity(responseEntity); } /** * 导出数据,类似ReportProficientAdapt的exportData方法 */ private SXSSFWorkbook exportData(JSONObject reqJson) { SXSSFWorkbook workbook = new SXSSFWorkbook(); workbook.setCompressTempFiles(false); // 创建工作表 Sheet sheet = workbook.createSheet("白单缴费报表"); // 创建表头 createHeaderRow(sheet); // 查询数据 FeeQueryParams feeQueryParams = new FeeQueryParams(); feeQueryParams.setCommunityId(reqJson.getString("communityId")); feeQueryParams.setPage(1); feeQueryParams.setRow(MAX_ROW); List result = reportFeeInnerServiceSMOImpl.repostPaidInFeeByWhiteOrder(feeQueryParams); // 填充数据 appendData(result, sheet); return workbook; } /** * 创建表头行 */ private void createHeaderRow(Sheet sheet) { Row row = sheet.createRow(0); String[] headers = { "小区名称", "业主姓名", "房屋信息", "费用类型", "缴费周期", "应收金额", "已收金额", "欠费金额", "缴费状态", "缴费时间", "操作人", "备注", "收费项1", "收费项2", "收费项3", "收费项4", "收费项5", "收费项6", "收费项7", "收费项8", "收费项9", "收费项10", "收费项11", "收费项12", "收费项13", "收费项14", "收费项15" }; for (int i = 0; i < headers.length; i++) { row.createCell(i).setCellValue(headers[i]); } } /** * 填充数据到工作表 */ private void appendData(List result, Sheet sheet) { for (int index = 0; index < result.size(); index++) { Map dataMap = result.get(index); Row row = sheet.createRow(index + 1); // 从第2行开始填充(第1行为表头) for (int j = 1; j <= 27; j++) { String key = "row" + j; Object value = dataMap.get(key); row.createCell(j - 1).setCellValue(value != null ? value.toString() : ""); } } } }