找回密码
 立即注册

QQ登录

只需一步,快速开始

Eden.Sun Wyn认证
超级版主   /  发表于:2024-9-14 14:18  /   查看:46  /  回复:0
本帖最后由 Eden.Sun 于 2024-9-14 15:19 编辑

    我们在上一篇帖子中介绍了 动态生成报表 的思路和方式,这篇贴子介绍具体的代码实现(VUE项目)。最终的效果如下:
    image.png583159484.png189159545.png

    1. 页面设计,下拉组件和按钮我们使用element-plus前段控件实现:
    ① 页面上创建下拉框,选择要显示的报表;
    ② 创建两个按钮:创建报表:根据选择的内容生成报表; 预览报表:预览刚刚生成的报表。
    ③ 报表预览显示区域(wyn-root)。
  1. <template>

  2.   <!-- 报表选择下拉框 -->
  3.   <div class="m-4" style="background-color: #E5E5E5; padding-top: 20px; padding-bottom: 10px">
  4.     <span style="margin-left: 20px;margin-top: 40px">报表列表:</span>
  5.     <el-select
  6.         v-model="reportSelection"
  7.         multiple
  8.         placeholder="请按顺序选择报表"
  9.         style="width: 360px; background-color: #E5E5E5;"
  10.         collapse-tags
  11.         collapse-tags-tooltip
  12.         :max-collapse-tags="2"
  13.         clearable
  14.         @change="handleChange"
  15.     >
  16.       <el-option
  17.           v-for="item in options"
  18.           :key="item.value"
  19.           :label="item.label"
  20.           :value="item.value"
  21.       />
  22.     </el-select>
  23.      
  24.     <el-button-group>
  25.       <el-button type="primary" @click="createReport">创建报表</el-button>
  26.       <el-button type="primary" @click="viewReport">预览报表</el-button>
  27.     </el-button-group>
  28.   </div>
  29.   <!-- 显示一下选择的报表 -->
  30.   <div class="mydiv">
  31.     <p class="showSelectedReportList">显示的报表: {{ reportSelection.join(",") }}</p>
  32.   </div>
  33.   <!-- 报表显示区域 -->
  34.   <div id="wyn-root"></div>

  35. </template>
复制代码

    2. 创建报表,这一步包括复制、修改、更新和保存新的报表四步:
    2.1. 创建报表:根据记录的主报表的id,复制新的报表:
  1. // 获取选择的报表及显示顺序
  2.     createReport() {
  3.       if (this.reportList.length === 0) {
  4.         ElMessage({
  5.           message: '未选中报表,请重新选择!',
  6.           type: 'error', // 消息的类型,可选值:success, warning, info, error
  7.           center: true, // 消息是否居中,默认为 true
  8.           duration: 3000, // 消息框自动关闭前的延迟时间,单位毫秒。设置为 0 或 null 则不会自动关闭
  9.           showClose: false // 是否显示关闭按钮,默认为true
  10.         })
  11.         return;
  12.       }


  13.       //console.log('选中的值是:', this.reportList.join(', ')); // 打印所有选中的值
  14.       var myHeaders = new Headers();
  15.       myHeaders.append("User-Agent", "Apifox/1.0.0 (https://apifox.com)");
  16.       myHeaders.append("Content-Type", "application/json");
  17.       myHeaders.append("Accept", "*/*");
  18.       myHeaders.append("Host", "10.32.209.122:51980");
  19.       myHeaders.append("Connection", "keep-alive");

  20.       const randomIndex = Math.floor(Math.random() * 9000) + 1000
  21.       const newReportName = "主报表-" + randomIndex

  22.       /* 组装请求参数 */
  23.       var raw = JSON.stringify({
  24.         "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}"
  25.       });

  26.       var requestOptions = {
  27.         method: 'POST',
  28.         headers: myHeaders,
  29.         body: raw,
  30.         redirect: 'follow'
  31.       };

  32.       fetch(this.baseUrl + "/api/graphql?token=" + this.token, requestOptions)
  33.           .then(response => response.json())
  34.           .then(result => {
  35.             console.log(result.data.copyDocument.copied_id)
  36.             // 复制的报表id
  37.             this.copyReportId = result.data.copyDocument.copied_id;
  38.             // 获取复制后的报表的json文件
  39.             this.getCopyReport(this.copyReportId)
  40.           })
  41.           .catch(error => console.log('error', error));
  42.     }
复制代码

    2.2. 获取创建的报表:并且根据选择的要显示的内容修改报表内容:
  1. getCopyReport(copyReportId) {
  2.       var myHeaders = new Headers();
  3.       myHeaders.append("User-Agent", "Apifox/1.0.0 (https://apifox.com)");
  4.       myHeaders.append("Accept", "*/*");
  5.       myHeaders.append("Host", "10.32.209.122:51980");
  6.       myHeaders.append("Connection", "keep-alive");

  7.       var requestOptions = {
  8.         method: 'GET',
  9.         headers: myHeaders,
  10.         redirect: 'follow'
  11.       };

  12.       fetch(this.baseUrl + "/api/v2.0/reporting/reports/" + copyReportId + "?token=" + this.token, requestOptions)
  13.           .then(response => response.json())
  14.           .then(result => {
  15.             // 处理报表
  16.             let subReportMap = {}

  17.             result.ReportSections.forEach(function (old) {
  18.               subReportMap[old.Name] = old
  19.             })
  20.             const newReportSections = []
  21.             this.reportList.forEach(function (report) {
  22.               let newSection = subReportMap[report]
  23.               newSection.Visibility.Hidden = false
  24.               newReportSections.push(newSection)
  25.             })
  26.             console.log("============================")
  27.             console.log("newReportSections" + newReportSections)
  28.             console.log("============================")
  29.             result.ReportSections = newReportSections
  30.             this.updateCopyReport(result, copyReportId)
  31.           })
  32.           .catch(error => console.log('error', error));
  33.     }
复制代码


    2.3. 更新报表内容:将前一步修改好的报表内容保存到系统中:

  1.     updateCopyReport(report, copyReportId) {
  2.       const myHeaders = new Headers();
  3.       myHeaders.append("User-Agent", "Apifox/1.0.0 (https://apifox.com)");
  4.       myHeaders.append("Content-Type", "application/json");
  5.       myHeaders.append("Accept", "*/*");
  6.       myHeaders.append("Host", "localhost:51980");
  7.       myHeaders.append("Connection", "keep-alive");

  8.       const raw = JSON.stringify({
  9.         "report": JSON.stringify(report),
  10.         "isMaster": false,
  11.         "isTemplate": false
  12.       });

  13.       const requestOptions = {
  14.         method: 'PUT',
  15.         headers: myHeaders,
  16.         body: raw,
  17.         redirect: 'follow'
  18.       };

  19.       const url = this.baseUrl + "/api/v2.0/reporting/reports/" + copyReportId + "?token=" + this.token
  20.       fetch(url, requestOptions)
  21.           .then(response => response.json())
  22.           .then(result => console.log(result))
  23.           .catch(error => console.log('error', error));
  24.     }
复制代码


    3. 预览报表:预览新的报表:
  1.     viewReport() {
  2.       console.log("viewer report ++++" + this.copyReportId)
  3.       if (this.reportViewer == null) {
  4.         this.reportViewer = WynIntegration.createReportViewer({
  5.           baseUrl: this.baseUrl,
  6.           token: this.token,
  7.           reportId: ""
  8.         }, '#wyn-root').then(ins => {
  9.           this.reportViewer = ins;
  10.         })
  11.       }
  12.       this.reportViewer.openReport(this.copyReportId);
  13.     }
复制代码


    4. 最终的效果如下:
    动态报表.gif806247863.png

    附件是报使用的代码和报表文件,感兴趣的小伙伴可以下载体验哦。
   
   方案的解决思路可以看这篇帖子: 【Wyn7.1】动态报表(一)——解决思路介绍

报表文件.zip

412.25 KB, 下载次数: 0

report-demo.zip

795.87 KB, 下载次数: 0

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部