本节包括以下主题:

# 开窗查询

可以使用下拉框选择数据,当数据较多时宜使用开窗查询。开窗查询时,系统显示弹出式窗体,用户搜索并选择数据后自动回填表单。

可以选择一条数据回填表单,也可以选择多条数据一次添加到明细表。

开窗查询可以使用对本地数据库、外部数据库,也可以使用ESB数据源。

开窗查询预览

Image

点击按钮,打开供应商查询界面,选择一个供应商后,供应商编号、企业名称、法人代表、营业执照、注册资金等信息回填到表单。

开窗查询配置

在基础字段区域拖出【开窗查询】控件,进行数据源设置:

Image

配置项
描述
数据源 开窗查询的数据源。
值列 开窗查询控件保存的值对应的字段,这里也是显示的字段。
视图 定义开窗窗体中的显示列,可指定显示那些列,列名,列宽。
数据带出 选择数据后,哪些字段信息回填到表单,回填到表单上的哪些字段。
值列转换 勾选值列转换,可以通过配置把开窗查询选择的值列转换成想要显示的字段,数据库存储的依然是值列。功能和值列转换控件一样。

配置数据源

设置数据源属性,完成数据源配置。

支持所有类型的数据源、支持使用表单数据动态过滤数据源。

Image

视图

视图决定开窗窗体中的显示列、列名、列宽

Image 当所有列都使用了固定宽度,则最后一列自适应宽度,填充满开窗界面,如果中间列需要自适应宽度,设置自适应宽度为1。

支持多列自适应宽度,当多列自适应宽度为1时,代表多列均分剩下宽度。

数据带出

通过设置数据带出,使数据自动回填到表单。

Image

单选vs多选

开窗查询支持单选与多选,按以下场景选用:

  • 主表使用单选;
  • 明细表中的一行选择数据使用单选;
  • 一次选择多项数据带入明细表使用多选。

Image

单选为基础字段区域的【开窗查询】控件。

多选为高级字段区域的【开窗查询】控件。

单选的【开窗查询】为文本搜索框样式的,多选为按钮形式。

多选开窗查询

需要一次选择多条数据入明细表时,使用多选。

多选开窗按钮只能拖放到明细表的表头的【可拖放按钮区域】和非明细表区域,多选按钮拖放到非明细表区域效果和基础字段区域【开窗查询】控件一样,为单选。

多选效果图:

Image

# 下拉框联动

数据源有过滤功能,使用数据源的过滤,即可实现下拉框之间数据的联动。

比如选择省份后,在城市的选择框内只列出该省份内的城市,如图:

Image

注:省市联动功能可以直接使用【地址】控件,这里以省市联动为例演示怎么配置自定义数据源的数据联动功能。

实现联动

分别设置省份和城市【下拉框】控件的数据源:

Image Image

使用表单上的数据过滤,即可实现联动。

Image

进阶

不只是下拉框之间可以实现联动,所有输入项(如:文本框、单选框等)变更均可触发数据源过滤,实现联动。

使用运算符(过滤界面第三列),可以实现基于比较的联动,比如列出本月退货大于3次的顾客。

# 动态隐藏/禁用

表单上经常会用到动态隐藏/禁用功能。

比如请假申请,可以勾选请假类型,当勾选“其他”时,需要显示和输入“说明”文本框,如图:

Image

隐藏

设置控件的【隐藏条件】属性后,控件会根据表达式的计算结果实现动态显示和隐藏。

Image

禁用

设置控件的【禁用条件】属性后,控件会根据表达式的计算结果实现动态禁用/启用。

逻辑运算

表单内置计算引擎,会自动分析和计算【计算公式】属性中的表达式,支持逻辑运算。

比较运算符:

等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)。

逻辑运算符:

与(&&)、或(||)、非(!)

表达式范例:

请假类型 != '其他' 或 请假类型 != "其他"

采购金额 < 50000

(采购类型 == '固定资产') && (采购金额 < 50000)

拓展

在隐藏和禁用表单式窗口,除了表单字段和计算函数,还有一个流程变量,可以更灵活的根据流程相关信息来控制字段的隐藏与禁用,如图:

Image

activityId:表示流程步骤活动编号
activityName :表示流程步骤活动编号活动名称
使用举例:在经理审批步骤隐藏或禁用某字段,表达式:$activityId="经理审批"或$activityName=="经理审批"

referenceActivityId:当前打开表单的人曾经处理过的流程步骤的活动编号
referenceActivityName:当前打开表单的人曾经处理过的流程步骤的活动名称
使用举例:在经理审批步骤审批过的单子打开时隐藏某字段,表达式:$referenceActivityId=="经理审批"或$referenceActivityName=="经理审批"

isPost:流程状态为提交
使用举例:流程提交时隐藏或禁用某字段,表达式:$isPost

isProcess:流程状态为审批中
使用举例:流程审批过程中隐藏或禁用某字段,表达式:$isProcess

isRead:表单为只读状态
使用举例:我的申请,我的已办打开表单时隐藏某字段,表达式:$isRead

isInform:知会的表单
使用举例:流程知会的单子,打开隐藏某字段,表达式:$isInform

# 字段初始值

打开表单提交申请时,通常需要带出一些初始信息,比如填单人姓名,申请日期,这时可使用初始值实现。

设置初始值

在流程建模时,可在节点属性→数据控制中,对表单字段设置初始值。

Image

初始值向导

使用初始值向导,只需选择即可完成绝大多数常用初始值的设置。

Image

效果预览

Image

在中间环节设置初始值

初始值可以在开始环节设置,也可以在中间环节设置。

当经理审批关卡需要把审批人姓名自动填写到表单时,就需要在中间关卡设置初始值。

注意:在表单上也可以设置初始值,若同时在表单和流程节点设置初始值,优先使用流程节点上设置的初始值。

# 多重明细表

明细表支持嵌套,即多重明细表,下面以报销为例,讲解一下明细表怎么进行嵌套使用。

首先在布局字段中,拖入子表,并依次拖入子表需要的控件,然后从布局字段中拖入子表到已拖入的子表形成嵌套,再依次拖入控件到嵌套的子表中。

根据需要进行明细表的嵌套层级,如图:

Image

前台嵌套明细表效果

Image

# 表单数据显示格式

通过设置数据格式,实现金额显示、 千分位、小数位数等的控制。

Image

设置格式

Image

备注

设置格式后,输入项的行为类似Excel,当输入焦点离开时,数据自动以指定格式显示,当获得输入焦点时,自动去掉格式,以数字形式显示。

格式只影响显示,在数据库中仍保存为数字。

# 值列转换

值列转换功能,主要用于根据字段转换存储值和显示值。

值匹配字段作为值列保存在数据库,显示列是值列对应的显示字段。

比如,根据供应商编号,进行值列转换,显示供应商名称:

Image

值列转换配置

Image 注:

1、开窗查询控件,自带值列转换属性。可以通过配置直接使用值列转换。

2、值列转换控件具有带出数据的功能,可以将其他字段带出到表单栏位。

# 明细表数据自动带出

打开表单时,我们常常遇到带出明细信息的情况,比如选择某个客户后,带出该客户的拜访记录。

在明细表上设置数据源,可以实现明细表数据自动带出。

Image

设置明细表数据源,用供应商过滤

Image

设置数据映射

Image

注:若不设置过滤,默认自动带出所有明细数据。

# 流水号

每笔业务都有流水号,流水号默认格式为REQ+年+月+4位自增量,如:REQ22040002。

Image

流程号格式

流水号格式为:前缀 + 周期 + 自增量:

Image

例如:PR22040001标识2022年4月第一笔采购单,其中PR表示业务类型。通常不同的流程使用不同的前缀来区分。

设置流水号格式

新建流程时系统会自动设置流水号,默认格式为REQ+年月+4位自增量,如:REQ2022040001,不同流程的流水号通常只需修改前缀。

在流程属性页面、流水号格式项,可点开流水号设置界面。

Image

前缀:

前缀部分的设置为asp.net语法,C#语言,REQ<%=DateTime.Today.ToString("yyyyMM")%>执行结果为流程的前缀+计数周期,比如2022年4月15日执行,前缀为202204、2022年4月15日执行结果为202204。

自增量:

后缀位数 - 控制自增量的显示,当位数不足时自动补0,当位数超过时显示实际位数。

开始值 - 计数的种子,通常为1,100代表每个计数周期从100开始计数。

增量 - 计数增加值,通常为1。

开始值100,增量10,第一笔单 100,以后的业务110、120、130。

在表单上显示流水号

在表单上拖入【流水号】控件,即可显示流水号。

Image

# 自定义计算函数

计算公式内置了丰富的计算函数,用户也可以用js增加自己的计算函数,并在计算公式中调用。

定义计算函数

在funcs中定义js函数,执行计算返回结果即可。

funcs: { //自定义计算函数

        myFunc: function(a, b){
            return a*b;
        }
    }

使用自定义计算函数

在控件计算公式中调用自定义计算函数,语法为:

myadd(参数1,参数2,...);

参数可以是字段或表达式,参数数量不定,系统执时,先计算参数,再将计算结果传递给自定义函数。

自定义函数并不是特殊函数,其性质和sin,cos是同等的计算函数,自定义函数的调用可以是表达式的一部分,其计算结果可以再参与运算。

示范:

myFunc(单价,数量)

sum(myFunc(单价,数量))

大写金额函数

Image Image

// 数字转换成大写金额函数

    atoc:function(numberValue) {
    var numberValue = new String(Math.round(numberValue * 100)); // 数字金额
    var chineseValue = ""; // 转换后的汉字金额
    var String1 = "零壹贰叁肆伍陆柒捌玖"; // 汉字数字
    var String2 = "万仟佰拾亿仟佰拾万仟佰拾元角分"; // 对应单位
    var len = numberValue.length; // numberValue 的字符串长度
    var Ch1; // 数字的汉语读法
    var Ch2; // 数字位的汉字读法
    var nZero = 0; // 用来计算连续的零值的个数
    var String3; // 指定位置的数值
    if (len > 15) {
        alert("超出计算范围");
        return "";
    }
    if (numberValue == 0) {
        chineseValue = "零元整";
        return chineseValue;
    }
    String2 = String2.substr(String2.length - len, len); // 取出对应位数的STRING2的值
    for (var i = 0; i < len; i++) {
        String3 = parseInt(numberValue.substr(i, 1), 10); // 取出需转换的某一位的值
        if (i != (len - 3) && i != (len - 7) && i != (len - 11) && i != (len - 15)) {
            if (String3 == 0) {
                Ch1 = "";
                Ch2 = "";
                nZero = nZero + 1;
            }
            else if (String3 != 0 && nZero != 0) {
                Ch1 = "零" + String1.substr(String3, 1);
                Ch2 = String2.substr(i, 1);
                nZero = 0;
            }
            else {
                Ch1 = String1.substr(String3, 1);
                Ch2 = String2.substr(i, 1);
                nZero = 0;
            }
        }
        else { // 该位是万亿,亿,万,元位等关键位
            if (String3 != 0 && nZero != 0) {
                Ch1 = "零" + String1.substr(String3, 1);
                Ch2 = String2.substr(i, 1);
                nZero = 0;
            }
            else if (String3 != 0 && nZero == 0) {
                Ch1 = String1.substr(String3, 1);
                Ch2 = String2.substr(i, 1);
                nZero = 0;
            }
            else if (String3 == 0 && nZero >= 3) {
                Ch1 = "";
                Ch2 = "";
                nZero = nZero + 1;
            }
            else {
                Ch1 = "";
                Ch2 = String2.substr(i, 1);
                nZero = nZero + 1;
            }
            if (i == (len - 11) || i == (len - 3)) { // 如果该位是亿位或元位,则必须写上
                Ch2 = String2.substr(i, 1);
            }
        }
        chineseValue = chineseValue + Ch1 + Ch2;
    }
    if (String3 == 0) { // 最后一位(分)为0时,加上“整”
        chineseValue = chineseValue + "整";
    }
    return chineseValue;
}

# 高级存储

高级存储

在集团公司中,为了方便数据统计,有时需要将表单数据存储到指定数据库表中。

就要用到高级存储功能,在表单设计器的高级设置栏目,点击【开启高级存储模式】即可进行配置。

Image

注:添加存储表,默认选择BPM数据库中的表,也可以通过在通用数据源模块,添加第三方数据库,把数据存储到指定的数据库表中。

表单数据独立存储

低代码表单设计器,无需额外配置,表单数据自动存储到默认数据库。

表单数据可以和BPM系统放在一个数据库中,也可以存放到独立的数据库中。

设置表单数据独立存储,在表单属性上,选择表单数据要存储的数据库,本例中是My SQL。

Image

注:表单数据和流程数据不在一个数据库中时,可能增加报表制作的复杂度。

  通过在通用数据源模块,添加第三方数据库,可以选择把业务数据存储到独立的数据库中。

# 明细表数据导入导出

明细表数据导出

明细表上的Excel导出按钮,无需配置,即可将明细表数据导出到Excel。

Image

明细表导入

使用【Excel导入】控件可以将Excel数据导入到明细表。

Image

配置

在表单上拖放【Excel导入】控件到明细表按钮拖放区,并设置控件属性:要导入的列数、标题行号、数据开始行及要带入到表单的字段,即可导入Excel数据。

Image

其他属性及作用:

Image

  • Excel数据列数:控制可导入列,会影响数据映射中源数据列出
  • 标题行号:标题在Excel中位于第几行(从1开始计数)
  • 数据开始航: Excel文件中数据开始行(从1开始计数)

多Sheet导入

导入界面会列出所有Excel文件中的Sheet,点击相应的Sheet,可以导入对应Sheet中的数据。

Image

# 多语言

表单上实现多语言,在高级设置→表单多语言模块,开启多语言设置,然后给每个字段设置多语言,目前支持简体-繁体-英文:如图

也可以通过导出和导入Excel来设置,使简繁转换更容易,也方便转发系统外人员翻译。

Image

效果

Image

# 系统字段存储到业务表

在制作表单时,我们希望表单字段存储到第三方数据库。于是在高级设置开启了高级存储模式,如图:我们表单上一共5个字段,但高级设置只有总金额一个字段可以映射。其他4个系统字段,无法映射,此时该怎么办呢?

Image

Image

设置系统字段绑定字段

Image

Image

# 表单字段敏感信息隐藏

表单字段包含敏感信息时希望隐藏或部分隐藏,如图:

Image

实现

在流程属性上的OnFormDataPrepared事件上实现,如图:

Image

示例代码:

//@event : FormDataPreparedEvent 事件信息
  var columnName = "采购原因";

//对字段数据做保密处理
 if (@event.IsOpenFormRead || //打开历史表单
    (@event.IsOpenFormProcess && !Context.FormRootRow.ParentTable.Columns[columnName].Write)) //审批步骤,指定字段设置为只读时
    Context.FormRootRow[columnName] = Convert.ToString(Context.FormRootRow[columnName]).Mask(4,3);

# 修改打印页眉页脚

表单打印时若要修改页眉页脚,怎么办呢?

Image

修改

在安装包目录找到文件:SetupDisk\CrossPlatform\Web\SourceCode\Web\wwwroot\YZSoft\workflow\form\Abstract.js

在print函数中找到页眉和页脚的部分进行修改,如图:

Image