Version: 3.8.2

报表扩展开发

EOC根据扩展包中的CustomReport.xml文件来决定报表所使用的前后台。报表扩展按是否使用EOC报表样式分为两种方法:EOC报表样式自定义样式

特点:

  • EOC报表样式: 不用写前端代码,扩展的报表与EOC本身风格一致
  • 自定义样式: 可以根据需求自主决定报表样式

方法

  • 新建项目CustomReport(名称可修改),选择类库(.NET Framework),框架选择.NET Framework 4.6.1

  • 右击项目,添加引用

  • 点击浏览,添加C:\Program Files (x86)\FTIS\FTIS rockwelltpm企业移动现场作业管理软件\rockwelltpm\FTIS.rockwelltpm.ExtReport.dll

注意

注意,为了演示效果,此示例还引用了FTIS.rockwelltpm.Business.dllFTIS.rockwelltpm.Entities.dll

  • 编辑Class1.cs(名称可修改),添加并编辑CustomReport.xml

     * EOC报表样式 * 继承`ICustomReport`,实现`GetCustomReportData`接口,`Class1.cs`内容如下 ```c# using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using FTIS.rockwelltpm.ExtReport; using FTIS.rockwelltpm.Business; using FTIS.rockwelltpm.Entities;
    namespace CustomReport
    {
    public class Class1 : ICustomReport
    {
    public List<Dictionary<string, object>> GetCustomReportData(QueryCondition _queryCondition)
    {
    List<Dictionary<string, object>> result = new List<Dictionary<string, object>>();
    BUser bUser = new BUser(_queryCondition.UserSessionID);
    IList<BaseEntity> users = bUser.GetAll(_queryCondition.ProjectID);
    foreach (User user in users)
    {
    Dictionary<string, object> item = new Dictionary<string, object>();
    item.Add("ID", user.ID);
    item.Add("LoginID", user.LoginID);
    item.Add("Name", user.Name);
    result.Add(item);
    }
    return result;
    }
    }
    }
    ```
    * `CustomReport.xml`内容如下
    ```xml
    <?xml version="1.0" encoding="utf-16"?>
    <CustomReportConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <IsHistory>false</IsHistory>
    <ColumnList>
    <CustomReportColumn>
    <Field>ID</Field>
    <Title>用户ID</Title>
    <Width>0</Width>
    <Type>Unkown</Type>
    <FormatType></FormatType>
    <Visiable>false</Visiable>
    </CustomReportColumn>
    <CustomReportColumn>
    <Field>LoginID</Field>
    <Title>登录名</Title>
    <Width>150</Width>
    <Type>String</Type>
    <FormatType></FormatType>
    <Visiable>true</Visiable>
    </CustomReportColumn>
    <CustomReportColumn>
    <Field>Name</Field>
    <Title>姓名</Title>
    <Width>150</Width>
    <Type>String</Type>
    <FormatType></FormatType>
    <Visiable>true</Visiable>
    </CustomReportColumn>
    </ColumnList>
    <FilterList>
    </FilterList>
    <Toolbar>["Save","SaveAs","CollapseExpandGroup","Query","Export","Refresh"]</Toolbar>
    <OperPanel></OperPanel>
    <DefaultFilterCondition></DefaultFilterCondition>
    <DataAssemblyName>CustomReport.dll</DataAssemblyName>
    <DataClassName>CustomReport.Class1</DataClassName>
    <DataSQL></DataSQL>
    </CustomReportConfig>
    ```
    • 自定义样式

      • 继承ExternalCustomReport,覆写PostToServer方法,Class1.cs内容如下

        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Text;
        using System.Threading.Tasks;
        using FTIS.rockwelltpm.ExtReport;
        using FTIS.rockwelltpm.Business;
        using FTIS.rockwelltpm.Entities;
        namespace CustomReport
        {
        public class Class1 : ExternalCustomReport
        {
        public override object PostToServer(string _operateType, string _parameter)
        {
        if (_operateType == "GetAll") {
        return GetAllUsers();
        }
        else if (_operateType == "Query") {
        return GetAllUsers();
        }
        else
        {
        throw new Exception("非预期查询");
        }
        }
        /// <summary>
        /// 获取所有用户
        /// </summary>
        /// <returns></returns>
        public object GetAllUsers() {
        BUser bUser = new BUser(this.UserSessionID);
        IList<BaseEntity> users = bUser.GetAll(this.ProjectID);
        return users;
        }
        }
        }
      • CustomReport.xml内容如下

        <?xml version="1.0" encoding="utf-16"?>
        <CustomReportConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <IsHistory>false</IsHistory>
        <ColumnList>
        </ColumnList>
        <FilterList>
        </FilterList>
        <DefaultFilterCondition></DefaultFilterCondition>
        <DataAssemblyName>CustomReport.dll</DataAssemblyName>
        <DataClassName>CustomReport.Class1</DataClassName>
        <DataSQL></DataSQL>
        <HtmlFileName>index.html</HtmlFileName>
        </CustomReportConfig>
      • 自定义样式还需要编写前台页面,如index.html

        <!DOCTYPE html>
        <html>
        <head>
        <meta charset="utf-8" />
        <title>用户信息表</title>
        <script src="jquery-1.11.1.min.js" type="text/javascript"></script>
        </head>
        <body>
        <h2>用户信息表</h2>
        <div id="form"></div>
        <script>
        $(document).ready(function () {
        var report = new Report();
        // 固定如此
        window.customReportObj = report;
        report.PostToServer("GetAll", report.parentObj.GetQueryCondition(), function (_result) {
        if (_result.IsSuccess) {
        Draw(_result.Data);
        }
        else {
        console.error(_result.Msg);
        }
        });
        });
        // 绘制表格
        function Draw(_data) {
        var htmls = [];
        htmls.push("<table>");
        htmls.push(" <thead>");
        htmls.push(" <tr>");
        htmls.push(" <th>姓名</th>");
        htmls.push(" <th>登录名</th>");
        htmls.push(" <th>邮箱</th>");
        htmls.push(" </tr>");
        htmls.push(" </thead>");
        htmls.push("<tbody>");
        for (var i = 0; i < _data.length; i++) {
        var user = _data[i];
        htmls.push("<tr>");
        htmls.push(" <td>" + user.Name + "</td>");
        htmls.push(" <td>" + user.LoginID + "</td>");
        htmls.push(" <td>" + user.EMail + "</td>");
        htmls.push("</tr>");
        }
        htmls.push("</tbody>");
        htmls.push("</table>");
        $("#form").html("");
        $("#form").append(htmls.join(""));
        }
        // 构造函数
        function Report() {
        // 固定如此
        this.parentObj = window.parent.customReportIndex;
        }
        // 后台查询
        Report.prototype.PostToServer = function (_operateType, _parameter, _callback) {
        this.parentObj.PostToServer(_operateType, _parameter, _callback);
        }
        // 刷新时调用
        Report.prototype.Query = function () {
        this.PostToServer("Query", this.parentObj.GetQueryCondition(), function (_result) {
        if (_result.IsSuccess) {
        Draw(_result.Data);
        }
        else {
        console.error(_result.Msg);
        }
        });
        }
        </script>
        </body>
        </html>
  • 生成解决方案

  • 在输出目录把CustomReport.dllCustomReport.xml,打包成zip格式的压缩文件Debug.zip

    注意

    如果是自定义样式,还需要将index.html及其引用的jscssimg等资源文件打包进去

  • 使用系统管理员登录EOC,在系统扩展管理中,填写系统扩展名,选择扩展类型自定义报表,选择扩展包文件为刚刚打包完的Debug.zip,点击添加

效果图

  • EOC报表样式

  • 自定义样式

Last updated on