diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/manager/CheckReportManager.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/manager/CheckReportManager.java index be901ee..1df944e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/manager/CheckReportManager.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/manager/CheckReportManager.java @@ -147,11 +147,8 @@ public class CheckReportManager { List<TdCheckTypeDTO> tdCheckTypeDtoS = Convert.toList(TdCheckTypeDTO.class, list); tdCheckReportDto.setCheckTypeDTOS(tdCheckTypeDtoS); } + ServletOutputStream out = response.getOutputStream(); try { - String fileName = URLEncoder.encode(tdCheckReport.getCheckId() + ".xlsx", "UTF-8"); - response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); - response.setCharacterEncoding("utf-8"); - response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName); // 4. 使用Hutool导出Excel ExcelWriter writer = ExcelUtil.getWriter(true); // 1. 先写入主表数据 @@ -182,9 +179,12 @@ public class CheckReportManager { writer.write(tdCheckReportDto.getCheckTypeDTOS(), true); // 4. 可选:调整列宽自动适应 writer.autoSizeColumnAll(); + String fileName = URLEncoder.encode(tdCheckReport.getCheckId() + ".xlsx", "UTF-8"); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName); // 5. 输出到浏览器 - writer.flush(response.getOutputStream(), true); - writer.close(); + writer.flush(out, true); } catch (Exception e) { log.error("文件下载失败:{}", e.getMessage(), e); try { diff --git a/ruoyi-admin/src/main/resources/templates/system/check/checknum/checknum.html b/ruoyi-admin/src/main/resources/templates/system/check/checknum/checknum.html index 448fe61..8ecc132 100644 --- a/ruoyi-admin/src/main/resources/templates/system/check/checknum/checknum.html +++ b/ruoyi-admin/src/main/resources/templates/system/check/checknum/checknum.html @@ -108,7 +108,8 @@ <th:block th:include="include :: element-js" /> <th:block th:include="include :: echarts-js" /> <script th:inline="javascript"> - var detailFlag = [[${@permission.hasPermi('system:check:detail')}]] + var detailFlag = [[${@permission.hasPermi('system:check:detail')}]]; + var exportDetailFlag = [[${@permission.hasPermi('system:check:exportDetail')}]]; var prefix = ctx + "system/checknum"; var app = new Vue({ el: '#app', @@ -308,6 +309,7 @@ align: 'center', formatter: function(value, row, index) { var actions = []; + actions.push('<a class="btn btn-info btn-xs ' + exportDetailFlag + '" href="javascript:void(0)" onclick="exportDetail(\'' + row.checkId + '\')"><i class="fa fa-download"></i>导出</a> '); actions.push('<a class="btn btn-success btn-xs ' + detailFlag + '" href="javascript:void(0)" onclick="$.operate.detailTab(\'' + row.checkId + '\')"><i class="fa fa-edit"></i>详情</a> '); return actions.join(''); } @@ -315,6 +317,57 @@ }; $.table.init(options); }); + + + /** + * 导出明细 + */ + function exportDetail(checkId) { + // 显示加载中提示 + $.modal.loading("正在生成导出文件,请稍候..."); + // 创建iframe + var iframe = document.createElement('iframe'); + iframe.style.display = 'none'; + iframe.src = prefixTable + '/exportDetail?checkId=' + checkId; + // 记录开始时间 + var startTime = new Date().getTime(); + // 定时检查iframe状态 + var checkInterval = setInterval(function() { + try { + var iframeDoc = iframe.contentDocument || iframe.contentWindow.document; + // 如果iframe内容加载完成 + if (iframeDoc.readyState === 'complete') { + clearInterval(checkInterval); + $.modal.closeLoading(); + // 检查是否是错误响应 + var responseText = iframeDoc.body.textContent || iframeDoc.body.innerText; + if (responseText && responseText.startsWith('{"code":500')) { + var result = JSON.parse(responseText); + $.modal.alertError(result.msg); + } + // 移除iframe + setTimeout(function() { + document.body.removeChild(iframe); + }, 100); + } + // 超时处理(10秒超时) + if (new Date().getTime() - startTime > 10000) { + clearInterval(checkInterval); + $.modal.closeLoading(); + document.body.removeChild(iframe); + $.modal.alertError("导出超时,请重试"); + } + } catch(e) { + // 跨域异常通常表示文件下载成功 + clearInterval(checkInterval); + $.modal.closeLoading(); + setTimeout(function() { + document.body.removeChild(iframe); + }, 100); + } + }, 200); + document.body.appendChild(iframe); + } </script> </body> </html>