更新积木报表2.0.0注意事项

一、导出接口变更

导出接口由原来的/jmreport/exportPdfStream更新为/jmreport/exportReport。具体见官方文档

1、旧接口springboot实现报表生成并存储pdf文件

public String exportPdf(@RequestParam(name = "id", required = true) String id, @RequestParam(name = "excelConfigId", required = true)String excelConfigId, @RequestParam(name = "rootPath", required = true)String rootPath,@RequestParam(name = "url") String url) {
        // 1、创建url路径 RestUtil.getBaseUrl():你的地址
        String url = RestUtil.getBaseUrl() + "/jmreport/exportPdfStream";
        Map<String, Object> map = new HashMap<>();
        JSONObject object = new JSONObject();
        // 2、此处为示例,需要传递api和sql的正确参数值
        object.put("id", id); //积木报表中sql的传参
        map.put("excelConfigId", excelConfigId); //积木报表id
        map.put("queryParam", object);
        HTTPHeaders headers = new HttpHeaders);
        headers.add("Content-Type", "application/JSON;charset=UTF-8");
        HttpEntity<Map<String, Object>> httpEntity = new HttpEntity<>(map, headers);
        String filePath = "";
        try {
        	// 3、调用积木报表接口
            Resource apiResult = restTemplateConfig.restTemplateHttps().postForObject(url, httpEntity, Resource.class);
            // 4、拿到流
            InputStream inputStream = apiResult.getInputStream();
            byte[] bytes = IOUtils.toByteArray(inputStream);
            String s = "data:application/pdf;base64," + Base64.getEncoder().encodeToString(bytes);
            ByteArrayInputStream stream = null;
            BASE64Decoder decoder = new BASE64Decoder();
            byte[] bt = decoder.decodeBuffer(s);
            stream = new ByteArrayInputStream(bt);
            // 5、存储到minio中
            filePath = MinioUtil.upload(stream,rootPath+"/"+id+".pdf");
            // 6、关闭流
            inputStream.close();
        } catch (RestClientException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return filePath;

2、新接口实现

public String exportYbSbPdf(@RequestParam(name = "batchId", required = true) String batchId, @RequestParam(name = "communityId", required = true) String communityId, @RequestParam(name = "excelConfigId", required = true)String excelConfigId, @RequestParam(name = "rootPath", required = true)String rootPath,@RequestParam(name = "url", required = true)String url) {
        String filePath = "";
        try {
            // 查询参数
            JSONObject queryParam = new JSONObject();
            queryParam.put("batchId", batchId);
            queryParam.put("communityId", communityId);
            // 请求参数
            Map<String, Object> exportParams = new HashMap<>();
            exportParams.put("reportId", excelConfigId);
            exportParams.put("exportType", "pdf");
            exportParams.put("queryParam", queryParam);
            Map<String,Object> map = new HashMap<>();
            List<Map<String, Object>> list = new ArrayList<>();
            list.add(exportParams);
            map.put("exportParams", JSONObject.toJSONString(list));
            // 请求头
            HTTPHeaders headers = new HttpHeaders);
            headers.add("Content-Type", "application/JSON;charset=UTF-8");
            HttpEntity<Map<String, Object>> httpEntity = new HttpEntity<>(map, headers);
            url = "你的地址/jmreport/exportReport" + "?token="+((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest().getHeader("X-Access-Token")+"&exportParams=" + UriEncoder.encode(JSONObject.toJSONString(list));
            ResponseEntity<byte[]> responseEntity = restTemplateConfig.restTemplateHttps().getForEntity(url, byte[].class, httpEntity);

            if (responseEntity.getStatusCode().is2xxSuccessful()) {
                byte[] body = responseEntity.getBody();
                if (body == null || body.length == 0) {
                    throw new RuntimeException("导出内容为空");
                }

                ByteArrayInputStream inputStream = new ByteArrayInputStream(body);
                byte[] bytes = IOUtils.toByteArray(inputStream);
                String s = "data:application/pdf;base64," + Base64.getEncoder().encodeToString(bytes);
                ByteArrayInputStream stream = null;
                BASE64Decoder decoder = new BASE64Decoder();
                byte[] bt = decoder.decodeBuffer(s);
                stream = new ByteArrayInputStream(bt);
                filePath = MinioUtil.upload(stream,rootPath+"/"+batchId+"_"+communityId+".pdf");
                inputStream.close();
            } else {
                throw new RuntimeException("导出失败,HTTP状态码:" + responseEntity.getStatusCode());
            }
        } catch (RestClientException | IOException e) {
            e.printStackTrace();
            throw new RuntimeException("调用报表导出接口失败:" + e.getMessage());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return filePath;
    }

二、积木报表导出pdf出现第一个下面出现大量空白

先说结论:此问题是由于"自动换行"导致的。给单元格设置自动换行其实就是允许单元格根据内容自动调整高度,那么打印时会有以下问题:

  • 单元格自动换行导致当前页面高度超出1页纸了,打印时会将该单元格调整至下一页打印,那么当前页的尾部就会出现部分空白区域:
    在这里插入图片描述

三、积木报表中sql解析后数据类型不正确会导致数据无法预览

解决方案:非必要不填数据类型即可。

四、自我反思

1、升级版本时候要认真阅读升级日志及注意事项;
2、及时查询“调用接口”是否更改;
3、对于上述②③问题,我首先着手通过查看源码以寻求解决方案,最后碰巧解决;因为对于积木报表还是以官方文档为主寻找解决方式。

<think>好的,我现在需要帮用户解决在积木报表中记录打印次数的功能。首先,我得先理解用户的需求。他们想要在每次打印报表时,系统能够自动记录打印的次数,可能是为了统计或者审计用途。接下来,我需要考虑积木报表的功能和可能的实现方法。 积木报表通常是一个报表生成工具,可能支持自定义脚本或者扩展功能。用户提到的引用内容中,引用[3]提到了日结账数据分析、月结算管理等功能,涉及数据统计和打印。这可能意味着他们的系统已经有类似的数据记录机制,可以借鉴这些模块的实现方式。 首先,我需要确定积木报表是否支持在打印操作时触发自定义代码。如果支持,那么可以在打印事件中插入更新数据库的代码。例如,每次用户执行打印操作时,调用一个后端接口,增加对应报表的打印次数。这种方法需要在报表设计时添加打印事件的钩子,比如JavaScript脚本,或者在服务器端处理打印请求时进行计数。 其次,考虑数据库设计。需要有一个表来存储报表的打印次数,可能包括报表ID、打印时间、操作者等信息。例如,可以创建一个`report_print_log`表,包含字段如`report_id`、`print_time`、`user_id`等。每次打印时,向该表插入一条记录,或者更新一个统计字段。 然后,关于前端实现,如果积木报表的打印按钮可以自定义,可以在点击打印按钮时,先执行一个AJAX请求,将打印记录发送到后端保存,再执行实际的打印操作。这需要前端代码的支持,可能涉及到修改报表模板或添加自定义脚本。 另外,引用[2]中提到了VB代码,可能系统使用的是传统的ASP或VB.NET技术栈。如果是这样,可能需要在后端处理打印请求时,增加更新数据库的逻辑。例如,在打印的代码段中,添加更新打印次数的SQL语句。 还需要考虑并发情况,确保多次打印不会导致计数错误。使用数据库的事务处理或者原子操作来保证计数的准确性。例如,使用SQL的UPDATE语句递增打印次数,而不是先查询再更新,以避免竞态条件。 此外,用户权限和审计需求也很重要。记录打印操作的用户和时间,可以帮助后续的审计追踪。引用[3]中的日结账和月结算管理也强调了数据统计的重要性,因此打印次数的记录可能需要整合到现有的统计模块中。 最后,测试和验证。实现功能后,需要测试打印操作是否正确触发记录,数据库中的打印次数是否准确更新,并且在报表的统计界面中能够正确显示打印次数。可能还需要在管理界面中添加打印记录的查询功能,方便用户查看历史记录。 总结可能的步骤: 1. 确定积木报表的打印事件是否能触发自定义代码。 2. 设计数据库表结构来存储打印记录。 3. 编写后端接口处理打印次数的更新。 4. 在前端打印按钮绑定事件,调用后端接口。 5. 确保并发情况下的数据一致性。 6. 集成到现有的统计模块中,方便用户查看。</think>在积木报表中实现记录打印次数功能,可以通过以下步骤完成: ### 方法一:利用数据库触发器 1. **创建打印记录表** ```sql CREATE TABLE report_print_log ( id INT PRIMARY KEY AUTO_INCREMENT, report_id VARCHAR(50) NOT NULL, -- 报表唯一标识 print_time DATETIME DEFAULT CURRENT_TIMESTAMP, -- 打印时间 operator VARCHAR(20) -- 操作人(可选) ); ``` 2. **绑定打印按钮事件** 在报表模板的打印按钮事件中插入SQL语句: ```javascript // 伪代码示例(需根据实际框架调整) printButton.onClick = function() { executeSQL("INSERT INTO report_print_log(report_id, operator) VALUES ('${reportID}', '${currentUser}')"); startPrint(); // 原有打印逻辑 } ``` > 此方法需结合前端事件与后端数据库操作[^3] ### 方法二:后端API计数 1. **编写计数接口** ```java @PostMapping("/recordPrint") public void recordPrint(@RequestParam String reportId, @RequestParam String userId) { // 原子操作保证计数准确 jdbcTemplate.update("UPDATE report_stat SET print_count = print_count + 1 WHERE report_id = ?", reportId); // 同时记录明细 jdbcTemplate.update("INSERT INTO print_detail(report_id, user_id) VALUES (?,?)", reportId, userId); } ``` 2. **修改打印流程** ```javascript function doPrint() { fetch('/api/recordPrint?reportId=123&userId=admin'); window.print(); // 调用浏览器打印 } ``` > 此方法可避免并发问题,适合高频率打印场景 ### 方法三:集成到现有统计模块 1. **扩展日结账分析模块** 在已有的`日营业分析`界面增加打印统计列: ```sql SELECT r.report_name, COUNT(p.id) AS print_times FROM reports r LEFT JOIN report_print_log p ON r.id = p.report_id GROUP BY r.id ``` > 可复用现有数据统计框架 ### 实现效果 1.报表管理界面显示打印次数: $$ \text{打印次数} = \sum_{i=1}^{n} \delta(report\_id_i) $$ 2. 支持按时间范围查询打印记录(日报/月报)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智汇风渔AI小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值