kre-form
Version:
本项目由 Angular8+ 编写的表单设计器和表单应用,所有的配置都是 JSON 结构体组成,PC 端是基于 ANT 组件库封装
1,478 lines (1,475 loc) • 216 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
export class Formula {
constructor() {
this.FormulaUsage = [
{
category: "班段验证",
categoryCode: "SHIFTVALID",
contains: [
{
name: "ABNORMALHD",
intro: `ABNORMALHD函数用于验证班段全天异常
<br/>
函数包含3个参数可配置:是否加上所有休假项目;是否加上所有公出项目;是否加上所有加班项目
<br/>
规则:
<br/>
(打卡时段(上)+所有休假时段+所有公出时段+所有加班时段)<标准班段(上)
<br/>
(打卡时段(下)+所有休假时段+所有公出时段+所有加班时段)<标准班段(下)
<br/>
二者均符合<br/>
`,
usage: `ABNORMALHD(0,0,0)
<br/>
0代表关闭参数,1代表开启参数
<br/>
验证通过返回值为true,验证不通过返回false
`,
example: `配置:ABNORMALHD(1,0,0)
<br/>
当 打卡时段(上)+所有休假时段<标准班段(上) 或者 打卡时段(下)+所有休假时段<标准班段(下)
<br/>
符合所有情况则返回为true
<br/>
不符合则返回false
`,
},
{
name: "ABNORMALAD",
intro: `ABNORMALAD函数用于验证班段半天异常
<br/>
函数包含3个参数可配置:是否加上所有休假项目;是否加上所有公出项目;是否加上所有加班项目
<br/>
规则:
<br/>
(打卡时段(上)+所有休假时段+所有公出时段+所有加班时段)<标准班段(上)
<br/>
(打卡时段(下)+所有休假时段+所有公出时段+所有加班时段)<标准班段(下)
<br/>
二者仅符合其一
<br/>
`,
usage: `ABNORMALAD(0,0,0)
<br/>
0代表关闭参数,1代表开启参数
<br/>
验证通过返回值为true,验证不通过返回false
<br/>
`,
example: `配置:ABNORMALAD(1,0,0)
<br/>
当 打卡时段(上)+所有休假时段<标准班段(上) 或者 打卡时段(下)+所有休假时段<标准班段(下)
<br/>
符合任意情况则返回为true
<br/>
均不符合则返回false`,
},
],
},
{
category: "计算出勤天数",
categoryCode: "ATSDAYCALC",
contains: [
{
name: "ATTENDANCE1",
intro: `ATTENDANCE1函数用于计算班段上出勤时数
<br/>
函数包含4个参数可配置:是否加上所有休假时段;是否加上所有公出时段;是否加上所有加班时段;允许差值数。
<br/>
规则:
<br/>
打卡时段(班段上)+所有休假时段(班段上)+所有公出时段(班段上)+所有加班时段(班段上)+ 允许差值数 验证是否全覆盖标准班段(班段上)
`,
usage: `ATTENDANCE1(0,0,0,0)
<br/>
前3个参数0代表关闭参数,1代表开启参数
<br/>
后一个参数0代表不允许差值,具体数字代表允许差值分钟数(支持正整数)
<br/>
返回全覆盖则返回当前配置班段时数,未全覆盖则返回0
<br/>
`,
example: `配置:ATTENDANCE1(0,0,0,0)
<br/>
计算班段上出勤天数:ATTENDANCE1(1,0,0,0)
<br/>
当打卡时段(班段上)+所有休假时段(班段上)全覆盖标准班段(班段上)
<br/>
符合情况则返回标准工时(班段上)(时数),均不符合则返回0`,
},
{
name: "ATTENDANCE2",
intro: `ATTENDANCE2函数用于计算班段下出勤时数
<br/>
函数包含4个参数可配置:是否加上所有休假时段;是否加上所有公出时段;是否加上所有加班时段;允许差值数。
<br/>
规则:
<br/>
打卡时段(班段下)+所有休假时段(班段下)+所有公出时段(班段下)+所有加班时段(班段下)+ 允许差值数验证是否全覆盖标准班段(班段下)
`,
usage: `ATTENDANCE2(0,0,0,0)
<br/>
前3个参数0代表关闭参数,1代表开启参数
<br/>
后一个参数0代表不允许差值,具体数字代表允许差值分钟数(支持正整数)
<br/>
返回全覆盖则返回当前配置班段时数,未全覆盖则返回0
<br/>
`,
example: `配置:ATTENDANCE2(0,0,0,0)
<br/>
计算班段下出勤天数:ATTENDANCE2(1,0,0,0)
<br/>
当打卡时段(班段下)+所有休假时段(班段下)全覆盖标准班段(班段下)
<br/>
符合情况则返回标准工时(班段下)(时数),均不符合则返回0`,
},
],
},
{
category: "通用函数",
categoryCode: "BASE",
contains: [
{
name: "PRECISION",
intro: `PRECISION函数用于设置计算结果输出的精度与进位规则
<br/>
函数包含2个参数可配置:精度;进位规则`,
usage: `PRECISION(计算对象,0,0)
<br/>
第一个参数:设置精度,支持属于0-3之间的整数。其余结果按0计算
<br/>
第二个参数:设置进位规则,0代表四舍五入;1代表向上进位;2代表向下进位
<br/>
`,
example: `配置:PRECISION(7.916,1,0),则输出结果为:7.9
<br/>
PRECISION(7.916,2,1),则输出结果为:7.92
<br/>
PRECISION(7.916,2,2),则输出结果为:7.91`,
},
{
name: "Daycompute",
intro: `Daycompute可基于另一个日期型字段加减一个指定的数值,从而计算当前日期型字段的默认值`,
usage: `Daycompute(日期型字段,运算天数)
<br/>
第一个参数:选择日期型字段
<br/>
第二个参数:输入天数,支持正负数;不支持小数
`,
example: `配置:Daycompute(离职日期,1)
<br/>
离职日期=2022/1/1
<br/>
结果输出=2022/1/2
<br/>
配置:Daycompute(离职日期,-1)
<br/>
离职日期=2022/1/1
<br/>
结果输出=2021/12/31
<br/>
`,
},
{
name: "Hourcalculation",
intro: `Hourcalculation用于计算日期时间之间小时数
<br/>
包含6个参数:开始时间;是否包含开始时间;结束时间;是否包含结束时间;最小单位;进位规则`,
usage: `Hourcalculation(开始时间,0,结束时间,0,1,1)
<br/>
第一个参数:选择开始日期字段
<br/>
第二个参数:是否包含开始日期,1代表包含,0代表不包含
<br/>
第三个参数:选择结束日期字段
<br/>
第四个参数:是否包含结束日期,1代表包含,0代表不包含
<br/>
第五个参数:设置最小单位,1代表最小单位为1,0.5代表最小单位为0.5
<br/>
第六个参数:设置进位规则,1代表向上进位,2代表向下进位,3代表取接近值(中间值向下取值),4代表4舍5入(最小单位为1时生效)
<br/>
`,
example: `配置:Hourcalculation(开始时间,1,结束时间,1,1,1)
<br/>
开始日期=10/1 10:00
<br/>
结束日期=10/1 13:30
<br/>
结果输出=4
`,
},
{
name: "SUM",
intro: `SUM用于计算多记录数值型字段求和
<br/>
包含1个参数:字段名称`,
usage: `SUM(明细金额)
<br/>
参数:选择计算字段
`,
example: `配置:SUM(明细金额)
<br/>
明细1为100;明细2为200;明细3为300
<br/>
则汇总金额为:600
`,
},
{
name: "CalendarDay",
intro: `CalendarDay用于获取周期内日历中不用属性日期的天数
<br/>
包含3个参数:1,日历类型;2,日期属性;3,周期类型`,
usage: `CalendarDay(0,0,0)
<br/>
第一个参数日历类型:输入“0”代表获取员工关联日历;输入具体日历名称代表指定日历
<br/>
第二个参数日期属性:输入“0”代表计算自然日天数;输入“1”代表获取工作日天数;输入“2”代表获取公休日天数;输入“3”代表获取节假日天数;输入“4”代表获取周六天数;输入“5”代表获取周日天数;输入“6”代表获取周六天数(排除非公休日的周六);输入“7”代表获取周日天数(排除非公休日的周日)
<br/>
第三个参数周期类型:输入“0”代表统计周期内自然日数据;输入“1”代表统计周期内员工在职区间数据
<br/>
`,
example: `
示例1:
<br/>
CalendarDay(0,0,0)
<br/>
代表获取员工关联日历周期内的自然日天数
<br/>
示例2:
<br/>
CalendarDay(”国家日历“,1,1)
<br/>
代表获取“国家日历”下,周期内,员工在职区间内的工作日天数
`,
},
{
name: "DepartmentScope",
intro: `DepartmentScope函数用于部门选择
<br/>
包含2个参数:1,部门选择;2,包含范围`,
usage: `DepartmentScope('0',0)
<br/>
1,部门选择:输入部门编码,多个部门使用|隔开
<br/>
2,定义包含范围:1,仅本级;2,本级+直接下级;3,本级+所有下级;4,直接下级;5,所有下级
<br/>
`,
example: `
设置DepartmentScope('P01|P02|P03',1)
<br/>
则结果返回部门为:P01,P02,P03
<br/>
`,
},
],
},
{
category: "逻辑函数",
categoryCode: "LOGIC",
contains: [
{
name: "AND",
intro: "如果所有参数都为真,AND函数返回布尔值true,否则返回布尔值false",
usage: "AND(逻辑表达式1,逻辑表达式2,...)",
example: "AND(语文成绩>90,数学成绩>90,英语成绩>90),如果三门课成绩都>90,返回true,否则返回false",
},
{
name: "OR",
intro: "如果任意参数为真,OR 函数返回布尔值true;如果所有参数为假,返回布尔值false",
usage: "OR(逻辑表达式1,逻辑表达式2,...)",
example: "OR(语文成绩>90,数学成绩>90,英语成绩>90),任何一门课成绩> 90,返回true,否则返回false",
},
{
name: "IF",
intro: "IF函数判断一个条件能否满足;如果满足返回一个值,如果不满足则返回另外一个值",
usage: "IF(逻辑表达式,为true时返回的值,为false时返回的值)",
example: 'IF(语文成绩>60,"及格","不及格"),当语文成绩>60时返回及格,否则返回不及格。',
},
{
name: "IN",
intro: "IN函数用于判断目标对象,是否包含在当前限定的范围内,包含则返回true,不包含返回false",
usage: "用法:IN(表名称.字段名称,'参数1','参数2','参数3'......)",
example: `示例:in(组织表.区域,'上海','成都','北京'),判断组织表.区域在上海、成都、北京,符合返回true,否则返回false`,
},
],
},
{
category: "工时计算函数",
categoryCode: "SHIFTTIMECALC",
contains: [
{
name: "MANHOURS",
intro: `MANHOURS函数用于工时(取各类型时段的并集)
<br/>
函数包含5个参数可配置:打卡时数;是否加上休假时段;是否加上公出时段;是否加上加班时段;指定日历类型(0点拆分)
<br/>
规则:
<br/>
打卡时段+所有休假时段/指定休假项目时段+所有公出时段/指定公出项目时段+所有加班时段
<br/>
日历类型:0代表获取所有日历类型,1代表获取工作日,2代表获取公休日,3代表获取节假日
`,
usage: `MANHOURS(0,0,0,0,0)
<br/>
0代表关闭参数;1代表开启参数;选择项目代表指定项目,多个项目“/”分隔
<br/>
返回 计算结果
<br/>
`,
example: `
示例1:
<br/>
计算工时:MANHOURS(1,1,0,0,0)
<br/>
结果返回,打卡时数+所有休假时数(取并集)
<br/>
示例2:
<br/>
计算工时:MANHOURS(1,年假/事假,0,0,0)
<br/>
结果返回,打卡时数+休假项目年假/事假的时数(取并集)
<br/>`,
},
],
},
{
category: "日期间天数计算函数",
categoryCode: "DATECALC",
contains: [
{
name: "Daycalculation",
intro: `Daycalculation用于计算日期之间天数:
<br/>
包含4个参数:开始日期;是否包含开始日期;结束日期;是否包含结束日期
<br/>
`,
usage: `Daycalculation(开始日期,0,结束日期,0)
<br/>
第一个参数:选择开始日期字段
<br/>
第二个参数:是否包含开始日期,1代表包含,0代表不包含
<br/>
第三个参数:选择结束日期字段
<br/>
第四个参数:是否包含结束日期,1代表包含,0代表不包含
<br/>
`,
example: `配置:Daycalculation(开始日期,1,结束日期,1)
<br/>
开始日期=10/1
<br/>
结束日期=10/3
<br/>
结果输出=3
<br/>
`,
},
],
},
{
category: "内置函数",
categoryCode: "BUILTIN",
contains: [
{
name: "VERIFICATION",
intro: `VERIFICATION用于未打卡验证:
<br/>
验证上班后或下班前指定时间内未进行打卡,且期间休假公出记录未全覆盖时则计未打卡
<br/>
函数包含4个参数:
<br/>
`,
usage: `
第一个参数:配置未打卡统计时长,大写X代表获取最大迟到或早退数;输入数字代表指定时长,小于0的数字按0处理(若开启弹性打卡,系统将根据弹性规则动态计算)
<br/>
第二个参数:配置休假记录参与覆盖计算,1代表开启,0代表关闭
<br/>
第三个参数:配置公出记录参与覆盖计算,1代表开启,0代表关闭
<br/>
第四个参数:配置时段间容差分钟数,小于0的数字按0处理
<br/>
`,
example: `若上班未打卡配置(X,1,1,0)
<br/>
则在最大迟到数之间未打卡;或打卡加上休假,公出未完全覆盖上班段,则计未打卡
<br/>
`,
},
],
},
{
category: "编制相关",
categoryCode: "PREPARATION",
contains: [
{
name: "PositionHeadcount",
intro: `PositionHeadcount函数用于表单字段获取当前自定义维度职位编制相关数:
<br/>
包含2个参数:1,获取对象;2,获取值类型
<br/>
`,
usage: `
<br/>
第一个参数获取对象:需填写对应表单的字段编码,字段必须是职位单选组件型字段,用于对应需获取编制所对应的组织
<br/>
第二个参数获取值类型:输入“1”代表获取当前职位编制数;输入“2”代表获取当前职位在编数;输入“3”代表获取当前职位占编数;输入“4”代表获取当前职位缺编数;输入“5”代表获取当前职位超编数
<br/>
前置条件:
<br/>
需当前启用自定义维度编制,且末级统计维度为职位
<br/>
`,
example: `
<br/>
若设置PositionHeadcount(applyinfo$employeebasic$positionid$empmobilize,1)
<br/>
则获取当前表单applyinfo$employeebasic$positionid$empmobilize字段下所选职位的编制数
<br/>
`,
},
],
},
];
/*
FormulaUsage = [
{
category: "班段验证",
contains: [
{
name: "ABNORMALHD",
intro:
"ABNORMALHD函数用于验证班段全天异常;函数包含3个参数可配置:是否加上所有休假项目;是否加上所有公出项目;是否加上所有加班项目",
usage:
"ABNORMALHD(标准班段(上)>打卡时段(上)+所有休假时段+所有公出时段+所有加班时段,标准班段(下)>打卡时段(下)+所有休假时段+所有公出时段+所有加班时段)",
example:
"ABNORMALHD(标准班段(上)>打卡时段(上)+所有休假时段+所有公出时段+所有加班时段,标准班段(下)>打卡时段(下)+所有休假时段+所有公出时段+所有加班时段),二者都满足,返回true,否则返回false",
},
{
name: "ABNORMALAD",
intro:
"ABNORMALAD函数用于验证班段半天异常;函数包含3个参数可配置:是否加上所有休假项目;是否加上所有公出项目;是否加上所有加班项目",
usage:
"ABNORMALAD(标准班段(上)>打卡时段(上)+所有休假时段+所有公出时段+所有加班时段,标准班段(下)>打卡时段(下)+所有休假时段+所有公出时段+所有加班时段)",
example:
"ABNORMALAD(标准班段(上)>打卡时段(上)+所有休假时段+所有公出时段+所有加班时段,标准班段(下)>打卡时段(下)+所有休假时段+所有公出时段+所有加班时段),二者仅符合其一,返回true,否则返回false",
},
],
},
{
category: "数学函数",
contains: [
{
name: "ABS",
intro: "ABS函数可以获取一个数的绝对值",
usage: "ABS(数字)",
example: "ABS(-1)可以返回1,也就是-1的绝对值",
},
{
name: "AVERAGE",
intro: "AVERAGE函数可以获取一组数值的算术平均值",
usage: "AVERAGE(数字1,数字2,...)",
example:
"AVERAGE({语文成绩},{数学成绩}, {英语成绩})返回三门课程的平均分",
},
{
name: "CEILING",
intro: "CEILING函数可以将数字增大到最接近原值的指定因数的倍数",
usage: "CEILING(数字,因数)",
example:
"CEILING(7,6)返回12,因为12比7大的同时,也是6的倍数中最接近7的数字",
},
{
name: "COUNT",
intro: "COUNT函数可以获取参数的数量",
usage: "COUNT(值,值,...)",
example: "COUNT(小明,小王,小张,小李)返回4,也就是人员的数量",
},
{
name: "COUNTIF",
intro: "COUNTIF函数可以获取数组中满足条件的参数个数",
usage: 'COUNTIF(数组,"条件")',
example:
'COUNTIF(子表单.性别, "女"),可得到子表单中性别填的是"女"的数据条数;COUNTIF([1,2,3,4],">2"),可得到1,2,3,4中大于2的数字数量,结果为2。',
},
{
name: "FIXED",
intro: "FIXED函数可将数字舍入到指定的小数位数并输出为文本",
usage: "FIXED(数字,小数位数)",
example: 'FIXED(3.1415,2)返回"3.14"',
},
{
name: "FLOOR",
intro: "FLOOR函数可将数字减小到最接近原值的指定因数的倍数",
usage: "FLOOR(数字,因数)",
example:
"FLOOR(7,6)返回6,因为6比7小的同时,也是6的倍数中最接近7的数字",
},
{
name: "INT",
intro: "INT函数可以获取一个数的整数部分",
usage: "INT(数字)",
example: "INT(3.1415)返回3,也就是3.1415的整数部分",
},
{
name: "LARGE",
intro: "LARGE函数可以获取数据集中第k个最大值",
usage: "LARGE(数组,k)",
example:
'LARGE({学生成绩.数学成绩},1)返回子表单"学生成绩"中排名第1的"数学成绩"',
},
{
name: "LOG",
intro: "LOG函数可以根据指定底数返回数字的对数",
usage: "LOG(数字,底数)",
example: "LOG(100,10)返回2,也就是以10为底数100的对数",
},
{
name: "MAX",
intro: "MAX函数可以获取一组数值的最大值",
usage: "MAX(数字1,数字2,...)",
example:
"MAX({语文成绩},{数学成绩},{英语成绩})返回三门课程中的最高分",
},
{
name: "MIN",
intro: "MIN函数可以获取一组数值的最小值",
usage: "MIN(数字1,数字2,...)",
example:
"MAX({语文成绩},{数学成绩},{英语成绩})返回三门课程中的最低分",
},
{
name: "MOD",
intro: "MOD函数可以获取两数相除的余数",
usage: "MOD(被除数,除数)",
example: "MOD(4,3)返回1,也就是4/3的余数",
},
{
name: "POWER",
intro: "POWER函数可以获取数字乘幂的结果",
usage: "POWER(数字,指数)",
example: "POWER(3,2)返回9,也就是3的2次方",
},
{
name: "PRODUCT",
intro: "PRODUCT函数可以获取一组数值的乘积",
usage: "PRODUCT(数字1,数字2,...)",
example: "PRODUCT({单价}, {数量})获取总价,也就是单价和数量的乘积",
},
{
name: "ROUND",
intro: "ROUND函数可以将数字四舍五入到指定的位数",
usage: "ROUND(数字,数字位数)",
example: "ROUND(3.1485,2)返回3.15",
},
{
name: "SQRT",
intro: "SQRT函数可以获取一个数字的正平方根",
usage: "SQRT(数字)",
example: "SQRT(9)返回3,也就是9的正平方根",
},
{
name: "SUM",
intro: "SUM函数可以获取一组数值的总和",
usage: "SUM(数字1,数字2,...)",
example: "SUM({语文成绩},{数学成绩}, {英语成绩})返回三门课程的总分",
},
{
name: "SUMPRODUCT",
intro:
"SUMPRODUCT函数可以将数组间对应的元素相乘,并返回乘积之和,适用于加权求和",
usage: "SUMPRODUCT(数组,数组...)",
example:
"SUMPRODUCT([1,2,3],[0.1,0.2,0.3])返回1.4,也就是 1×0.1 + 2×0.2 + 3×0.3的值",
},
],
},
{
category: "文本函数",
contains: [
{
name: "CONCATENATE",
intro: "CONCATENATE函数可以将多个文本合并成一个文本",
usage: "CONCATENATE(文本1,文本2,...)",
example:
'CONCATENATE("上海肯耐珂萨人力资源科技股份有限公司","张三")会返回"上海肯耐珂萨人力资源科技股份有限公司张三"',
},
{
name: "EXACT",
intro:
"EXACT函数可以比较两个文本是否完全相同,完全相同则返回true,否则返回false",
usage: "EXACT(文本1, 文本2)",
example:
"EXACT({手机号},{中奖手机号}),如果两者相同,返回true,如果不相同,返回false",
},
{
name: "GETUSERNAME",
intro: "GETUSERNAME函数可以获取当前用户的昵称",
usage: "GETUSERNAME()",
example: "略",
},
{
name: "ISEMPTY",
intro: "ISEMPTY函数可以用来判断值是否为空文本、空对象或者空数组",
usage: "ISEMPTY(文本)",
example: "略",
},
{
name: "LEFT",
intro: "LEFT函数可以从一个文本的第一个字符开始返回指定个数的字符",
usage: "LEFT(文本,文本长度)",
example:
'LEFT("上海肯耐珂萨人力资源科技股份有限公司张三",2)返回"上海",也就是"上海肯耐珂萨人力资源科技股份有限公司张三"的从左往右的前2个字符',
},
{
name: "LEN",
intro: "LEN函数可以获取文本中的字符个数",
usage: "LEN(文本)",
example: 'LEN("朝辞白帝彩云间")返回7,因为这句诗中有7个字符',
},
{
name: "LOWER",
intro: "LOWER函数可以将一个文本中的所有大写字母转换为小写字母",
usage: "LOWER(文本)",
example: 'LOWER("JAYZ")返回"jayz"',
},
{
name: "MID",
intro: "MID返回文本中从指定位置开始的指定数目的字符",
usage: "MID(文本,开始位置_数字,指定数目)",
example:
'MID("肯耐珂萨数字化组织效能提升专家",5,1)返回"数字化组织效能提升专家"',
},
{
name: "REPLACE",
intro: "REPLACE函数可以根据指定的字符数,将部分文本替换为不同的文本",
usage: "REPLACE(文本,开始位置,替换长度,新文本)",
example:
'REPLACE("肯耐珂萨应用定制工具",5,6,"企业数据管理平台")返回"肯耐珂萨企业数据管理平台"',
},
{
name: "REPT",
intro: "REPT函数可以将文本重复一定次数",
usage: "REPT(文本,重复次数)",
example: 'REPT("肯耐珂萨",3)返回"肯耐珂萨肯耐珂萨肯耐珂萨"',
},
{
name: "RIGHT",
intro: "RIGHT函数可以获取由给定文本右端指定数量的字符构成的文本值",
usage: "RIGHT(文本,文本长度)",
example:
'RIGHT("三年二班周杰伦",3)返回"周杰伦",也就是"三年二班周杰伦"从右往左的前3个字符',
},
{
name: "SEARCH",
intro: "SEARCH函数可以获取文本1在文本2中的开始位置",
usage: "SEARCH(文本1,文本2)",
example: 'SEARCH("2021","肯耐珂萨2021")返回4',
},
{
name: "SPLIT",
intro: "SPLIT函数可以将文本按指定分割符分割成数组",
usage: "SPLIT(文本,分隔符_文本)",
example:
'SPLIT("肯耐珂萨-应用定制工具","-")返回"肯耐珂萨,应用定制工具"',
},
{
name: "TEXT",
intro: "TEXT函数可以将数字转化成文本",
usage: "TEXT(数字)",
example: 'TEXT(3.1415)返回"3.1415"',
},
{
name: "TRIM",
intro: "TRIM函数可以删除文本首尾的空格",
usage: "TRIM(文本)",
example: 'TRIM(" 肯耐珂萨 ")返回"肯耐珂萨"',
},
{
name: "UPPER",
intro: "UPPER函数可以将一个文本中的所有小写字母转换为大写字母",
usage: "UPPER(文本)",
example: 'UPPER("jayz")返回"JAYZ"',
},
{
name: "VALUE",
intro: "VALUE函数可以将文本转化为数字",
usage: "VALUE(文本)",
example: 'VALUE("3.1415")返回3.1415',
},
],
},
{
category: "日期函数",
contains: [
{
name: "DATE",
intro: "DATE函数可以将时间戳转换为日期对象",
usage: "DATE(时间戳)",
example: "略",
},
{
name: "DATEDELTA",
intro: "DATEDELTA函数可以将指定日期加/减指定天数",
usage: "DATEDELTA(指定日期,需要加减的天数)",
example: "略",
},
{
name: "DAY",
intro: "DAY函数可以获取某日期是当月的第几日",
usage: "DAY(时间戳)",
example: "略",
},
{
name: "DAYS",
intro: "DAYS函数可以返回两个日期之间相差的天数。",
usage: "DAYS(结束日期,开始日期)",
example: "略",
},
{
name: "DAYS360",
intro: "DAYS360按照一年 360 天的算法,返回两个日期间相差的天数",
usage: "DAYS360(结束日期,开始日期)",
example: "略",
},
{
name: "HOUR",
intro: "HOUR函数可以返回某日期的小时数",
usage: "HOUR(时间戳)",
example: "略",
},
{
name: "ISOWEEKNUM",
intro: "ISOWEEKNUM函数可以返回指定日期在全年中的ISO周数",
usage: "ISOWEEKNUM(指定日期)",
example: "略",
},
{
name: "MINUTE",
intro: "MINUTE函数可以返回某日期的分钟数",
usage: "MINUTE(日期)",
example: "略",
},
{
name: "MONTH",
intro: "MONTH返回某日期的月份",
usage: "MONTH(日期)",
example: "略",
},
{
name: "NOW",
intro: "NOW函数可以获取当前时间",
usage: "NOW()",
example: "略",
},
{
name: "SECOND",
intro: "SECOND函数可以返回某日期的秒数",
usage: "SECOND(日期)",
example: "略",
},
{
name: "SYSTIME",
intro: "SYSTIME函数可以获取当前服务器时间",
usage: "SYSTIME()",
example: "略",
},
{
name: "TIME",
intro: "TIME函数可以返回特定时间的十进制数字",
usage: "TIME(时_数字,分_数字,秒_数字)",
example: "略",
},
{
name: "TIMESTAMP",
intro: "TIMESTAMP函数可以将日期对象转换成时间戳。",
usage: "TIMESTAMP(日期)",
example: "略",
},
{
name: "TODAY",
intro: "TODAY函数可以返回今天",
usage: "TODAY()",
example: "略",
},
{
name: "WEEKNUM",
intro: "WEEKNUM函数可以返回指定日期在当年是第几周",
usage: "WEEKNUM(指定日期)",
example: "略",
},
{
name: "YEAR",
intro: "YEAR函数可以返回某日期的年份",
usage: "YEAR(时间戳)",
example: "略",
},
],
},
{
category: "逻辑函数",
contains: [
{
name: "AND",
intro:
"如果所有参数都为真,AND函数返回布尔值true,否则返回布尔值 false",
usage: "AND(逻辑表达式1,逻辑表达式2,...)",
example:
"AND({语文成绩}>90,{数学成绩}>90,{英语成绩}>90),如果三门课成绩都> 90,返回true,否则返回false",
},
{
name: "FALSE",
intro: "FALSE函数返回布尔值false",
usage: "FALSE()",
example: "略",
},
{
name: "IF",
intro:
"IF函数判断一个条件能否满足;如果满足返回一个值,如果不满足则返回另外一个值",
usage: "IF(逻辑表达式,为true时返回的值,为false时返回的值)",
example:
'IF({语文成绩}>60,"及格","不及格"),当语文成绩>60时返回及格,否则返回不及格。',
},
{
name: "NOT",
intro: "NOT函数返回与指定表达式相反的布尔值。",
usage: "NOT(逻辑表达式)",
example:
"NOT({语文成绩}>60),如果语文成绩大于60返回false,否则返回true",
},
{
name: "OR",
intro:
"如果任意参数为真,OR 函数返回布尔值true;如果所有参数为假,返回布尔值false。",
usage: "OR(逻辑表达式1,逻辑表达式2,...)",
example:
"OR({语文成绩}>90,{数学成绩}>90,{英语成绩}>90),任何一门课成绩> 90,返回true,否则返回false",
},
{
name: "TRUE",
intro: "TRUE函数返回布尔值true",
usage: "TRUE()",
example: "略",
},
{
name: "XOR",
intro: "XOR函数可以返回所有参数的异或值",
usage: "XOR(逻辑表达式1, 逻辑表达式2,...)",
example:
"XOR({语文成绩}>90,{数学成绩}>90),如果两门成绩都>90,返回false;如果两门成绩都<90,返回false;如果其中一门>90,另外一门<90,返回true",
},
],
},
{
category: "高级函数",
contains: [
{
name: "MAPX",
intro: "MAPX函数是一个可以用来进行跨表单取数的高级函数",
usage: "MAPX(operation,map_value,map_field,result_field)",
example: "略",
},
{
name: "RECNO",
intro: "RECNO函数依据当前表单被新打开的次数进行不断累计,起始值为1。",
usage: "RECNO()",
example: "略",
},
{
name: "UUID",
intro: "UUID函数随机码生成器。可适用于随机流水号的使用场景等",
usage: "UUID()",
example: "略",
},
],
},
];
*/
this.FormulaEditor = {
CONST: {
NAME_FILED_CLS: "cm-field-name",
VALUE_FIELD_CLS: "cm-field-value",
INVALID_FIELD_CLS: "cm-field-invalid",
DEPRECATE_FIELD_CLS: "cm-deprecate",
NEGATIVE_FIELD_CLS: "cm-negative",
FIELD_REG: /^\$(_widget_*|_formula_[0-9]{13}|ext|createTime|updateTime|creator|wx_open_id|wx_nickname|wx_gender)/,
},
COMMON_REG: {
VALIDATOR_FORMULA: "(\\$[0-9a-zA-Z._]+#)",
FORM_FORMULA: "(\\$[0-9a-zA-Z._#@]+)",
NEW_LINE: "[\\r\\n]",
},
};
this.Utils = {};
this.Formula = {};
/** @type {?} */
let that = this;
that.Utils = {
/**
* @param {?} a
* @return {?}
*/
isString(a) {
return "string" == typeof a;
},
/**
* @param {?} b
* @return {?}
*/
isNumber(b) {
that.Utils.isNumeric(b);
},
/**
* @param {?} b
* @return {?}
*/
isFunction(b) {
return this.isFunction(b);
},
/**
* @param {?} a
* @return {?}
*/
isDate(a) {
return a instanceof Date;
},
/**
* @param {?} b
* @return {?}
*/
isArray(b) {
return this.isArray(b);
},
/**
* @param {?} a
* @return {?}
*/
isEmpty(a) {
return "" === a || that.Utils.isNull(a);
},
/**
* @param {?} a
* @return {?}
*/
isBlank(a) {
return that.Utils.isNull(a) || "" === a.trim();
},
/**
* @param {?} a
* @return {?}
*/
isNull(a) {
return null == a;
},
/**
* @param {?} a
* @return {?}
*/
isObjectEmpty(a) {
if (null == a)
return !0;
if (a.length > 0)
return !1;
if (0 === a.length)
return !0;
for (var b in a) {
if (this.hasOwnProperty.call(a, b)) {
return !1;
}
return isNaN(a);
}
},
/**
* @param {?} a
* @return {?}
*/
isValueWidget(a) {
return !!this.ValueWidgets[a];
},
/**
* @param {?} a
* @param {?} b
* @param {?} c
* @return {?}
*/
address2Str(a, b, c) {
if (c && a) {
b = "";
/** @type {?} */
var d = !0;
/p/.test(c) &&
a.province &&
((b += a.province), a.province === a.city && (d = !1)),
/c/.test(c) && a.city && d && (b += a.city),
/d/.test(c) && a.district && (b += a.district),
/a/.test(c) && a.detail && (b += a.detail);
}
return b;
},
/**
* @param {?} a
* @param {?} b
* @return {?}
*/
num2Str(a, b) {
if (that.Utils.isEmpty(a))
return "";
/** @type {?} */
var c = a + "";
if (that.Utils.isEmpty(b))
return c;
/** @type {?} */
var d = /\[Num0\]/;
if (d.test(b))
return b.replace(d, c);
if (((d = /\[Num1\]/), d.test(b)))
return b.replace(d, that.Utils._num2CN(c, !1));
if (((d = /\[Num2\]/), d.test(b)))
return b.replace(d, that.Utils._num2CN(c, !0));
d = /[#0]+,?[#0]*\.?[#0]*%?/;
/** @type {?} */
var e = b.match(d);
if (e && e.length > 0) {
/** @type {?} */
var f = e[0];
return (c = that.Utils._numberFormat(a, f)), b.replace(d, c);
}
return b;
},
/**
* @param {?} a
* @param {?} b
* @return {?}
*/
_numberFormat(a, b) {
/** @type {?} */
var c = "";
/** @type {?} */
var d = a + "";
if (/%$/.test(b)) {
(c = "%"), (a = 100 * a), (b = b.replace("%", ""));
/** @type {?} */
var e = d.indexOf(".");
if (e > -1) {
/** @type {?} */
var f = d.length - 3 - e;
(f = f < 0 ? 0 : f > 8 ? 8 : f), (a = parseFloat(a.toFixed(f)));
}
d = a + "";
}
/** @type {?} */
var g = b.split(".");
/** @type {?} */
var h = g[0];
/** @type {?} */
var i = g[1];
if ("" !== i) {
/** @type {?} */
var j = i ? i.length : 0;
d = parseFloat(a).toFixed(j);
/** @type {?} */
let k = d.split("");
for (let l = j; l > 0 && "#" === i.charAt(l - 1); l--) {
/** @type {?} */
let m = k.pop();
if ("0" !== m) {
k.push(m);
break;
}
}
/** @type {?} */
var n = k.pop();
"." === n && (n = ""), (d = k.join("") + n);
}
/** @type {?} */
var o = d.split(".");
/** @type {?} */
var p = o[0];
if (/,/.test(h))
o[0] = p.replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g, "$1,");
else {
/** @type {?} */
var q = h.match(/[0]+[0#]*$/);
q && q.length > 0 && (o[0] = that.Utils.leftPad(p, q[0].length, "0"));
}
return o.join(".") + c;
},
/**
* @param {?} a
* @param {?} b
* @return {?}
*/
_num2CN(a, b) {
/** @type {?} */
var c = "〇一二三四五六七八九";
/** @type {?} */
var d = "个十百千万亿";
b && ((c = "零壹贰叁肆伍陆柒捌玖"), (d = "个拾佰仟万亿"));
/** @type {?} */
var e = Math.floor(Math.abs(a));
/** @type {?} */
var f = Math.abs(a).toString();
/** @type {?} */
var g = f.replace(/\..*$/, "");
/** @type {?} */
var h = f.split(".");
/** @type {?} */
var i = c;
/** @type {?} */
var j = d;
/** @type {?} */
var k = "-.";
/** @type {?} */
var l = i[0];
/** @type {?} */
var m = new RegExp(i[0] + "*$");
/** @type {?} */
var n = new RegExp(i[0] + "+", "g");
/** @type {?} */
var o = "";
/** @type {?} */
var p = "";
if (((o = a < 0 ? k[0] : ""), h.length >= 2)) {
/** @type {?} */
var q = h[1];
if (q) {
p = k[1];
for (var r = 0; r < q.length; r++)
p += i[+q[r]];
}
}
if (1 == g.length)
return o + i[e] + p;
if (g.length <= 5) {
for (var s = "", t = 0, e = g.length; e--;) {
/** @type {?} */
var u = +g[t];
(s += this._num2CN(g[t], b) + (u && e ? j[e] : "")), t++;
}
return (s = s.replace(n, l)), (s = s.replace(m, "")), o + s + p;
}
for (var v = (g.length / 4) >> 0, w = g.length % 4, s = ""; 0 == w || !j[3 + v];)
(w += 4), v--;
if (+g.substr(0, w)) {
s = this._num2CN(g.substr(0, w), b) + j[3 + v];
/** @type {?} */
var x = g.substr(w);
"0" === x[0] && (s += i[0]), (s += this._num2CN(x, b));
}
else
s = this._num2CN(g.substr(0, w), b) + this._num2CN(g.substr(w), b);
return (s = s.replace(n, l)), (s = s.replace(m, "")), o + s + p;
},
/**
* @param {?} a
* @param {?} b
* @return {?}
*/
date2Str(a, b) {
if (!a)
return "";
/** @type {?} */
var c = b.length;
/** @type {?} */
var d = "";
if (c > 0) {
for (var e = b.charAt(0), f = 0, g = e, h = 1; h < c; h++) {
/** @type {?} */
var i = b.charAt(h);
e !== i
? ((d += that.Utils._compileDateFormat({
char: e,
str: g,
len: h - f,
}, a)),
(e = i),
(f = h),
(g = e))
: (g += i);
}
d += that.Utils._compileDateFormat({
char: e,
str: g,
len: c - f,
}, a);
}
return d;
},
/**
* @param {?} a
* @param {?} b
* @return {?}
*/
_compileDateFormat(a, b) {
/** @type {?} */
var c = a.str;
/** @type {?} */
var d = a.len;
/** @type {?} */
var e = a.char;
switch (e) {
case "E":
// c =
// d > 2
// ? Date._DN[b.getDay()]
// : d > 1
// ? Date._SDN[b.getDay()]
// : b.getDay() + "";
break;
case "y":
c = d <= 3 ? (b.getFullYear() + "").slice(2, 4) : b.getFullYear();
break;
case "M":
// c =
// d > 2
// ? Date._MN[b.getMonth()]
// : d < 2
// ? b.getMonth() + 1
// : that.Utils.leftPad(b.getMonth() + 1 + "", 2, "0");
break;
case "d":
c =
d > 1
? that.Utils.leftPad(b.getDate() + "", 2, "0")
: b.getDate();
break;
case "h":
/** @type {?} */
var f = b.getHours() % 12;
0 === f && (f = 12),
(c = d > 1 ? that.Utils.leftPad(f + "", 2, "0") : f);
break;
case "H":
c =
d > 1
? that.Utils.leftPad(b.getHours() + "", 2, "0")
: b.getHours();
break;
case "m":
c =
d > 1
? that.Utils.leftPad(b.getMinutes() + "", 2, "0")
: b.getMinutes();
break;
case "s":
c =
d > 1
? that.Utils.leftPad(b.getSeconds() + "", 2, "0")
: b.getSeconds();
break;
case "a":
c = b.getHours() < 12 ? "am" : "pm";
break;
default:
c = a.str;
}
return c;
},
/**
* @param {?} a
* @param {?} b
* @return {?}
*/
pick(a, b) {
/** @type {?} */
var c = {};
return (that.Utils.forEach(b, (/**
* @param {?} b
* @param {?} d
* @return {?}
*/
function (b, d) {
d in a && (c[d] = a[d]);
})),
c);
},
/**
* @param {?} a
* @param {?} b
* @param {?} c
* @param {?} d
* @return {?}
*/
applyFunc(a, b, c, d) {
return that.Utils.isFunction(b) ? b.apply(a, c ? c : []) : d;
},
/**
* @param {?} a
* @param {?} b
* @return {?}
*/
forEach(a, b) {
if (Array.isArray(a))
for (var c = 0, d = a.length; c < d && b.apply(a[c], [c, a[c]]) !== !1; c++)
;
else if (a && "object" == typeof a)
for (var e in a)
if (a.hasOwnProperty(e) && b.apply(a[e], [e, a[e]]) === !1)
break;
},
/**
* @param {?=} a
* @param {?=} b
* @param {?=} c
* @return {?}
*/
flatten(a, b, c) {
if ((c || (c = []), a))
for (var d = 0, e = a.length; d < e; d++) {
/** @type {?} */
var f = a[d];
Array.isArray(f)
? that.Utils.flatten(f, b, c)
: (b && !b(f)) || c.push(f);
}
return c;
},
/**
* @param {?} a
* @param {?} b
* @return {?}
*/
applyCss(a, b) {
that.Utils.isEmpty(b) ||
(that.Utils.isString(b) ? a.addClass(b) : a.css(b));
},
/**
* @param {?} a
* @return {?}
*/
getServerDate(a) {
if (a && a.getResponseHeader) {
/** @type {?} */
var b = a.getResponseHeader("date");
b &&
((this.STATIC._st = new Date(b).getTime()),
(this.STATIC._ct = new Date().getTime()));
}
},
/**
* @param {?} a
* @return {?}
*/
getUrlParameter(a) {
for (var b = window.location.search.substring(1), c = b.split("&"), d = 0; d < c.length; d++) {
/** @type {?} */
var e = c[d].split("=");
if (e[0] == a)
return e[1];
}
return null;
},
/**
* @param {?} a
* @return {?}
*/
validateEmail(a) {
return /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(a);
},
/**
* @param {?} a
* @return {?}
*/
redirectTo(a) {
window.location.href = a;
},
/**
* @return {?}
*/
isCanvasSupported() {
/** @type {?} */
var a = document.createElement("canvas");
return !(!a.getContext || !a.getContext("2d"));
},
/**
* @return {?}
*/
isFormDataSupported() {
return true; //void 0 !== window["FormData"];
},
/**
* @param {?} a
* @param {?} b
* @param {?} c
* @return {?}
*/
getFileDownloadURL(a, b, c) {
switch (a.bucket) {
case this.CONST.QN_BUCKET.PUBLIC_IMAGE:
/** @type {?} */
var d = "";
/** @type {?} */
var e = a.thumb;
return (e &&
(d =
"?imageView2/" + e.mode + "/w/" + e.width + "/h/" + e.height),
b(this.CONFIG.HOST.IMAGE_HOST + "/" + a.qnKey + d));
case this.CONST.OSS_BUCKET.PUBLIC_IMAGE:
return b(this.CONFIG.HOST.OSS_IMAGE_HOST + "/" + a.ossKey);
case this.CONST.QN_BUCKET.PRIVATE_FILE:
default:
return c();
}
},
/**
* @param {?} a
* @return {?}
*/
evalFormula(a) {
/** @type {?} */
var b = [];
that.Utils.forEach(Object.keys(this.Formula), (/**
* @param {?} a
* @param {?} c
* @return {?}
*/
function (a, c) {
b.push(`let ${c}=fml.Formula.${c}`);
}));
/** @type {?} */
var it = b.join(";") + ";";
/** @type {?} */
var c = new Function(it + "return " + a)();
return c;
},
/**
* @param {?} b
* @param {?} c
* @return {?}
*/
createEntryAttributeField(b, c) {
/** @type {?} */
var d = {
id: c.entryId,
};
switch (b) {
case "ext":
this.extend(d, {
name: "ext",
type: "text",
text: "扩展字段",
items: c.extParams,
});
break;
case "createTime":
this.extend(d, {
name: "createTime",
type: "datetime",
format: "yyyy-MM-dd HH:mm:ss",
text: "提交时间",
});
break;
case "updateTime":
this.extend(d, {
name: "updateTime",
type: "datetime",
format: "yyyy-MM-dd HH:mm:ss",
text: "更新时间",
});
brea