本节包括以下主题:
- 开窗查询
- 下拉框联动
- 动态隐藏/禁用
- 字段初始值
- 多重明细表
- 表单数据显示格式
- 值列转换
- 明细表数据自动带出
- 流水号
- 自定义计算函数
- 高级存储
- 明细表数据导入导出
- 多语言
- 系统字段存储到业务表
- 表单字段敏感信息隐藏
- 修改打印页眉页脚
# 开窗查询
可以使用下拉框选择数据,当数据较多时宜使用开窗查询。开窗查询时,系统显示弹出式窗体,用户搜索并选择数据后自动回填表单。
可以选择一条数据回填表单,也可以选择多条数据一次添加到明细表。
开窗查询可以使用对本地数据库、外部数据库,也可以使用ESB数据源。
开窗查询预览
点击按钮,打开供应商查询界面,选择一个供应商后,供应商编号、企业名称、法人代表、营业执照、注册资金等信息回填到表单。
开窗查询配置
在基础字段区域拖出【开窗查询】控件,进行数据源设置:
配置项 | 描述 |
---|---|
数据源 | 开窗查询的数据源。 |
值列 | 开窗查询控件保存的值对应的字段,这里也是显示的字段。 |
视图 | 定义开窗窗体中的显示列,可指定显示那些列,列名,列宽。 |
数据带出 | 选择数据后,哪些字段信息回填到表单,回填到表单上的哪些字段。 |
值列转换 | 勾选值列转换,可以通过配置把开窗查询选择的值列转换成想要显示的字段,数据库存储的依然是值列。功能和值列转换控件一样。 |
配置数据源
设置数据源属性,完成数据源配置。
支持所有类型的数据源、支持使用表单数据动态过滤数据源。
视图
视图决定开窗窗体中的显示列、列名、列宽
当所有列都使用了固定宽度,则最后一列自适应宽度,填充满开窗界面,如果中间列需要自适应宽度,设置自适应宽度为1。
支持多列自适应宽度,当多列自适应宽度为1时,代表多列均分剩下宽度。
数据带出
通过设置数据带出,使数据自动回填到表单。
单选vs多选
开窗查询支持单选与多选,按以下场景选用:
- 主表使用单选;
- 明细表中的一行选择数据使用单选;
- 一次选择多项数据带入明细表使用多选。
单选为基础字段区域的【开窗查询】控件。
多选为高级字段区域的【开窗查询】控件。
单选的【开窗查询】为文本搜索框样式的,多选为按钮形式。
多选开窗查询
需要一次选择多条数据入明细表时,使用多选。
多选开窗按钮只能拖放到明细表的表头的【可拖放按钮区域】和非明细表区域,多选按钮拖放到非明细表区域效果和基础字段区域【开窗查询】控件一样,为单选。
多选效果图:
# 下拉框联动
数据源有过滤功能,使用数据源的过滤,即可实现下拉框之间数据的联动。
比如选择省份后,在城市的选择框内只列出该省份内的城市,如图:
注:省市联动功能可以直接使用【地址】控件,这里以省市联动为例演示怎么配置自定义数据源的数据联动功能。
实现联动
分别设置省份和城市【下拉框】控件的数据源:
使用表单上的数据过滤,即可实现联动。
进阶
不只是下拉框之间可以实现联动,所有输入项(如:文本框、单选框等)变更均可触发数据源过滤,实现联动。
使用运算符(过滤界面第三列),可以实现基于比较的联动,比如列出本月退货大于3次的顾客。
# 动态隐藏/禁用
表单上经常会用到动态隐藏/禁用功能。
比如请假申请,可以勾选请假类型,当勾选“其他”时,需要显示和输入“说明”文本框,如图:
隐藏
设置控件的【隐藏条件】属性后,控件会根据表达式的计算结果实现动态显示和隐藏。
禁用
设置控件的【禁用条件】属性后,控件会根据表达式的计算结果实现动态禁用/启用。
逻辑运算
表单内置计算引擎,会自动分析和计算【计算公式】属性中的表达式,支持逻辑运算。
比较运算符:
等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)。
逻辑运算符:
与(&&)、或(||)、非(!)
表达式范例:
请假类型 != '其他' 或 请假类型 != "其他"
采购金额 < 50000
(采购类型 == '固定资产') && (采购金额 < 50000)
拓展
在隐藏和禁用表单式窗口,除了表单字段和计算函数,还有一个流程变量,可以更灵活的根据流程相关信息来控制字段的隐藏与禁用,如图:
activityId:表示流程步骤活动编号
activityName :表示流程步骤活动编号活动名称
使用举例:在经理审批步骤隐藏或禁用某字段,表达式:$activityId="经理审批"或$activityName=="经理审批"
referenceActivityId:当前打开表单的人曾经处理过的流程步骤的活动编号
referenceActivityName:当前打开表单的人曾经处理过的流程步骤的活动名称
使用举例:在经理审批步骤审批过的单子打开时隐藏某字段,表达式:$referenceActivityId=="经理审批"或$referenceActivityName=="经理审批"
isPost:流程状态为提交
使用举例:流程提交时隐藏或禁用某字段,表达式:$isPost
isProcess:流程状态为审批中
使用举例:流程审批过程中隐藏或禁用某字段,表达式:$isProcess
isRead:表单为只读状态
使用举例:我的申请,我的已办打开表单时隐藏某字段,表达式:$isRead
isInform:知会的表单
使用举例:流程知会的单子,打开隐藏某字段,表达式:$isInform
# 字段初始值
打开表单提交申请时,通常需要带出一些初始信息,比如填单人姓名,申请日期,这时可使用初始值实现。
设置初始值
在流程建模时,可在节点属性→数据控制中,对表单字段设置初始值。
初始值向导
使用初始值向导,只需选择即可完成绝大多数常用初始值的设置。
效果预览
在中间环节设置初始值
初始值可以在开始环节设置,也可以在中间环节设置。
当经理审批关卡需要把审批人姓名自动填写到表单时,就需要在中间关卡设置初始值。
注意:在表单上也可以设置初始值,若同时在表单和流程节点设置初始值,优先使用流程节点上设置的初始值。
# 多重明细表
明细表支持嵌套,即多重明细表,下面以报销为例,讲解一下明细表怎么进行嵌套使用。
首先在布局字段中,拖入子表,并依次拖入子表需要的控件,然后从布局字段中拖入子表到已拖入的子表形成嵌套,再依次拖入控件到嵌套的子表中。
根据需要进行明细表的嵌套层级,如图:
前台嵌套明细表效果
# 表单数据显示格式
通过设置数据格式,实现金额显示、 千分位、小数位数等的控制。
设置格式
备注
设置格式后,输入项的行为类似Excel,当输入焦点离开时,数据自动以指定格式显示,当获得输入焦点时,自动去掉格式,以数字形式显示。
格式只影响显示,在数据库中仍保存为数字。
# 值列转换
值列转换功能,主要用于根据字段转换存储值和显示值。
值匹配字段作为值列保存在数据库,显示列是值列对应的显示字段。
比如,根据供应商编号,进行值列转换,显示供应商名称:
值列转换配置
注:
1、开窗查询控件,自带值列转换属性。可以通过配置直接使用值列转换。
2、值列转换控件具有带出数据的功能,可以将其他字段带出到表单栏位。
# 明细表数据自动带出
打开表单时,我们常常遇到带出明细信息的情况,比如选择某个客户后,带出该客户的拜访记录。
在明细表上设置数据源,可以实现明细表数据自动带出。
设置明细表数据源,用供应商过滤
设置数据映射
注:若不设置过滤,默认自动带出所有明细数据。
# 流水号
每笔业务都有流水号,流水号默认格式为REQ+年+月+4位自增量,如:REQ22040002。
流程号格式
流水号格式为:前缀 + 周期 + 自增量:
例如:PR22040001标识2022年4月第一笔采购单,其中PR表示业务类型。通常不同的流程使用不同的前缀来区分。
设置流水号格式
新建流程时系统会自动设置流水号,默认格式为REQ+年月+4位自增量,如:REQ2022040001,不同流程的流水号通常只需修改前缀。
在流程属性页面、流水号格式项,可点开流水号设置界面。
前缀:
前缀部分的设置为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。
在表单上显示流水号
在表单上拖入【流水号】控件,即可显示流水号。
# 自定义计算函数
计算公式内置了丰富的计算函数,用户也可以用js增加自己的计算函数,并在计算公式中调用。
定义计算函数
在funcs中定义js函数,执行计算返回结果即可。
funcs: { //自定义计算函数
myFunc: function(a, b){
return a*b;
}
}
使用自定义计算函数
在控件计算公式中调用自定义计算函数,语法为:
myadd(参数1,参数2,...);
参数可以是字段或表达式,参数数量不定,系统执时,先计算参数,再将计算结果传递给自定义函数。
自定义函数并不是特殊函数,其性质和sin,cos是同等的计算函数,自定义函数的调用可以是表达式的一部分,其计算结果可以再参与运算。
示范:
myFunc(单价,数量)
sum(myFunc(单价,数量))
大写金额函数
// 数字转换成大写金额函数
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;
}
# 高级存储
高级存储
在集团公司中,为了方便数据统计,有时需要将表单数据存储到指定数据库表中。
就要用到高级存储功能,在表单设计器的高级设置栏目,点击【开启高级存储模式】即可进行配置。
注:添加存储表,默认选择BPM数据库中的表,也可以通过在通用数据源模块,添加第三方数据库,把数据存储到指定的数据库表中。
表单数据独立存储
低代码表单设计器,无需额外配置,表单数据自动存储到默认数据库。
表单数据可以和BPM系统放在一个数据库中,也可以存放到独立的数据库中。
设置表单数据独立存储,在表单属性上,选择表单数据要存储的数据库,本例中是My SQL。
注:表单数据和流程数据不在一个数据库中时,可能增加报表制作的复杂度。
通过在通用数据源模块,添加第三方数据库,可以选择把业务数据存储到独立的数据库中。
# 明细表数据导入导出
明细表数据导出
明细表上的Excel导出按钮,无需配置,即可将明细表数据导出到Excel。
明细表导入
使用【Excel导入】控件可以将Excel数据导入到明细表。
配置
在表单上拖放【Excel导入】控件到明细表按钮拖放区,并设置控件属性:要导入的列数、标题行号、数据开始行及要带入到表单的字段,即可导入Excel数据。
其他属性及作用:
- Excel数据列数:控制可导入列,会影响数据映射中源数据列出
- 标题行号:标题在Excel中位于第几行(从1开始计数)
- 数据开始航: Excel文件中数据开始行(从1开始计数)
多Sheet导入
导入界面会列出所有Excel文件中的Sheet,点击相应的Sheet,可以导入对应Sheet中的数据。
# 多语言
表单上实现多语言,在高级设置→表单多语言模块,开启多语言设置,然后给每个字段设置多语言,目前支持简体-繁体-英文:如图
也可以通过导出和导入Excel来设置,使简繁转换更容易,也方便转发系统外人员翻译。
效果
# 系统字段存储到业务表
在制作表单时,我们希望表单字段存储到第三方数据库。于是在高级设置开启了高级存储模式,如图:我们表单上一共5个字段,但高级设置只有总金额一个字段可以映射。其他4个系统字段,无法映射,此时该怎么办呢?
设置系统字段绑定字段
# 表单字段敏感信息隐藏
表单字段包含敏感信息时希望隐藏或部分隐藏,如图:
实现
在流程属性上的OnFormDataPrepared事件上实现,如图:
示例代码:
//@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);
# 修改打印页眉页脚
表单打印时若要修改页眉页脚,怎么办呢?
修改
在安装包目录找到文件:SetupDisk\CrossPlatform\Web\SourceCode\Web\wwwroot\YZSoft\workflow\form\Abstract.js
在print函数中找到页眉和页脚的部分进行修改,如图: