本帖最后由 Bella.Yuan 于 2024-9-23 10:12 编辑
我们在上一篇帖子中介绍了 动态生成报表 的思路和方式,这篇贴子介绍具体的代码实现(VUE项目)。最终的效果如下:
1. 页面设计,下拉组件和按钮我们使用element-plus前段控件实现:
① 页面上创建下拉框,选择要显示的报表;
② 创建两个按钮:创建报表:根据选择的内容生成报表; 预览报表:预览刚刚生成的报表。
③ 报表预览显示区域(wyn-root)。
- <template>
- <!-- 报表选择下拉框 -->
- <div class="m-4" style="background-color: #E5E5E5; padding-top: 20px; padding-bottom: 10px">
- <span style="margin-left: 20px;margin-top: 40px">报表列表:</span>
- <el-select
- v-model="reportSelection"
- multiple
- placeholder="请按顺序选择报表"
- style="width: 360px; background-color: #E5E5E5;"
- collapse-tags
- collapse-tags-tooltip
- :max-collapse-tags="2"
- clearable
- @change="handleChange"
- >
- <el-option
- v-for="item in options"
- :key="item.value"
- :label="item.label"
- :value="item.value"
- />
- </el-select>
-
- <el-button-group>
- <el-button type="primary" @click="createReport">创建报表</el-button>
- <el-button type="primary" @click="viewReport">预览报表</el-button>
- </el-button-group>
- </div>
- <!-- 显示一下选择的报表 -->
- <div class="mydiv">
- <p class="showSelectedReportList">显示的报表: {{ reportSelection.join(",") }}</p>
- </div>
- <!-- 报表显示区域 -->
- <div id="wyn-root"></div>
- </template>
复制代码
2. 创建报表,这一步包括复制、修改、更新和保存新的报表四步:
2.1. 创建报表:根据记录的主报表的id,复制新的报表:- // 获取选择的报表及显示顺序
- createReport() {
- if (this.reportList.length === 0) {
- ElMessage({
- message: '未选中报表,请重新选择!',
- type: 'error', // 消息的类型,可选值:success, warning, info, error
- center: true, // 消息是否居中,默认为 true
- duration: 3000, // 消息框自动关闭前的延迟时间,单位毫秒。设置为 0 或 null 则不会自动关闭
- showClose: false // 是否显示关闭按钮,默认为true
- })
- return;
- }
- //console.log('选中的值是:', this.reportList.join(', ')); // 打印所有选中的值
- var myHeaders = new Headers();
- myHeaders.append("User-Agent", "Apifox/1.0.0 (https://apifox.com)");
- myHeaders.append("Content-Type", "application/json");
- myHeaders.append("Accept", "*/*");
- myHeaders.append("Host", "10.32.209.122:51980");
- myHeaders.append("Connection", "keep-alive");
- const randomIndex = Math.floor(Math.random() * 9000) + 1000
- const newReportName = "主报表-" + randomIndex
- /* 组装请求参数 */
- var raw = JSON.stringify({
- "query": "mutation {\n\t\t\tcopyDocument(\n\t\t\t\tdocumentId:"" + this.documentId + "",\n\t\t\t\tnewDocName:"" + newReportName + "",\n\t\t\t\tcurrentTagId:""\n\t\t\t) { copied_id }\n\t\t}"
- });
- var requestOptions = {
- method: 'POST',
- headers: myHeaders,
- body: raw,
- redirect: 'follow'
- };
- fetch(this.baseUrl + "/api/graphql?token=" + this.token, requestOptions)
- .then(response => response.json())
- .then(result => {
- console.log(result.data.copyDocument.copied_id)
- // 复制的报表id
- this.copyReportId = result.data.copyDocument.copied_id;
- // 获取复制后的报表的json文件
- this.getCopyReport(this.copyReportId)
- })
- .catch(error => console.log('error', error));
- }
复制代码
2.2. 获取创建的报表:并且根据选择的要显示的内容修改报表内容:
- getCopyReport(copyReportId) {
- var myHeaders = new Headers();
- myHeaders.append("User-Agent", "Apifox/1.0.0 (https://apifox.com)");
- myHeaders.append("Accept", "*/*");
- myHeaders.append("Host", "10.32.209.122:51980");
- myHeaders.append("Connection", "keep-alive");
- var requestOptions = {
- method: 'GET',
- headers: myHeaders,
- redirect: 'follow'
- };
- fetch(this.baseUrl + "/api/v2.0/reporting/reports/" + copyReportId + "?token=" + this.token, requestOptions)
- .then(response => response.json())
- .then(result => {
- // 处理报表
- let subReportMap = {}
- result.ReportSections.forEach(function (old) {
- subReportMap[old.Name] = old
- })
- const newReportSections = []
- this.reportList.forEach(function (report) {
- let newSection = subReportMap[report]
- newSection.Visibility.Hidden = false
- newReportSections.push(newSection)
- })
- console.log("============================")
- console.log("newReportSections" + newReportSections)
- console.log("============================")
- result.ReportSections = newReportSections
- this.updateCopyReport(result, copyReportId)
- })
- .catch(error => console.log('error', error));
- }
复制代码
2.3. 更新报表内容:将前一步修改好的报表内容保存到系统中:
- updateCopyReport(report, copyReportId) {
- const myHeaders = new Headers();
- myHeaders.append("User-Agent", "Apifox/1.0.0 (https://apifox.com)");
- myHeaders.append("Content-Type", "application/json");
- myHeaders.append("Accept", "*/*");
- myHeaders.append("Host", "localhost:51980");
- myHeaders.append("Connection", "keep-alive");
- const raw = JSON.stringify({
- "report": JSON.stringify(report),
- "isMaster": false,
- "isTemplate": false
- });
- const requestOptions = {
- method: 'PUT',
- headers: myHeaders,
- body: raw,
- redirect: 'follow'
- };
- const url = this.baseUrl + "/api/v2.0/reporting/reports/" + copyReportId + "?token=" + this.token
- fetch(url, requestOptions)
- .then(response => response.json())
- .then(result => console.log(result))
- .catch(error => console.log('error', error));
- }
复制代码
3. 预览报表:预览新的报表:
- viewReport() {
- console.log("viewer report ++++" + this.copyReportId)
- if (this.reportViewer == null) {
- this.reportViewer = WynIntegration.createReportViewer({
- baseUrl: this.baseUrl,
- token: this.token,
- reportId: ""
- }, '#wyn-root').then(ins => {
- this.reportViewer = ins;
- })
- }
- this.reportViewer.openReport(this.copyReportId);
- }
复制代码
4. 最终的效果如下:
附件是报使用的代码和报表文件,感兴趣的小伙伴可以下载体验哦。
方案的解决思路可以看这篇帖子: 【Wyn7.1】动态拼接报表(一)——解决思路介绍
|
|