diff --git a/resource/WEB-INF/config/MyBatis.xml b/resource/WEB-INF/config/MyBatis.xml
new file mode 100644
index 000000000..31cc6f0dd
--- /dev/null
+++ b/resource/WEB-INF/config/MyBatis.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resource/WEB-INF/lib/QLExpress-3.2.0.jar b/resource/WEB-INF/lib/QLExpress-3.2.0.jar
new file mode 100644
index 000000000..52f48b289
Binary files /dev/null and b/resource/WEB-INF/lib/QLExpress-3.2.0.jar differ
diff --git a/resource/WEB-INF/lib/pagehelper-5.0.0.jar b/resource/WEB-INF/lib/pagehelper-5.0.0.jar
new file mode 100644
index 000000000..187266c88
Binary files /dev/null and b/resource/WEB-INF/lib/pagehelper-5.0.0.jar differ
diff --git a/resource/WEB-INF/prop/hrmSalary.properties b/resource/WEB-INF/prop/hrmSalary.properties
new file mode 100644
index 000000000..743f4df00
--- /dev/null
+++ b/resource/WEB-INF/prop/hrmSalary.properties
@@ -0,0 +1,5 @@
+log=false
+defaultCloseNonStandard149=true
+AESEncryptScrect=990EB004A1C862721C1513AE90038C9E
+version=2.7.3.2304.01
+openFormulaForcedEditing=false
\ No newline at end of file
diff --git a/src/com/engine/salary/constant/des.json b/src/com/engine/salary/constant/des.json
new file mode 100644
index 000000000..fe3b8ce5f
--- /dev/null
+++ b/src/com/engine/salary/constant/des.json
@@ -0,0 +1,1528 @@
+{
+ "data": [
+ {
+ "children": [
+ {
+ "name": "CONCAT",
+ "chineseName": "链接多个文本",
+ "description": "可用于连接多个任意类型的文本、日期、数字变量或常量。最后一个字符可使用'#分隔符#'标记为分隔符",
+ "example": "CONCAT({总价}/10000, '万元')",
+ "result": "100万元",
+ "paramDescs": [
+ "*文本1*(必选)",
+ "*文本2*(可选)",
+ "......"
+ ],
+ "formatString": "CONCAT(文本1, 文本2, [文本3, …],[#分隔符#])",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "string",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": -1,
+ "paramStatuses": [
+ {
+ "dataType": "string",
+ "must": true,
+ "infinite": true
+ }
+ ]
+ },
+ {
+ "name": "TEXT",
+ "chineseName": "将变量转为文本",
+ "description": "将变量转为文本。",
+ "example": "TEXT({当前数据.性别})",
+ "result": "'男'",
+ "paramDescs": [
+ "*变量*(必选)"
+ ],
+ "formatString": "TEXT(变量)",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "string",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 1,
+ "paramStatuses": [
+ {
+ "dataType": "all",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "VALUE",
+ "chineseName": "将文本转为数字",
+ "description": "将文本转为数字。",
+ "example": "VALUE('23')",
+ "result": "23",
+ "paramDescs": [
+ "*文本、数字、选项*(必选)"
+ ],
+ "formatString": "VALUE([文本、数字、选项])",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "number",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 1,
+ "paramStatuses": [
+ {
+ "dataType": "all",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "LEN",
+ "chineseName": "返回文本长度",
+ "description": "返回文本的长度,中文、英文都算1个字符。",
+ "example": "LEN('大家好dajiahao')",
+ "result": "12",
+ "paramDescs": [
+ "*变量或常量*(必选)"
+ ],
+ "formatString": "LEN(文本)",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "number",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 1,
+ "paramStatuses": [
+ {
+ "dataType": "string",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "SEARCH",
+ "chineseName": "在文本中查找关键字",
+ "description": "在指定文本中查找关键字,返回第一次出现关键字的字符位置,文本的第一个字记为1。未找到,返回0。搜索开始位置,表示从文本的第几个字符开始搜索,默认为1。",
+ "example": "SEARCH('大家', '大家好大家好', 3)",
+ "result": "4",
+ "paramDescs": [
+ "*文本关键字*(必选)",
+ "*文本*(必选)",
+ "*搜索开始位置*(可选)"
+ ],
+ "formatString": "SEARCH(关键字, 文本, [搜索开始位置])",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "number",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 3,
+ "paramStatuses": [
+ {
+ "dataType": "string",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "string",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "number",
+ "must": false,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "REPLACE",
+ "chineseName": "替换文本中的字",
+ "description": "在原文本中,从替换位置开始,往后数指定的替换字符数,将这段文本替换为新文本。",
+ "example": "REPLACE('大家好大家好', 2, 3, 'dajia')",
+ "result": "'大dajia家好'",
+ "paramDescs": [
+ "*文本*(必选)"
+ ],
+ "formatString": "REPLACE(原文本, 替换开始位置, 替换字符数, 新文本)",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "string",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 4,
+ "paramStatuses": [
+ {
+ "dataType": "string",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "number",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "number",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "string",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "REPT",
+ "chineseName": "将文本重复指定次数",
+ "description": "将文本重复指定次数。",
+ "example": "REPT('大家', 2)",
+ "result": "'大家大家'",
+ "paramDescs": [
+ "*文本*(必选)",
+ "*重复次数*(必选)"
+ ],
+ "formatString": "REPT(文本, 重复次数)",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "string",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 2,
+ "paramStatuses": [
+ {
+ "dataType": "string",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "number",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "PAD",
+ "chineseName": "将文本填充至指定长度",
+ "description": "将原文本填充到指定长度,如果文本长度大于设置的长度,则不做任何操作。填充位置可用参数:'LEFT'、'RIGHT'。",
+ "example": "PAD('你好', 4, '你', 'LEFT')",
+ "result": "'你你你好'",
+ "paramDescs": [
+ "*原文本*(必选)",
+ "*长度*(必选)",
+ "*填充用的文本*(必选)",
+ "*填充位置*(可选)"
+ ],
+ "formatString": "PAD(原文本, 长度, 填充用的文本, [填充位置])",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "string",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 4,
+ "paramStatuses": [
+ {
+ "dataType": "string",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "number",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "string",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "string",
+ "must": true,
+ "constType": [
+ "RIGHT",
+ "LEFT"
+ ],
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "TRIM",
+ "chineseName": "清除前后空格",
+ "description": "删除文本首尾的空格。",
+ "example": "TRIM(' 大家好 ')",
+ "result": "'大家好'",
+ "paramDescs": [
+ "*文本*(必选)"
+ ],
+ "formatString": "TRIM(文本)",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "string",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 1,
+ "paramStatuses": [
+ {
+ "dataType": "string",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "LEFT",
+ "chineseName": "返回文本左侧开始的文字",
+ "description": "从文本左侧开始,返回指定字符数的文字。",
+ "example": "LEFT('大家好', 2)",
+ "result": "'大家'",
+ "paramDescs": [
+ "*文本*(必选)",
+ "*截取字符数*(必选)"
+ ],
+ "formatString": "LEFT(文本, 截取字符数)",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "string",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 2,
+ "paramStatuses": [
+ {
+ "dataType": "string",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "number",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "RIGHT",
+ "chineseName": "返回文本右侧开始的文字",
+ "description": "从文本右侧开始,返回指定字符数的文字。",
+ "example": "RIGHT('大家好', 2)",
+ "result": "'家好'",
+ "paramDescs": [
+ "*文本*(必选)",
+ "*截取字符数*(必选)"
+ ],
+ "formatString": "RIGHT(文本, 截取字符数)",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "string",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 2,
+ "paramStatuses": [
+ {
+ "dataType": "string",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "number",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "MID",
+ "chineseName": "返回文本指定位置开始的文字",
+ "description": "从文本指定位置之后开始,返回指定字符数的文字。",
+ "example": "MID('大家好', 2, 1)",
+ "result": "'家'",
+ "paramDescs": [
+ "*文本*(必选)",
+ "*指定位置*(必选)",
+ "*截取字符数*(必选)"
+ ],
+ "formatString": "MID(文本, 指定位置, 截取字符数)",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "string",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 3,
+ "paramStatuses": [
+ {
+ "dataType": "string",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "number",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "number",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "SCORE",
+ "chineseName": "获取选项型控件分数",
+ "description": "获取选项型控件(单选框、复选框、下拉菜单)分数。",
+ "example": "SCORE({当前数据.单选框})",
+ "result": "选项分数(注:未设置选项分数时,结果为0)",
+ "paramDescs": [
+ "*选项*(必选)"
+ ],
+ "formatString": "SCORE({选项})",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "number",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 1,
+ "paramStatuses": [
+ {
+ "dataType": "option",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "IDCARD",
+ "chineseName": "身份证函数",
+ "description": "从身份证号码中获取相关信息,比如:生日(BD)、年龄(AGE)、籍贯(NA)、性别(GENDER)。",
+ "example": "IDCARD( ‘43070319980706334X’ , ‘BD’ )",
+ "result": "'1998-07-06'",
+ "paramDescs": [
+ "*身份证号码*(必选)",
+ "*查找类型*(必选)"
+ ],
+ "formatString": "IDCARD({身份证号码}, {查找类型})",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "string",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 2,
+ "paramStatuses": [
+ {
+ "dataType": "string",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "string",
+ "must": true,
+ "constType": [
+ "BD",
+ "NA",
+ "AGE",
+ "GENDER"
+ ],
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "ISSTRING",
+ "chineseName": "是否是字符串",
+ "description": "判断是否是字符。",
+ "example": "ISSTRING('泛微123456')",
+ "result": "true",
+ "paramDescs": [
+ "*变量或常量*(必选)"
+ ],
+ "formatString": "ISSTRING({任意控件})",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "boolean",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 1,
+ "paramStatuses": [
+ {
+ "dataType": "all",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ }
+ ],
+ "dataType": "char",
+ "name": "字符函数",
+ "action": "DataSource",
+ "type": "functions"
+ },
+ {
+ "children": [
+ {
+ "name": "TODAY",
+ "chineseName": "当前日期",
+ "description": "返回当天日期。",
+ "example": "TODAY()",
+ "result": "'2020-01-01'",
+ "formatString": "TODAY()",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "date",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 0
+ },
+ {
+ "name": "NOW",
+ "chineseName": "当前日期时间",
+ "description": "返回当天日期+时间。",
+ "example": "NOW()",
+ "result": "'2016-12-24 12:05:38'",
+ "formatString": "NOW()",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "date",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 0
+ },
+ {
+ "name": "DATEADD",
+ "chineseName": "对日期加减年、月、日",
+ "description": "对日期加减按照单位加减。单位默认为日,可选单位:年Y、月M、日D、时H、分I、秒S。",
+ "example": "DATEADD('2016-12-21', 3)
DATEADD('2016-12-24 20:00:00', 3, 'H')",
+ "result": "'2016-12-24'
'2016-12-24 23:00:00'",
+ "paramDescs": [
+ "*日期*(必选)",
+ "*数值*(必选)",
+ "*单位*(可选)"
+ ],
+ "formatString": "DATEADD(日期,数值 , [单位])",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "date",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 3,
+ "paramStatuses": [
+ {
+ "dataType": "date",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "number",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "string",
+ "must": true,
+ "constType": [
+ "Y",
+ "M",
+ "D",
+ "H",
+ "I",
+ "S"
+ ],
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "DATEDIFF",
+ "chineseName": "返回两个日期的差值",
+ "description": "根据指定的单位,返回日期2减去日期1的差值。当日期2小于日期1时,差值为负值。单位默认为日,可选单位:年Y、月M、日D、时H、分I、秒S。",
+ "example": "DATEDIF('2016-12-21', '2016-12-24')
DATEDIF('2016-12-24 20:00:00', '2016-12-25 20:00:00', 'H')",
+ "result": "3
24",
+ "paramDescs": [
+ "*日期1*(必选)",
+ "*日期2*(必选)",
+ "*单位*(可选)"
+ ],
+ "formatString": "DATEDIFF(日期1, 日期2, [单位])",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "number",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 3,
+ "paramStatuses": [
+ {
+ "dataType": "date",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "date",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "string",
+ "must": true,
+ "constType": [
+ "Y",
+ "M",
+ "D",
+ "H",
+ "I",
+ "S"
+ ],
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "DATEFORMAT",
+ "chineseName": "返回指定格式的日期",
+ "description": "将日期转为指定格式返回。
yyyy 将年份显示为1900-9999
yy 将年份显示为00-99
mm 将月份显示为 01–12
dd 将日期显示为 01–31",
+ "example": "DATEFORMAT('2016-12-24', 'YY-MM-DD')",
+ "result": "2016-12-24",
+ "paramDescs": [
+ "*日期*(必选)",
+ "*日期格式*(必选)"
+ ],
+ "formatString": "DATEFORMAT(日期, 可选格式)",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "date",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 2,
+ "paramStatuses": [
+ {
+ "dataType": "date",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "string",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "YEAR",
+ "chineseName": "返回日期中的年",
+ "description": "返回指定日期中的年。",
+ "example": "YEAR('2016-12-24')",
+ "result": "2016",
+ "paramDescs": [
+ "*日期*(必选)"
+ ],
+ "formatString": "YEAR(日期)",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "number",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 1,
+ "paramStatuses": [
+ {
+ "dataType": "date",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "MONTH",
+ "chineseName": "返回日期中的月",
+ "description": "返回指定日期中的月。",
+ "example": "MONTH('2016-12-24')",
+ "result": "12",
+ "paramDescs": [
+ "*日期*(必选)"
+ ],
+ "formatString": "MONTH(日期)",
+ "paramArray": [
+ "String"
+ ],
+ "paramData": [],
+ "returnType": "number",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 1,
+ "paramStatuses": [
+ {
+ "dataType": "date",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "DAY",
+ "chineseName": "返回日期中的日",
+ "description": "返回指定日期中的日。",
+ "example": "DAY('2016-12-24')",
+ "result": "24",
+ "paramDescs": [
+ "*日期*(必选)"
+ ],
+ "formatString": "DAY(日期)",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "number",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 1,
+ "paramStatuses": [
+ {
+ "dataType": "date",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "HOUR",
+ "chineseName": "返回日期中的小时",
+ "description": "返回指定日期中的小时。",
+ "example": "HOUR('2016-12-24 20:30:56')",
+ "result": "20",
+ "paramDescs": [
+ "*日期*(必选)"
+ ],
+ "formatString": "HOUR(日期)",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "number",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 1,
+ "paramStatuses": [
+ {
+ "dataType": "date",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "MINUTE",
+ "chineseName": "返回日期中的分钟",
+ "description": "返回指定日期中的分钟。",
+ "example": "MINUTE('2016-12-24 20:30:56')",
+ "result": "30",
+ "paramDescs": [
+ "*日期*(必选)"
+ ],
+ "formatString": "MINUTE(日期)",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "number",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 1,
+ "paramStatuses": [
+ {
+ "dataType": "date",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "SECOND",
+ "chineseName": "返回日期中的秒",
+ "description": "返回指定日期中的秒钟。",
+ "example": "SECOND('2016-12-24 20:30:56')",
+ "result": "56",
+ "paramDescs": [
+ "*日期*(必选)"
+ ],
+ "formatString": "SECOND(日期)",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "number",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 1,
+ "paramStatuses": [
+ {
+ "dataType": "date",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "WEEKNUM",
+ "chineseName": "返回日期为第几周",
+ "description": "返回指定日期为第几周,从每年第1天开始算第1周。",
+ "example": "WEEKNUM('2016-12-24')",
+ "result": "52",
+ "paramDescs": [
+ "*日期*(必选)"
+ ],
+ "formatString": "WEEKNUM(日期)",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "number",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 1,
+ "paramStatuses": [
+ {
+ "dataType": "date",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "WEEKDAY",
+ "chineseName": "返回日期为星期几",
+ "description": "返回指定日期为星期几。返回值为0~6,代表周日~周六。",
+ "example": "WEEKDAY('2016-12-24')",
+ "result": "6",
+ "paramDescs": [
+ "*日期*(必选)"
+ ],
+ "formatString": "WEEKDAY(日期)",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "number",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 1,
+ "paramStatuses": [
+ {
+ "dataType": "date",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "EOMONTH",
+ "chineseName": "返回某月最后一天日期",
+ "description": "将某月最后一天日期返回。日期可以为指定日期也可以是日期参数,之前的月数用负数表示,之后的月数用正数表示。所输入月数需为整数。",
+ "example": "EOMONTH('2021-11-07', -2)",
+ "result": "2021-09-30",
+ "paramDescs": [
+ "*日期*(必选)",
+ "*数值*(必选)"
+ ],
+ "formatString": "EOMONTH(日期,指定日期之前或之后的月数)",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "string",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 2,
+ "paramStatuses": [
+ {
+ "dataType": "date",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "number",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "CURRYEAR",
+ "chineseName": "返回当前年份",
+ "description": "取当前日期的年份。",
+ "example": "假设当前时间为:2022年2月17日 11:20:30 ,CURRYEAR()",
+ "result": "2022",
+ "formatString": "CURRYEAR()",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "number",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 0
+ },
+ {
+ "name": "CURRMONTH",
+ "chineseName": "返回当前月份",
+ "description": "取当前日期的月份。",
+ "example": "假设当前时间为:2022年2月17日 11:20:30 ,CURRMONTH()",
+ "result": "2",
+ "formatString": "CURRMONTH()",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "number",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 0
+ },
+ {
+ "name": "CURRDAY",
+ "chineseName": "返回当前第几日(当月)",
+ "description": "取当前日期的天。",
+ "example": "假设当前时间为:2022年2月17日 11:20:30 ,CURRDAY()",
+ "result": "17",
+ "formatString": "CURRDAY()",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "number",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 0
+ },
+ {
+ "name": "CURRWEEK",
+ "chineseName": "返回当前是周几",
+ "description": "取当前日期是周几。",
+ "example": "假设当前时间为:2022年2月17日 11:20:30 ,CURRWEEK()",
+ "result": "4",
+ "formatString": "CURRWEEK()",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "number",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 0
+ },
+ {
+ "name": "CURRHOUR",
+ "chineseName": "返回当前小时",
+ "description": "取当前日期的小时。",
+ "example": "假设当前时间为:2022年2月17日 11:20:30 ,CURRHOUR()",
+ "result": "11",
+ "formatString": "CURRHOUR()",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "number",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 0
+ },
+ {
+ "name": "CURRMINUTE",
+ "chineseName": "返回当前分",
+ "description": "取当前日期的分钟。",
+ "example": "假设当前时间为:2022年2月17日 11:20:30 ,CURRMINUTE()",
+ "result": "20",
+ "formatString": "CURRMINUTE()",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "number",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 0
+ },
+ {
+ "name": "CURRSECOND",
+ "chineseName": "返回当前秒",
+ "description": "取当前日期的秒钟。",
+ "example": "假设当前时间为:2022年2月17日 11:20:30 ,CURRSECOND()",
+ "result": "30",
+ "formatString": "CURRSECOND()",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "number",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 0
+ },
+ {
+ "name": "MAXDATE",
+ "chineseName": "返回一组日期中的最大值",
+ "description": "取一组日期中的最大值。",
+ "example": "MAXDATE('2016-12-24', '2022-12-24')",
+ "result": "2022-12-24",
+ "paramDescs": [
+ "*日期1*(必选)",
+ "*日期2*(必选)"
+ ],
+ "formatString": "MAXDATE(日期1,日期2,……)",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "date",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": -1,
+ "paramStatuses": [
+ {
+ "dataType": "date",
+ "must": true,
+ "infinite": true
+ }
+ ]
+ },
+ {
+ "name": "MINDATE",
+ "chineseName": "返回一组日期中的最小值",
+ "description": "取一组日期中的最小值。",
+ "example": "MINDATE('2016-12-24', '2022-12-24')",
+ "result": "2016-12-24",
+ "paramDescs": [
+ "*日期1*(必选)",
+ "*日期2*(必选)"
+ ],
+ "formatString": "MINDATE(日期1,日期2,……)",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "date",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": -1,
+ "paramStatuses": [
+ {
+ "dataType": "date",
+ "must": true,
+ "infinite": true
+ }
+ ]
+ }
+ ],
+ "dataType": "date",
+ "name": "日期函数",
+ "action": "DataSource",
+ "type": "functions"
+ },
+ {
+ "children": [
+ {
+ "name": "IF",
+ "chineseName": "如果条件为真,则...否则...",
+ "description": "如果条件为真,则执行表达式1,为假则执行表达式2。条件中不可嵌套使用IF函数。",
+ "example": "IF({员工表.年龄} > 60, '退休', '在职')
IF({员工表.年龄} > 60, IF({员工表.性别} = {员工表.性别.女}, '退休', '在职'), '在职')",
+ "result": "'退休'
'在职'",
+ "paramDescs": [
+ "*条件*(必选)",
+ "*表达式1*(必选)",
+ "*表达式2*(必选)"
+ ],
+ "formatString": "IF(条件, 表达式1, 表达式2)",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "all",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 3,
+ "paramStatuses": [
+ {
+ "dataType": "boolean",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "all",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "all",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "AND",
+ "chineseName": "且",
+ "description": "所有条件均为真,则返回真,否则返回假。逻辑操作AND的函数模式。",
+ "example": "AND(2 = 2, 2 < 2)",
+ "result": "false",
+ "paramDescs": [
+ "*条件1*(必选)",
+ "*条件2*(可选,可输入多个参数)"
+ ],
+ "formatString": "AND(条件1, 条件2, [条件3, …])",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "boolean",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": -1,
+ "paramStatuses": [
+ {
+ "dataType": "boolean",
+ "must": true,
+ "infinite": true
+ }
+ ]
+ },
+ {
+ "name": "OR",
+ "chineseName": "或",
+ "description": "任意一个条件为真,则返回真,否则返回假。逻辑操作OR的函数模式。",
+ "example": "OR(2 = 2, 2 > 3)",
+ "result": "true",
+ "paramDescs": [
+ "*条件1*(必选)",
+ "*条件2*(可选,可输入多个参数)"
+ ],
+ "formatString": "OR(条件1, 条件2, [条件3, …])",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "boolean",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": -1,
+ "paramStatuses": [
+ {
+ "dataType": "boolean",
+ "must": true,
+ "infinite": true
+ }
+ ]
+ },
+ {
+ "name": "NOT",
+ "chineseName": "反转真假结果",
+ "description": "对逻辑结果取反。",
+ "example": "NOT(2 > 3)",
+ "result": "true",
+ "paramDescs": [
+ "*逻辑结果*(必选)"
+ ],
+ "formatString": "NOT(逻辑结果)",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "boolean",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 1,
+ "paramStatuses": [
+ {
+ "dataType": "boolean",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "IN",
+ "chineseName": "变量是否包含在一组结果中",
+ "description": "任意类型的变量或常量等于一组同类型变量或常量结果中的任意一个,则返回真。",
+ "example": "IN(2, [2, 3, 4])",
+ "result": "true",
+ "paramDescs": [
+ "*变量*(必选)",
+ "*变量数组*(必选)"
+ ],
+ "formatString": "IN(变量, [变量1, 变量2, …])",
+ "paramArray": [],
+ "paramData": [
+ "{}",
+ "[]"
+ ],
+ "returnType": "boolean",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 2,
+ "paramStatuses": [
+ {
+ "dataType": "all",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "array",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "LIKE",
+ "chineseName": "文本是否包含任意一个关键字",
+ "description": "文本类型的变量或常量包含一组文本类型变量或常量结果中的任意一个,则返回真。逻辑操作LIKE的函数模式。",
+ "example": "LIKE('大家好', ['大家', '好'])",
+ "result": "true",
+ "paramDescs": [
+ "*文本*(必选)",
+ "*文本数组*(必选)"
+ ],
+ "formatString": "LIKE(文本, [文本1, 文本2, …])",
+ "paramArray": [],
+ "paramData": [
+ "{}",
+ "[]"
+ ],
+ "returnType": "boolean",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 2,
+ "paramStatuses": [
+ {
+ "dataType": "string",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "array",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "ISEMPTY",
+ "chineseName": "是否为空",
+ "description": "变量为空或未填写,则返回真。",
+ "example": "ISEMPTY({员工表.电话})",
+ "result": "true",
+ "paramDescs": [
+ "*变量或常量*(可选)"
+ ],
+ "formatString": "ISEMPTY(变量)",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "boolean",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 1,
+ "paramStatuses": [
+ {
+ "dataType": "all",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "TRUE",
+ "chineseName": "返回真",
+ "description": "返回真。",
+ "example": "TRUE()",
+ "result": "true",
+ "formatString": "TRUE()",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "boolean",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 0
+ },
+ {
+ "name": "FALSE",
+ "chineseName": "返回假",
+ "description": "返回假。",
+ "example": "FALSE()",
+ "result": "false",
+ "formatString": "FALSE()",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "boolean",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 0
+ },
+ {
+ "name": "IFS",
+ "chineseName": "多条件",
+ "description": "多个条件判断,位于单数位置的参数设置为条件,位于双数位置的参数设置为结果,最后一个参数为默认返回值,当所有条件都不满足的时候返回默认参数。",
+ "example": "IFS(1>1,1,1=1,2,0)",
+ "result": "2",
+ "paramDescs": [
+ "*条件1*(必选)",
+ "*变量或常量*(必选)",
+ "*条件2*(必选)",
+ "*变量或常量*(必选)",
+ "*变量或常量*(必选)"
+ ],
+ "formatString": "IFS({条件1},{结果1},{条件2},{结果2}...{默认结果})",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "all",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": -1,
+ "paramStatuses": [
+ {
+ "dataType": "boolean",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "all",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "all",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "SWITCH",
+ "chineseName": "条件选择",
+ "description": "条件选择。",
+ "example": "SWITCH({字段1},1,'A',2,'B','C')",
+ "result": "假设字段1为2,结果:'B'",
+ "paramDescs": [
+ "*变量或常量*(必选)",
+ "*变量或常量*(必选)",
+ "*变量或常量*(必选)",
+ "*变量或常量*(可选)",
+ "*变量或常量*(可选)",
+ "*变量或常量*(必选)"
+ ],
+ "formatString": "SWITCH({变量},{条件1},{结果1},{条件2},{结果2}...{默认结果})",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "all",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": -1,
+ "paramStatuses": [
+ {
+ "dataType": "all",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "all",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "all",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ }
+ ],
+ "dataType": "logic",
+ "name": "逻辑函数",
+ "action": "DataSource",
+ "type": "functions"
+ },
+ {
+ "children": [
+ {
+ "name": "ROUNDUP",
+ "chineseName": "向上舍入",
+ "description": "根据设置的小数位精确度,返回对数值向上舍入后的值。小数位精确度取值可为正整数,0,负整数。如果小数位精确度为正整数,则向上舍入到指定的小数位。如果小数位精确度等于 0,则向上舍入到最接近的整数。如果小数位精确度为负整数,则在小数点左侧向上进行舍入。小数位精确度不支持变量。小数位精确度默认为0,即只保留整数。",
+ "example": "ROUNDUP(76.9,0)",
+ "result": "77",
+ "paramDescs": [
+ "*数字*(必选)",
+ "*小数位精确度*(可选)"
+ ],
+ "formatString": "ROUNDUP(数字, [小数位精确度])",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "number",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 2,
+ "paramStatuses": [
+ {
+ "dataType": "number",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "number",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "ROUND",
+ "chineseName": "四舍五入",
+ "description": "根据设置的小数位精确度,返回对数值四舍五入后的值。小数位精确度取值可为正整数,0,负整数。如果小数位精确度为正整数,针对小数点后的数据进行四舍五入;如果小数位精确度等于 0,返回最接近数值的整数;如果小数位精确度为负整数,针对小数点前的数据进行四舍五入,被舍掉的数据用0占位。小数位精确度不支持变量。小数位精确度默认为0,即只保留整数。",
+ "example": "ROUND(123.456,2),ROUND(123.456,0),ROUND(123.456,-2)",
+ "result": "依次为123.46,123,100",
+ "paramDescs": [
+ "*数字*(必选)",
+ "*小数位精确度*(可选)"
+ ],
+ "formatString": "ROUND(数字, [小数位精确度])",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "number",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 2,
+ "paramStatuses": [
+ {
+ "dataType": "number",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "number",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "ROUNDDOWN",
+ "chineseName": "向下舍入",
+ "description": "根据设置的小数位精确度,返回对数值向下舍入后的值。小数位精确度取值可为正整数,0,负整数。如果小数位精确度为正整数,则向下舍入到指定的小数位。如果小数位精确度等于 0,则向下舍入到最接近的整数。如果小数位精确度为负整数,则在小数点左侧向下进行舍入。小数位精确度不支持变量。小数位精确度默认为0,即只保留整数。",
+ "example": "ROUNDDOWN(76.9,0)",
+ "result": "76",
+ "paramDescs": [
+ "*数字*(必选)",
+ "*小数位精确度*(可选)"
+ ],
+ "formatString": "ROUNDDOWN(数字, [小数位精确度])",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "number",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 2,
+ "paramStatuses": [
+ {
+ "dataType": "number",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "number",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "AGGREGATION",
+ "chineseName": "聚合运算",
+ "description": "将一组数据进行统计计算,支持最大值(MAX)、最小值(MIN)、平均值(AVG)。",
+ "example": "AGGREGATION(1 , 2,3,'AVG')",
+ "result": "2",
+ "paramDescs": [
+ "*数字*(必选)",
+ "*聚合运算类型*(必选)"
+ ],
+ "formatString": "AGGREGATION({数字}...,{聚合运算类型})",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "number",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": -1,
+ "paramStatuses": [
+ {
+ "dataType": "number",
+ "must": true,
+ "infinite": true
+ },
+ {
+ "dataType": "string",
+ "must": true,
+ "constType": [
+ "avg",
+ "max",
+ "min"
+ ],
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "MOD",
+ "chineseName": "求余",
+ "description": "将两个参数进行除法运算然后得出余数返回。",
+ "example": "MOD( 7 , 3 )",
+ "result": "1",
+ "paramDescs": [
+ "*数字*(必选)",
+ "*数字*(必选)"
+ ],
+ "formatString": "ROUNDDOWN({数字},{数字})",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "number",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 2,
+ "paramStatuses": [
+ {
+ "dataType": "number",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "number",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ },
+ {
+ "name": "TRUNC",
+ "chineseName": "数字格式化",
+ "description": "将小数点格式化成指定位数。",
+ "example": "TRUNC( 2.123 , 2 )",
+ "result": "2.12",
+ "paramDescs": [
+ "*数字*(必选)",
+ "*精度*(必选)"
+ ],
+ "formatString": "ROUNDDOWN({数字},{精度})",
+ "paramArray": [],
+ "paramData": [],
+ "returnType": "number",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 2,
+ "paramStatuses": [
+ {
+ "dataType": "number",
+ "must": true,
+ "infinite": false
+ },
+ {
+ "dataType": "number",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ }
+ ],
+ "dataType": "math",
+ "name": "数学函数",
+ "action": "DataSource",
+ "type": "functions"
+ },
+ {
+ "children": [
+ {
+ "name": "GETMONEY",
+ "chineseName": "获取所给定数字的金额大写",
+ "description": "将金额转换成中文金额大写。",
+ "example": "GETMONEY({1234})",
+ "result": "壹仟贰佰叁拾肆元整",
+ "paramDescs": [
+ "*数字*(必选)"
+ ],
+ "formatString": "GETMONEY({数字})",
+ "paramData": [],
+ "returnType": "",
+ "type": "function",
+ "validForm": "current_data",
+ "paramCount": 1,
+ "paramStatuses": [
+ {
+ "dataType": "number",
+ "must": true,
+ "infinite": false
+ }
+ ]
+ }
+ ],
+ "dataType": "finance",
+ "name": "财务函数",
+ "action": "DataSource",
+ "type": "functions"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/com/engine/salary/entity/datacollection/bo/AttendQuoteDataBO.java b/src/com/engine/salary/entity/datacollection/bo/AttendQuoteDataBO.java
index 66bc83223..144ed4c0e 100644
--- a/src/com/engine/salary/entity/datacollection/bo/AttendQuoteDataBO.java
+++ b/src/com/engine/salary/entity/datacollection/bo/AttendQuoteDataBO.java
@@ -47,10 +47,10 @@ public class AttendQuoteDataBO {
});
}
-// public static SimpleEmployee getCurrentUser4Remote() {
-// SimpleEmployee se = UserContext.getCurrentUser();
+// public static DataCollectionEmployee getCurrentUser4Remote() {
+// DataCollectionEmployee se = UserContext.getCurrentUser();
// if(se != null){
-// SimpleEmployee simple = new SimpleEmployee();
+// DataCollectionEmployee simple = new DataCollectionEmployee();
// simple.setId(se.getId());
// simple.setUserId(se.getUserId());
// simple.setUsername(se.getUsername());
diff --git a/src/com/engine/salary/entity/salaryacct/bo/CalculateFormulaVarBO.java b/src/com/engine/salary/entity/salaryacct/bo/CalculateFormulaVarBO.java
index 425c7715c..6ed15c5a7 100644
--- a/src/com/engine/salary/entity/salaryacct/bo/CalculateFormulaVarBO.java
+++ b/src/com/engine/salary/entity/salaryacct/bo/CalculateFormulaVarBO.java
@@ -38,6 +38,8 @@ import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.stream.Collectors;
+import static com.engine.salary.util.SalaryDateUtil.DATE_TIME_FORMATTER_PATTERN;
+
/**
* 薪资核算-将数据转换成公式中的变量
*
Copyright: Copyright (c) 2022
@@ -163,7 +165,12 @@ public class CalculateFormulaVarBO {
String fieldId = SalarySQLReferenceEnum.SALARY_CYCLE.getValue()
+ SalaryFormulaFieldConstant.FIELD_ID_SEPARATOR
+ fieldName;
- formulaVarValues.add(new FormulaVarValue().setFieldId(fieldId).setFieldValue(map.getOrDefault(fieldName, StringUtils.EMPTY)));
+ String fieldValue = map.getOrDefault(fieldName, StringUtils.EMPTY);
+ //日期值取yyyy-MM-dd
+ if (StringUtils.isNotBlank(fieldValue) && fieldValue.length() > 10 && SalaryDateUtil.parse(fieldValue, DATE_TIME_FORMATTER_PATTERN) != null) {
+ fieldValue = fieldValue.substring(0, 10);
+ }
+ formulaVarValues.add(new FormulaVarValue().setFieldId(fieldId).setFieldValue(fieldValue));
}
}
return formulaVarValues;
@@ -210,8 +217,6 @@ public class CalculateFormulaVarBO {
}
-
-
/**
* 处理薪资档案(会涉及调薪计薪规则)+处理核算日期
*
@@ -228,7 +233,6 @@ public class CalculateFormulaVarBO {
List formulaVarValues = resultMap.computeIfAbsent(key, k -> Lists.newArrayList());
// 将薪资档案的值转换成公式中的变量,填充到返回结果集中
formulaVarValues.addAll(handleSalaryArchiveItemVal(salaryAcctCalculateBO, salaryArchiveTaxAgentDataDTO.getSalaryItemValues(), salarySobAdjustRulePOMap));
- formulaVarValues.addAll(handleSalarySobCycleDTO(salaryAcctCalculateBO));
}
}
}
@@ -511,8 +515,16 @@ public class CalculateFormulaVarBO {
String fieldId = SalarySQLReferenceEnum.SALARY_ACCT_EMPLOYEE.getValue()
+ SalaryFormulaFieldConstant.FIELD_ID_SEPARATOR
+ fieldName;
- return new FormulaVarValue().setFieldId(fieldId).setFieldValue(map.getOrDefault(fieldName, StringUtils.EMPTY));
+ String fieldValue = map.getOrDefault(fieldName, StringUtils.EMPTY);
+ //判断是否是日期,日期值取yyyy-MM-dd
+ if (StringUtils.isNotBlank(fieldValue) && fieldValue.length() > 10 && SalaryDateUtil.parse(fieldValue, DATE_TIME_FORMATTER_PATTERN) != null) {
+ fieldValue = fieldValue.substring(0, 10);
+ }
+ return new FormulaVarValue().setFieldId(fieldId).setFieldValue(fieldValue);
}).collect(Collectors.toList()));
+
+ //将薪资周期转换成公式中的变量,填充到返回结果集中
+ formulaVarValues.addAll(handleSalarySobCycleDTO(salaryAcctCalculateBO));
});
}
diff --git a/src/com/engine/salary/entity/salaryacct/bo/SalaryCheckResultBO.java b/src/com/engine/salary/entity/salaryacct/bo/SalaryCheckResultBO.java
index 34b4f3267..a9d26843c 100644
--- a/src/com/engine/salary/entity/salaryacct/bo/SalaryCheckResultBO.java
+++ b/src/com/engine/salary/entity/salaryacct/bo/SalaryCheckResultBO.java
@@ -8,7 +8,7 @@
//import com.weaver.hrm.salary.entity.salaryacct.po.SalaryCheckResultRecordPO;
//import com.weaver.hrm.salary.entity.salarysob.po.SalarySobCheckRulePO;
//import com.weaver.hrm.salary.util.SalaryEntityUtil;
-//import com.weaver.teams.domain.user.SimpleEmployee;
+//import com.weaver.teams.domain.user.DataCollectionEmployee;
//import org.apache.commons.collections4.CollectionUtils;
//import org.apache.commons.lang3.StringUtils;
//import org.apache.commons.lang3.math.NumberUtils;
@@ -71,13 +71,13 @@
// public static List convert2RecordListDTO(List salaryCheckResultRecords,
// List salarySobCheckRules,
// List expressFormulas,
-// List simpleEmployees) {
+// List simpleEmployees) {
// if (CollectionUtils.isEmpty(salaryCheckResultRecords)) {
// return Collections.emptyList();
// }
// Map formulaMap = SalaryEntityUtil.convert2Map(expressFormulas, ExpressFormula::getId, ExpressFormula::getFormula);
// Map checkRuleMap = SalaryEntityUtil.convert2Map(salarySobCheckRules, SalarySobCheckRulePO::getId, SalarySobCheckRulePO::getName);
-// Map employeeMap = SalaryEntityUtil.convert2Map(simpleEmployees, SimpleEmployee::getEmployeeId, SimpleEmployee::getName);
+// Map employeeMap = SalaryEntityUtil.convert2Map(simpleEmployees, DataCollectionEmployee::getEmployeeId, DataCollectionEmployee::getName);
// return salaryCheckResultRecords.stream()
// .map(e -> SalaryCheckResultRecordListDTO.builder()
// .id(e.getId())
diff --git a/src/com/engine/salary/enums/salaryformula/SalaryFormulaReferenceEnum.java b/src/com/engine/salary/enums/salaryformula/SalaryFormulaReferenceEnum.java
index 80d48a5e5..8cf79c880 100644
--- a/src/com/engine/salary/enums/salaryformula/SalaryFormulaReferenceEnum.java
+++ b/src/com/engine/salary/enums/salaryformula/SalaryFormulaReferenceEnum.java
@@ -24,8 +24,10 @@ public enum SalaryFormulaReferenceEnum implements BaseEnum {
ADD_UP_DEDUCTIONS("addUpDeductions", "累计专项附加扣除", 85380),
WELFARE("welfare", "社保福利", 87522),
OTHER_DEDUCTION("otherDeduction", "其他免税扣除", 93849),
- ISSUED("ISSUED", "已发", 0),;
- ;
+ SALARY_ACCT_EMPLOYEE("salaryAcctEmployee", "核算基本信息", 85368),
+ SALARY_CYCLE("SalaryCycle", "核算日期", 85368),
+ ISSUED("ISSUED", "已发", 0);
+
private String value;
private String defaultLabel;
diff --git a/src/com/engine/salary/formlua/core/QLExpressContext.java b/src/com/engine/salary/formlua/core/QLExpressContext.java
new file mode 100644
index 000000000..4fa77597f
--- /dev/null
+++ b/src/com/engine/salary/formlua/core/QLExpressContext.java
@@ -0,0 +1,18 @@
+package com.engine.salary.formlua.core;
+
+import com.ql.util.express.IExpressContext;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@SuppressWarnings("serial")
+public class QLExpressContext extends HashMap implements
+ IExpressContext {
+
+
+ public QLExpressContext(Map aProperties) {
+ super(aProperties);
+ }
+
+
+}
diff --git a/src/com/engine/salary/formlua/core/QlExpress.java b/src/com/engine/salary/formlua/core/QlExpress.java
new file mode 100644
index 000000000..cf90cab07
--- /dev/null
+++ b/src/com/engine/salary/formlua/core/QlExpress.java
@@ -0,0 +1,276 @@
+package com.engine.salary.formlua.core;
+
+import com.alibaba.fastjson.JSONObject;
+import com.engine.salary.formlua.entity.parameter.DataType;
+import com.engine.salary.formlua.entity.parameter.FuncNames;
+import com.engine.salary.formlua.func.compare.*;
+import com.engine.salary.formlua.func.date.DateTimeService;
+import com.engine.salary.formlua.func.date.DateTimeServiceImpl;
+import com.engine.salary.formlua.func.finance.FinanceService;
+import com.engine.salary.formlua.func.finance.FinanceServiceImpl;
+import com.engine.salary.formlua.func.find.FindFuncsService;
+import com.engine.salary.formlua.func.logic.IfOperator;
+import com.engine.salary.formlua.func.logic.LogicService;
+import com.engine.salary.formlua.func.logic.LogicServiceImpl;
+import com.engine.salary.formlua.func.math.MathFuncsService;
+import com.engine.salary.formlua.func.math.MathFuncsServiceImpl;
+import com.engine.salary.formlua.func.string.StringFormulaService;
+import com.engine.salary.formlua.func.string.StringFormulaServiceImpl;
+import com.engine.salary.formlua.util.ExpressRegularUtil;
+import com.ql.util.express.DynamicParamsUtil;
+import com.ql.util.express.ExpressRunner;
+import com.ql.util.express.IExpressContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Map;
+import java.util.regex.PatternSyntaxException;
+
+/**
+ * 执行业务类
+ */
+public class QlExpress {
+
+ public static ExpressRunner runner;
+
+ static {
+ runner = new ExpressRunner(true, false);
+ }
+
+ private static boolean isInitialRunner = false;
+
+
+// AggregationFunc aggregationFunc;
+
+ LogicService logicService = new LogicServiceImpl();
+
+ DateTimeService dateTimeService = new DateTimeServiceImpl();
+
+ StringFormulaService stringFormulaService = new StringFormulaServiceImpl();
+
+ MathFuncsService mathFuncsService = new MathFuncsServiceImpl();
+
+ FindFuncsService findFuncsService;
+
+// private ExcelFuncs excelFuncs;
+//
+// private HrmDbService hrmDbService;
+
+ private FinanceService financeService = new FinanceServiceImpl();
+ // private RemoteExcelformulaService remoteExcelformulaService;
+ private String errorInfo;
+ protected final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+
+ /**
+ * @param statement 执行语句
+ * @param context 上下文
+ * @throws Exception
+ */
+ public Object execute(String statement, Map context) {
+ String expressSql = statement;
+ initRunner(runner);
+ DynamicParamsUtil.supportDynamicParams = true;
+ //初步的语法的格式校验
+ IExpressContext expressContext = new QLExpressContext(context);
+// ThreadLocalData threadLocalData=new ThreadLocalData();
+// threadLocalData.setExpressContext(context);
+// ParamContext.get().setValue("formulaParam",threadLocalData);
+// ParamContext.get().setValue("currentUser",simpleEmployee);
+ try {
+ ExpressRegularUtil.checkFuncExpress(expressSql);
+ expressSql = expressSql.replaceAll("\\{", "");
+ expressSql = expressSql.replaceAll("\\}", "");
+ Object obj = runner.execute(expressSql, expressContext, null, true, false);
+ JSONObject resultObj = new JSONObject();
+ if (obj != null) {
+ resultObj.put("excute", true);
+ if (obj instanceof DataType) {
+ DataType dataType = (DataType) obj;
+ resultObj.put("data", dataType.getContent());
+ resultObj.put("dataType", dataType.getDataType());
+ resultObj.put("boolData", dataType.getContent());
+ } else {
+ resultObj.put("data", obj);
+ resultObj.put("boolData", obj);
+ }
+ } else {
+ resultObj.put("excute", false);
+ }
+ return resultObj;
+ } catch (Throwable e) {
+ logger.error("err", e);
+ while (e != null) {
+ e = e.getCause();
+ }
+ String jsonError = e.getMessage();
+ if (e instanceof PatternSyntaxException) {
+ PatternSyntaxException patternSyntaxException = (PatternSyntaxException) e;
+ jsonError = patternSyntaxException.getDescription();
+ } else {
+ if (null != e.getCause()) {
+ jsonError = e.getCause().getMessage();
+ if (e.getCause() instanceof InvocationTargetException) {
+ InvocationTargetException invocationTargetException = (InvocationTargetException) e.getCause();
+ jsonError = invocationTargetException.getTargetException().getMessage();
+ }
+ }
+ }
+ JSONObject resultObj = new JSONObject();
+ resultObj.put("excute", false);
+ resultObj.put("data", "");
+ resultObj.put("err", jsonError);
+ return resultObj;
+ }
+ }
+
+ private void initRunner(ExpressRunner runner) {
+ if (isInitialRunner) {
+ return;
+ }
+ synchronized (runner) {
+ if (isInitialRunner) {
+ return;
+ }
+ try {
+ //比较函数
+ runner.replaceOperator("=", new EqOperator("="));
+ runner.replaceOperator("==", new EqOperator("="));
+ runner.replaceOperator("!=", new NotEqueOperator("!="));
+
+ runner.replaceOperator(">", new GreaterOperator(">"));
+ runner.replaceOperator("<", new LessOperator("<"));
+ runner.replaceOperator(">=", new GreaterEqOperator(">="));
+ runner.replaceOperator("<=", new LessEqOperator("<="));
+
+ runner.replaceOperator("+", new WOperatorAdd("+"));
+ runner.replaceOperator("-", new WOperatorReduce("-"));
+ runner.replaceOperator("*", new WOperatorMulti("*"));
+ runner.replaceOperator("/", new WOperatorDiv("/"));
+ //逻辑函数
+ runner.replaceOperator("IF", new IfOperator("IF"));
+ runner.addFunctionOfServiceMethod(FuncNames.AND.toString(), logicService, FuncNames.AND.getName(), new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod(FuncNames.OR.toString(), logicService, FuncNames.OR.getName(), new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod(FuncNames.NOT.toString(), logicService, FuncNames.NOT.getName(), new Class[]{Object[].class}, "");
+ runner.replaceOperator("IN", new InOperator("in"));
+ runner.addFunctionOfServiceMethod(FuncNames.LIKE.toString(), logicService, FuncNames.LIKE.getName(), new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod(FuncNames.ISEMPTY.toString(), logicService, FuncNames.ISEMPTY.getName(), new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod(FuncNames.TRUE.toString(), logicService, FuncNames.TRUE.getName(), new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod(FuncNames.FALSE.toString(), logicService, FuncNames.FALSE.getName(), new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod(FuncNames.IFS.toString(), logicService, FuncNames.IFS.getName(), new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod(FuncNames.SWITCH.toString(), logicService, FuncNames.SWITCH.getName(), new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod(FuncNames.FIND.toString(), logicService, FuncNames.FIND.getName(), new Class[]{Object[].class}, "");
+
+ //日期函数
+ runner.addFunctionOfServiceMethod("TODAY", dateTimeService, "today", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("NOW", dateTimeService, "now", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("DATEADD", dateTimeService, "dateAdd", new Class[]{Object[].class}, errorInfo);
+ runner.addFunctionOfServiceMethod("DATEDIFF", dateTimeService, "dateDiff", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("DATEFORMAT", dateTimeService, "dateFormat", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("YEAR", dateTimeService, "year", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("MONTH", dateTimeService, "month", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("DAY", dateTimeService, "day", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("HOUR", dateTimeService, "hour", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("MINUTE", dateTimeService, "minute", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("SECOND", dateTimeService, "seconds", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("WEEKNUM", dateTimeService, "weekNum", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("WEEKDAY", dateTimeService, "weekDay", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("EOMONTH", dateTimeService, "eoMonth", new Class[]{Object[].class}, "");
+// runner.addFunctionOfServiceMethod("NETWORKDAYSPI", dateTimeService, "workdayIntl", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("CURRYEAR", dateTimeService, "currYear", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("CURRMONTH", dateTimeService, "currMonth", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("CURRDAY", dateTimeService, "currDay", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("CURRWEEK", dateTimeService, "currWeek", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("CURRHOUR", dateTimeService, "currHour", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("CURRMINUTE", dateTimeService, "currMinute", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("CURRSECOND", dateTimeService, "currSecond", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("MAXDATE", dateTimeService, "maxDate", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("MINDATE", dateTimeService, "minDate", new Class[]{Object[].class}, "");
+// runner.addFunctionOfServiceMethod("DAYOFMONTH", dateTimeService, "dayOfMonth", new Class[]{Object[].class}, "");
+
+ //聚合函数
+// runner.addFunctionOfServiceMethod("COUNT", aggregationFunc, "counts", new Class[]{Object[].class}, "COUNT参数错误");
+// runner.addFunctionOfServiceMethod("AVG", aggregationFunc, "avgs", new Class[]{Object[].class}, "AVG参数错误");
+// runner.addFunctionOfServiceMethod("SUM", aggregationFunc, "sumNumber", new Class[]{Object[].class}, "SUM参数错误");
+// runner.addFunctionOfServiceMethod("MAX", aggregationFunc, "maxNumber", new Class[]{Object[].class}, "MAX参数错误");
+// runner.addFunctionOfServiceMethod("MIN", aggregationFunc, "minNumber", new Class[]{Object[].class}, "MIN参数错误");
+
+ //字符串函数
+ runner.addFunctionOfServiceMethod("CONCAT", stringFormulaService, "concatString", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("SEARCH", stringFormulaService, "search", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("TEXT", stringFormulaService, "text", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("PAD", stringFormulaService, "pad", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("REPLACE", stringFormulaService, "replace", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("VALUE", stringFormulaService, "value", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("LEN", stringFormulaService, "len", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("LEFT", stringFormulaService, "left", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("RIGHT", stringFormulaService, "right", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("MID", stringFormulaService, "mid", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("REPT", stringFormulaService, "repeat", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("TRIM", stringFormulaService, "trim", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("SCORE", stringFormulaService, "score", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("IDCARD", stringFormulaService, "idCard", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod(FuncNames.ISSTRING.toString(), stringFormulaService, FuncNames.ISSTRING.getName(), new Class[]{Object[].class}, "");
+
+ //数学函数
+ runner.addFunctionOfServiceMethod("ROUNDUP", mathFuncsService, "roundUp", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("ROUND", mathFuncsService, "round", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod("ROUNDDOWN", mathFuncsService, "roundDown", new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod(FuncNames.AGGREGATION.toString(), mathFuncsService, FuncNames.AGGREGATION.getName(), new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod(FuncNames.MOD.toString(), mathFuncsService, FuncNames.MOD.getName(), new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod(FuncNames.TRUNC.toString(), mathFuncsService, FuncNames.TRUNC.getName(), new Class[]{Object.class, Object.class}, "");
+ runner.addFunctionOfServiceMethod(FuncNames.ISINT.toString(), mathFuncsService, FuncNames.ISINT.getName(), new Class[]{Object[].class}, "");
+ runner.addFunctionOfServiceMethod(FuncNames.ISNUMBER.toString(), mathFuncsService, FuncNames.ISNUMBER.getName(), new Class[]{Object[].class}, "");
+
+ //查找函数
+// runner.addFunctionOfServiceMethod(FuncNames.CHOOSE.toString(), findFuncsService, "chooseOne", new Class[]{Object[].class}, "");
+// runner.addFunctionOfServiceMethod(FuncNames.MATCH.toString(), findFuncsService, "match", new Class[]{Object[].class}, "");
+// runner.addFunctionOfServiceMethod(FuncNames.VLOOKUPS.toString(), findFuncsService, "vlookups", new Class[]{Object[].class}, "");
+
+ //数据库函数-hrm
+// runner.addFunctionOfServiceMethod(FuncNames.GETHRMNAME.toString(), hrmDbService, FuncNames.GETHRMNAME.getName(), new Class[]{Object[].class}, "");
+// runner.addFunctionOfServiceMethod(FuncNames.GETHRMMOBILE.toString(), hrmDbService, FuncNames.GETHRMMOBILE.getName(), new Class[]{Object[].class}, "");
+
+ //财务函数
+ runner.addFunctionOfServiceMethod(FuncNames.GETMONEY.toString(), financeService, FuncNames.GETMONEY.getName(), new Class[]{Object[].class}, "");
+
+ //数据库函数-hrm
+// runner.addFunctionOfServiceMethod(FuncNames.GETHRMLOGINID.toString(), hrmDbService, "getHrmLoginId", new Class[]{Object[].class}, "");
+// runner.addFunctionOfServiceMethod(FuncNames.GETHRMWORKCODE.toString(), hrmDbService, "getHrmWorkcode", new Class[]{Object[].class}, "");
+// runner.addFunctionOfServiceMethod(FuncNames.GETHRMMANAGER.toString(), hrmDbService, "getHrmManager", new Class[]{Object[].class}, "");
+// runner.addFunctionOfServiceMethod(FuncNames.GETHRMALLMANAGER.toString(), hrmDbService, "getHrmAllManager", new Class[]{Object[].class}, "");
+// runner.addFunctionOfServiceMethod(FuncNames.GETHRMDEPARTMENT.toString(), hrmDbService, "getHrmDepartment", new Class[]{Object[].class}, "");
+// runner.addFunctionOfServiceMethod(FuncNames.GETHRMSUBCOMPANY.toString(), hrmDbService, "getHrmSubcompany", new Class[]{Object[].class}, "");
+// runner.addFunctionOfServiceMethod(FuncNames.GETDEPARTMENTNAME.toString(), hrmDbService, "getDepartmentName", new Class[]{Object[].class}, "");
+// runner.addFunctionOfServiceMethod(FuncNames.GETDEPARTMENTCODE.toString(), hrmDbService, "getDepartmentCode", new Class[]{Object[].class}, "");
+// runner.addFunctionOfServiceMethod(FuncNames.GETSUPERDEPARTMENT.toString(), hrmDbService, "getSuperDepartment", new Class[]{Object[].class}, "");
+// runner.addFunctionOfServiceMethod(FuncNames.GETALLSUPERDEPARTMENT.toString(), hrmDbService, "getAllSuperDepartment", new Class[]{Object[].class}, "");
+// runner.addFunctionOfServiceMethod(FuncNames.GETSUBCOMPANYNAME.toString(), hrmDbService, "getSubcompanyName", new Class[]{Object[].class}, "");
+// runner.addFunctionOfServiceMethod(FuncNames.GETSUBCOMPANYCODE.toString(), hrmDbService, "getSubcompanyCode", new Class[]{Object[].class}, "");
+// runner.addFunctionOfServiceMethod(FuncNames.GETSUPERSUBCOMPANY.toString(), hrmDbService, "getSuperSubcompany", new Class[]{Object[].class}, "");
+// runner.addFunctionOfServiceMethod(FuncNames.GETALLSUPERSUBCOMPANY.toString(), hrmDbService, "getAllSuperSubcompany", new Class[]{Object[].class}, "");
+
+ //加载模块自定义函数
+// try {
+// List otherFuncList=excelFuncs.getOtherFuncs();
+// if(otherFuncList!=null && otherFuncList.size()>0){
+// //为每个方法实例化一个ExcelExtendFuncService
+// for (ExcelFunc excelFunc:otherFuncList){
+// //每个接口调度类实例化时指定模块和函数名
+// ExcelExtendFuncService excelExtendFuncService=new ExcelExtendFuncServiceImpl(excelFunc.getModule(),excelFunc.getName());
+// //将自定义函数放入context上下文中
+// runner.addFunctionOfServiceMethod(excelFunc.getName(),excelExtendFuncService, RpcMethod.execute.toString(),new Class[]{Object[].class},"");
+// }
+// }
+// } catch (Exception e) {
+// logger.error("err",e);
+// }
+ } catch (Exception e) {
+ logger.error("err", e);
+ throw new RuntimeException("初始化失败表达式");
+ }
+ }
+ isInitialRunner = true;
+ }
+}
diff --git a/src/com/engine/salary/formlua/core/QlExpressTest.java b/src/com/engine/salary/formlua/core/QlExpressTest.java
new file mode 100644
index 000000000..25af7e339
--- /dev/null
+++ b/src/com/engine/salary/formlua/core/QlExpressTest.java
@@ -0,0 +1,27 @@
+package com.engine.salary.formlua.core;
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 执行业务类
+ */
+public class QlExpressTest {
+
+ public static void main(String[] args) {
+ QlExpress express = new QlExpress();
+ Map context = new HashMap<>();
+ context.put("a", 1);
+ context.put("b", 2);
+ context.put("c", 3);
+ String formula = "IF(1=1,1,2)";
+
+ Object execute = express.execute(formula, context);
+ if(execute instanceof JSONObject){
+ Object data = ((JSONObject) execute).get("data");
+ System.out.println(data);
+ }
+ }
+}
diff --git a/src/com/engine/salary/formlua/core/exception/ErrorType.java b/src/com/engine/salary/formlua/core/exception/ErrorType.java
new file mode 100644
index 000000000..c165c1964
--- /dev/null
+++ b/src/com/engine/salary/formlua/core/exception/ErrorType.java
@@ -0,0 +1,70 @@
+package com.engine.salary.formlua.core.exception;
+
+import com.engine.salary.util.SalaryI18nUtil;
+
+public enum ErrorType {
+ /**
+ * 函数参数不能为空
+ */
+ NOT_NULL(SalaryI18nUtil.getI18nLabel(91326, "函数参数不能为空")),
+ /**
+ * 参数不能为空
+ */
+ VAR_NOT_NULL(SalaryI18nUtil.getI18nLabel(32804, "参数不能为空")),
+ /**
+ * 函数参数错误,参数类型需为数字字段
+ */
+ MUST_NUM(SalaryI18nUtil.getI18nLabel(91327, "函数参数错误,参数类型需为数字字段")),
+ /**
+ * 函数参数类型错误,参数需为表格
+ */
+ MUST_FORM(SalaryI18nUtil.getI18nLabel(91330, "函数参数类型错误,参数需为表格")),
+ /**
+ *
+ */
+ MUST_FORM_FIELD(SalaryI18nUtil.getI18nLabel(91331, "函数参数错误,参数类型需为表格字段")),
+ CANT_FORM_FIELD(SalaryI18nUtil.getI18nLabel(91427, "比较操作符参数不能是表格字段")),
+ /**
+ *
+ */
+ CND_NOT_NULL(SalaryI18nUtil.getI18nLabel(11575, "条件不能为空")),
+ /**
+ *
+ */
+ MIN_VAR_COUNT(SalaryI18nUtil.getI18nLabel(91332, "函数的最少参数个数")),
+ /**
+ *
+ */
+ MAX_VAR_COUNT(SalaryI18nUtil.getI18nLabel(91333, "函数的最多参数个数")),
+ /**
+ *
+ */
+ CANNOT_HAVE_VAR(SalaryI18nUtil.getI18nLabel(91334, "函数不能有参数")),
+ /**
+ *
+ */
+ RETURN_TYPE_DIFF(SalaryI18nUtil.getI18nLabel(91335, "函数多个条件的返回值必须一致")),
+ /**
+ *
+ */
+ VAR_COUNT_MUST_Odd(SalaryI18nUtil.getI18nLabel(91336, "函数最后一个参数需为默认返回值")),
+ /**
+ *
+ */
+ VAR_TYPE_WRONG(SalaryI18nUtil.getI18nLabel(91337, "函数参数类型错误")),
+ /**
+ *
+ */
+ VAR_MUST_HAVE_DATE(SalaryI18nUtil.getI18nLabel(91338, "函数日期参数必须包含年月日")),
+ /**
+ *
+ */
+ VAR_TYPE_MUST_BE(SalaryI18nUtil.getI18nLabel(91339, "函数参数类型错误,参数类型需为")),
+ /**
+ *
+ */
+ CANNOT_FIND_TEN(SalaryI18nUtil.getI18nLabel(91361, "函数未能获取到租户"));
+
+ ErrorType(String name) {
+ }
+}
diff --git a/src/com/engine/salary/formlua/core/exception/ExcelRunTimeException.java b/src/com/engine/salary/formlua/core/exception/ExcelRunTimeException.java
new file mode 100644
index 000000000..cd4a7736f
--- /dev/null
+++ b/src/com/engine/salary/formlua/core/exception/ExcelRunTimeException.java
@@ -0,0 +1,24 @@
+package com.engine.salary.formlua.core.exception;
+
+
+
+public class ExcelRunTimeException extends Exception{
+ private String info;
+
+ public ExcelRunTimeException(String info) {
+ super(info,new Exception(info));
+ this.info = info;
+ }
+
+ public ExcelRunTimeException() {
+ }
+
+ public String getInfo() {
+ return info;
+ }
+
+ public void setInfo(String info) {
+ this.info = info;
+ }
+
+}
diff --git a/src/com/engine/salary/formlua/entity/parameter/DataType.java b/src/com/engine/salary/formlua/entity/parameter/DataType.java
index 275e7d8f3..f049136a6 100644
--- a/src/com/engine/salary/formlua/entity/parameter/DataType.java
+++ b/src/com/engine/salary/formlua/entity/parameter/DataType.java
@@ -1,6 +1,7 @@
package com.engine.salary.formlua.entity.parameter;
import com.engine.salary.entity.datacollection.DataCollectionEmployee;
+import com.engine.salary.formlua.entity.standard.FormulaFilterData;
import java.io.Serializable;
import java.util.ArrayList;
@@ -79,7 +80,7 @@ public class DataType implements Serializable {
/**
* 高级搜索条件,由函数的逻辑操作符和逻辑函数构建,模块不需要处理
*/
-// List formulaFilterDataList=null;
+ List formulaFilterDataList=null;
private List subLogic=new ArrayList<>();
public static boolean checkType(String dataTypeL,String dataTypeR){
if(returnType(dataTypeL).equalsIgnoreCase(dataTypeR)){
@@ -268,11 +269,11 @@ public class DataType implements Serializable {
this.subFormData = subFormData;
}
-// public List getFormulaFilterDataList() {
-// return formulaFilterDataList;
-// }
-//
-// public void setFormulaFilterDataList(List formulaFilterDataList) {
-// this.formulaFilterDataList = formulaFilterDataList;
-// }
+ public List getFormulaFilterDataList() {
+ return formulaFilterDataList;
+ }
+
+ public void setFormulaFilterDataList(List formulaFilterDataList) {
+ this.formulaFilterDataList = formulaFilterDataList;
+ }
}
diff --git a/src/com/engine/salary/formlua/entity/parameter/DateAndString.java b/src/com/engine/salary/formlua/entity/parameter/DateAndString.java
new file mode 100644
index 000000000..4e660c0af
--- /dev/null
+++ b/src/com/engine/salary/formlua/entity/parameter/DateAndString.java
@@ -0,0 +1,5 @@
+package com.engine.salary.formlua.entity.parameter;
+
+
+public class DateAndString {
+}
diff --git a/src/com/engine/salary/formlua/entity/parameter/ExcelFunc.java b/src/com/engine/salary/formlua/entity/parameter/ExcelFunc.java
new file mode 100644
index 000000000..83d23af7f
--- /dev/null
+++ b/src/com/engine/salary/formlua/entity/parameter/ExcelFunc.java
@@ -0,0 +1,138 @@
+package com.engine.salary.formlua.entity.parameter;
+
+import com.alibaba.fastjson.JSONObject;
+
+
+public class ExcelFunc {
+
+ private String name;//函数名称
+ private String chineseName;//中文
+ private String description;//函数描述
+ private String formatString;//函数格式
+ private String[] paramArray;//函数参数列表
+ private String[] paramData;//参数默认数据
+ private String returnType;//返回类型
+ private String type="function";//
+ private String validForm;//有效的表单类型 current用户当前表单、all 用户所有表单
+ private JSONObject jsonFormat;
+ private String module;
+ public ExcelFunc(){}
+
+ /**
+ *
+ * @param name 名称
+ * @param description 描述
+ * @param formatString 格式
+ * @param paramArray 参数列表
+ * @param returnType 返回类型
+ */
+ public ExcelFunc(String name,String chineseName, String description, String formatString, String[] paramArray,String[] paramData, String returnType,JSONObject jsonFormat,String validForm) {
+ this.name = name;
+ this.chineseName=chineseName;
+ this.description = description;
+ this.formatString = formatString;
+ this.paramArray = paramArray;
+ this.returnType = returnType;
+ this.jsonFormat=jsonFormat;
+ this.paramData=paramData;
+ this.validForm=validForm;
+ }
+ public ExcelFunc(String name,String chineseName, String description, String formatString, String[] paramArray,String[] paramData, String returnType,String validForm) {
+ this.name = name;
+ this.chineseName=chineseName;
+ this.description = description;
+ this.formatString = formatString;
+ this.paramArray = paramArray;
+ this.returnType = returnType;
+ this.paramData=paramData;
+ this.validForm=validForm;
+ }
+
+ public String getModule() {
+ return module;
+ }
+
+ public void setModule(String module) {
+ this.module = module;
+ }
+
+ public String getValidForm() {
+ return validForm;
+ }
+
+ public void setValidForm(String validForm) {
+ this.validForm = validForm;
+ }
+
+ public String getChineseName() {
+ return chineseName;
+ }
+
+ public void setChineseName(String chineseName) {
+ this.chineseName = chineseName;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public String getFormatString() {
+ return formatString;
+ }
+
+ public void setFormatString(String formatString) {
+ this.formatString = formatString;
+ }
+
+ public String[] getParamArray() {
+ return paramArray;
+ }
+
+ public void setParamArray(String[] paramArray) {
+ this.paramArray = paramArray;
+ }
+
+ public String getReturnType() {
+ return returnType;
+ }
+
+ public void setReturnType(String returnType) {
+ this.returnType = returnType;
+ }
+
+ public JSONObject getJsonFormat() {
+ return jsonFormat;
+ }
+
+ public void setJsonFormat(JSONObject jsonFormat) {
+ this.jsonFormat = jsonFormat;
+ }
+
+ public String[] getParamData() {
+ return paramData;
+ }
+
+ public void setParamData(String[] paramData) {
+ this.paramData = paramData;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+}
diff --git a/src/com/engine/salary/formlua/entity/parameter/ExcelFuncs.java b/src/com/engine/salary/formlua/entity/parameter/ExcelFuncs.java
new file mode 100644
index 000000000..437d8376e
--- /dev/null
+++ b/src/com/engine/salary/formlua/entity/parameter/ExcelFuncs.java
@@ -0,0 +1,467 @@
+package com.engine.salary.formlua.entity.parameter;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.engine.salary.util.SalaryI18nUtil;
+import org.apache.commons.compress.utils.Lists;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import java.util.LinkedList;
+import java.util.List;
+
+
+@Component
+public class ExcelFuncs {
+ protected final Logger logger = LoggerFactory.getLogger(getClass());
+ final static private String ALLFORM="all";
+ final static private String CURRENTDATA="current_data";
+ static String normalStr="{\"key\":\"\",\"fieldId\":\"\",\"componentKey\":\"\",\"term\":\"\",\"formId\":\"\",\"content\":\"\",\"fieldType\":\"\"}";
+ static public JSONObject normalJson= JSON.parseObject(normalStr);
+ static private String[] nullParamDatas=new String[]{};
+ static private String[] paramDatas=new String[]{};
+ static private String[] allParamDatas=new String[]{"{}","[]"};
+ static private String[] moduleList=new String[]{"biaoge","workflow"};
+ private FuncDescUtil funcDescUtil;
+ public List getCompList(){
+ //比较操作符
+ List compList=new LinkedList<>();
+ ExcelFunc excelFunc=null;
+ String [] paramArray=new String[]{};
+ excelFunc=new ExcelFunc(">",SalaryI18nUtil.getI18nLabel(12132,"大于"), "","",paramArray,paramDatas,"Boolean",CURRENTDATA);
+ compList.add(excelFunc);
+
+ excelFunc=new ExcelFunc(">=",SalaryI18nUtil.getI18nLabel(27694,"大于等于"), "","",paramArray,paramDatas,"Boolean",CURRENTDATA);
+ compList.add(excelFunc);
+
+ excelFunc=new ExcelFunc("<",SalaryI18nUtil.getI18nLabel(20009,"小于"), "","",paramArray,paramDatas,"Boolean",CURRENTDATA);
+ compList.add(excelFunc);
+
+ excelFunc=new ExcelFunc("<=",SalaryI18nUtil.getI18nLabel(15251,"小于等于"), "","",paramArray,paramDatas,"Boolean",CURRENTDATA);
+ compList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("=",SalaryI18nUtil.getI18nLabel(15112,"等于"), "","",paramArray,paramDatas,"Boolean",CURRENTDATA);
+ compList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("!=", SalaryI18nUtil.getI18nLabel(14897,"不等于"), "","",paramArray,paramDatas,"Boolean",CURRENTDATA);
+ compList.add(excelFunc);
+
+ return compList;
+ }
+
+ /**
+ * 日期函数的列表
+ * @return
+ */
+ public List getDateList(){
+ //日期函数
+ List dateList=new LinkedList<>();
+ ExcelFunc excelFunc=null;
+ String [] paramArray=new String[]{};
+ excelFunc=new ExcelFunc("TODAY",SalaryI18nUtil.getI18nLabel(94924,"当前日期"), funcDescUtil.get("TODAY"),"TODAY()",paramArray,nullParamDatas,"String",CURRENTDATA);
+ dateList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("NOW",SalaryI18nUtil.getI18nLabel(94925,"当前日期时间"), funcDescUtil.get("NOW"),"NOW()",paramArray,nullParamDatas,"String",CURRENTDATA);
+ dateList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("DATEADD",SalaryI18nUtil.getI18nLabel(94926,"对日期加减年、月、日"), funcDescUtil.get("DATEADD"),"DATEADD(日期, 数值, ['单位'])",nullParamDatas,paramArray,"String",CURRENTDATA);
+ dateList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("DATEDIFF",SalaryI18nUtil.getI18nLabel(94927,"返回两个日期的差值"), funcDescUtil.get("DATEDIFF"),"DATEDIFF(日期1, 日期2, ['单位'])",nullParamDatas,paramArray,"Number",CURRENTDATA);
+ dateList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("DATEFORMAT",SalaryI18nUtil.getI18nLabel(94928,"返回指定格式的日期"), funcDescUtil.get("DATEFORMAT"),"DATEFORMAT(日期, '可选格式')",paramArray,nullParamDatas,"String",CURRENTDATA);
+ dateList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("YEAR",SalaryI18nUtil.getI18nLabel(94929,"返回日期中的年"), funcDescUtil.get("YEAR"),"YEAR(日期)",paramArray,nullParamDatas,"Number",CURRENTDATA);
+ dateList.add(excelFunc);
+
+ paramArray=new String[]{"String"};
+ excelFunc=new ExcelFunc("MONTH",SalaryI18nUtil.getI18nLabel(94930,"返回日期中的月"), funcDescUtil.get("MONTH"),"MONTH(日期)",paramArray,nullParamDatas,"Number",CURRENTDATA);
+ dateList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("DAY",SalaryI18nUtil.getI18nLabel(94931,"返回日期中的日"), funcDescUtil.get("DAY"),"DAY(日期)",paramArray,nullParamDatas,"Number",CURRENTDATA);
+ dateList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("HOUR",SalaryI18nUtil.getI18nLabel(94932,"返回日期中的小时"), funcDescUtil.get("HOUR"),"HOUR(日期)",paramArray,nullParamDatas,"Number",CURRENTDATA);
+ dateList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("MINUTE",SalaryI18nUtil.getI18nLabel(94933,"返回日期中的分钟"), funcDescUtil.get("MINUTE"),"MINUTE(日期)",paramArray,nullParamDatas,"Number",CURRENTDATA);
+ dateList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("SECOND",SalaryI18nUtil.getI18nLabel(94934,"返回日期中的秒"), funcDescUtil.get("SECOND"),"SECOND(日期)",paramArray,nullParamDatas,"Number",CURRENTDATA);
+ dateList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("WEEKNUM",SalaryI18nUtil.getI18nLabel(94936,"返回日期为第几周"), funcDescUtil.get("WEEKNUM"),"WEEKNUM(日期)",paramArray,nullParamDatas,"Number",CURRENTDATA);
+ dateList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("WEEKDAY",SalaryI18nUtil.getI18nLabel(94937,"返回日期为星期几"), funcDescUtil.get("WEEKDAY"),"WEEKDAY(日期)",paramArray,nullParamDatas,"Number",CURRENTDATA);
+ dateList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("NETWORKDAYSPI",SalaryI18nUtil.getI18nLabel(94938,"返回指定日期之间包含的工作日天数(仅限的过去时间)"), funcDescUtil.get("NETWORKDAYSPI"),"NETWORKDAYSPI(日期1, 日期2, 成员)",paramArray,nullParamDatas,"Number",CURRENTDATA);
+ dateList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("EOMONTH",SalaryI18nUtil.getI18nLabel(94939,"返回某月最后一天日期"), funcDescUtil.get("EOMONTH"),"EOMONTH(日期,指定日期之前或之后的月数)",paramArray,nullParamDatas,"Number",CURRENTDATA);
+ dateList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("CURRYEAR",SalaryI18nUtil.getI18nLabel(101059,"返回当前年份"), funcDescUtil.get("CURRYEAR"),"CURRYEAR()",paramArray,nullParamDatas,"String",CURRENTDATA);
+ dateList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("CURRMONTH",SalaryI18nUtil.getI18nLabel(101060,"返回当前月份"), funcDescUtil.get("CURRMONTH"),"CURRMONTH()",paramArray,nullParamDatas,"String",CURRENTDATA);
+ dateList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("CURRDAY",SalaryI18nUtil.getI18nLabel(101061,"返回当前第几日(当月)"), funcDescUtil.get("CURRDAY"),"CURRDAY()",paramArray,nullParamDatas,"String",CURRENTDATA);
+ dateList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("CURRWEEK",SalaryI18nUtil.getI18nLabel(101062,"返回当前是周几"), funcDescUtil.get("CURRWEEK"),"CURRWEEK()",paramArray,nullParamDatas,"String",CURRENTDATA);
+ dateList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("CURRHOUR",SalaryI18nUtil.getI18nLabel(101063,"返回当前小时"), funcDescUtil.get("CURRHOUR"),"CURRHOUR()",paramArray,nullParamDatas,"String",CURRENTDATA);
+ dateList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("CURRMINUTE",SalaryI18nUtil.getI18nLabel(101064,"返回当前分"), funcDescUtil.get("CURRMINUTE"),"CURRMINUTE()",paramArray,nullParamDatas,"String",CURRENTDATA);
+ dateList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("CURRSECOND",SalaryI18nUtil.getI18nLabel(101065,"返回当前秒"), funcDescUtil.get("CURRSECOND"),"CURRSECOND()",paramArray,nullParamDatas,"String",CURRENTDATA);
+ dateList.add(excelFunc);
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("MAXDATE",SalaryI18nUtil.getI18nLabel(100803,"返回一组日期中的最大值"), funcDescUtil.get("MAXDATE"),"MAXDATE(日期1,日期2,……)",paramArray,nullParamDatas,"String",CURRENTDATA);
+ dateList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("MINDATE",SalaryI18nUtil.getI18nLabel(100805,"返回一组日期中的最小值"), funcDescUtil.get("MINDATE"),"MINDATE(日期1,日期2,……)",paramArray,nullParamDatas,"String",CURRENTDATA);
+ dateList.add(excelFunc);
+ return dateList;
+ }
+
+ /**
+ * 逻辑函数的列表
+ * @return
+ */
+ public List getLogicList(){
+ //逻辑函数
+ List logicList=new LinkedList<>();
+ ExcelFunc excelFunc=null;
+ String [] paramArray=new String[]{};
+ excelFunc=new ExcelFunc("IF",SalaryI18nUtil.getI18nLabel(94940,"如果条件为真,则...否则..."), funcDescUtil.get("IF"),"IF(条件, 表达式1, 表达式2)",paramArray,nullParamDatas,"Object",CURRENTDATA);
+ logicList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("AND",SalaryI18nUtil.getI18nLabel(51100,"且"), funcDescUtil.get("AND"),"AND(条件1, 条件2, [条件3, …])",paramArray,nullParamDatas,"Boolean",CURRENTDATA);
+ logicList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("OR",SalaryI18nUtil.getI18nLabel(35824,"或"), funcDescUtil.get("OR"),"OR(条件1, 条件2, [条件3, …])",paramArray,nullParamDatas,"Boolean",CURRENTDATA);
+ logicList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("NOT",SalaryI18nUtil.getI18nLabel(94942,"反转真假结果"), funcDescUtil.get("NOT"),"NOT(逻辑结果)",paramArray,nullParamDatas,"Boolean",CURRENTDATA);
+ logicList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("IN",SalaryI18nUtil.getI18nLabel(94943,"变量是否包含在一组结果中"), funcDescUtil.get("IN"),"IN(变量, [变量1, 变量2, …])",paramArray,allParamDatas,"Boolean",CURRENTDATA);
+ logicList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("LIKE",SalaryI18nUtil.getI18nLabel(94944,"文本是否包含任意一个关键字"), funcDescUtil.get("LIKE"),"LIKE(文本, [文本1, 文本2, …])",paramArray,allParamDatas,"Boolean",CURRENTDATA);
+ logicList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("ISEMPTY",SalaryI18nUtil.getI18nLabel(94945,"是否为空"), funcDescUtil.get("ISEMPTY"),"ISEMPTY(变量)",paramArray,paramDatas,"Boolean",CURRENTDATA);
+ logicList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("TRUE",SalaryI18nUtil.getI18nLabel(94946,"返回真"), funcDescUtil.get("TRUE"),"TRUE()",paramArray,nullParamDatas,"Boolean",CURRENTDATA);
+ logicList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("FALSE",SalaryI18nUtil.getI18nLabel(94947,"返回假"), funcDescUtil.get("FALSE"),"FALSE()",paramArray,nullParamDatas,"Boolean",CURRENTDATA);
+ logicList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("IFS",SalaryI18nUtil.getI18nLabel(94948,"多条件"), funcDescUtil.get("IFS"),"IFS({条件1},{结果1},{条件2},{结果2}...{默认结果})",paramArray,nullParamDatas,"Object",CURRENTDATA);
+ logicList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("FIND",SalaryI18nUtil.getI18nLabel(31835,"查找"), funcDescUtil.get("FIND"),"FIND([{查找值1},{查找值2}...{查找值N}],[{查找目标1},{查找目标2}...{查找目标N}])",paramArray,nullParamDatas,"Boolean",CURRENTDATA);
+ logicList.add(excelFunc);
+ return logicList;
+ }
+
+ /**
+ * 字符函数的列表
+ * @return
+ */
+ public List getStringList(){
+ //字符函数
+ List stringList=new LinkedList<>();
+ ExcelFunc excelFunc=null;
+ String [] paramArray=new String[]{};
+ excelFunc=new ExcelFunc("CONCAT",SalaryI18nUtil.getI18nLabel(94949,"链接多个文本"), funcDescUtil.get("CONCAT"),"CONCAT(文本1, 文本2, [文本3, …])",paramArray,nullParamDatas,"String",CURRENTDATA);
+ stringList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("TEXT",SalaryI18nUtil.getI18nLabel(94950,"将变量转为文本"), funcDescUtil.get("TEXT"),"TEXT(变量)",paramArray,nullParamDatas,"String",CURRENTDATA);
+ stringList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("VALUE",SalaryI18nUtil.getI18nLabel(94951,"将文本转为数字"), funcDescUtil.get("VALUE"),"VALUE(文本)",paramArray,nullParamDatas,"Number",CURRENTDATA);
+ stringList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("LEN",SalaryI18nUtil.getI18nLabel(94952,"返回文本长度"), funcDescUtil.get("LEN"),"LEN(文本)",paramArray,nullParamDatas,"Number",CURRENTDATA);
+ stringList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("SEARCH",SalaryI18nUtil.getI18nLabel(94953,"在文本中查找关键字"), funcDescUtil.get("SEARCH"),"SEARCH(关键字, 文本, [搜索开始位置])",paramArray,nullParamDatas,"Number",CURRENTDATA);
+ stringList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("REPLACE",SalaryI18nUtil.getI18nLabel(94954,"替换文本中的字"), funcDescUtil.get("REPLACE"),"REPLACE(原文本, 替换开始位置, 替换字符数, 新文本)",paramArray,nullParamDatas,"String",CURRENTDATA);
+ stringList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("REPT",SalaryI18nUtil.getI18nLabel(94955,"将文本重复指定次数"), funcDescUtil.get("REPT"),"REPT(文本, 重复次数)",paramArray,nullParamDatas,"String",CURRENTDATA);
+ stringList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("PAD",SalaryI18nUtil.getI18nLabel(94956,"将文本填充至指定长度"), funcDescUtil.get("PAD"),"PAD(原文本, 长度, 填充用的文本, ['填充位置'])",paramArray,nullParamDatas,"String",CURRENTDATA);
+ stringList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("TRIM",SalaryI18nUtil.getI18nLabel(94957,"清除前后空格"), funcDescUtil.get("TRIM"),"TRIM(文本)",paramArray,nullParamDatas,"String",CURRENTDATA);
+ stringList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("LEFT",SalaryI18nUtil.getI18nLabel(94958,"返回文本左侧开始的文字"), funcDescUtil.get("LEFT"),"LEFT(文本, 截取字符数)",paramArray,nullParamDatas,"String",CURRENTDATA);
+ stringList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("RIGHT",SalaryI18nUtil.getI18nLabel(94959,"返回文本右侧开始的文字"), funcDescUtil.get("RIGHT"),"RIGHT(文本, 截取字符数)",paramArray,nullParamDatas,"String",CURRENTDATA);
+ stringList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("MID",SalaryI18nUtil.getI18nLabel(94960,"返回文本指定位置开始的文字"), funcDescUtil.get("MID"),"MID(文本, 指定位置, 截取字符数)",paramArray,nullParamDatas,"String",CURRENTDATA);
+ stringList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("SCORE",SalaryI18nUtil.getI18nLabel(94961,"获取选项型控件分数"), funcDescUtil.get("SCORE"),"SCORE({选项型控件})",paramArray,nullParamDatas,"String",CURRENTDATA);
+ stringList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("IDCARD",SalaryI18nUtil.getI18nLabel(94962,"身份证函数"), funcDescUtil.get("IDCARD"),"IDCARD({身份证号码}, {查找类型})",paramArray,nullParamDatas,"String",CURRENTDATA);
+ stringList.add(excelFunc);
+
+
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("ISSTRING",SalaryI18nUtil.getI18nLabel(0,"是否是字符串"), funcDescUtil.get("ISSTRING"),"ISSTRING({任意控件})",paramArray,nullParamDatas,"String",CURRENTDATA);
+ stringList.add(excelFunc);
+
+// paramArray=new String[]{};
+// excelFunc=new ExcelFunc("SUBSTRING",SalaryI18nUtil.getI18nLabel(97524,"字符截取函数"), funcDescUtil.get("SUBSTRING"),"SUBSTRING({源字符}, {截取开始位置},{截取结束位置})",paramArray,nullParamDatas,"String",CURRENTDATA);
+// stringList.add(excelFunc);
+// paramArray=new String[]{};
+// excelFunc=new ExcelFunc("SUBSTITUE",SalaryI18nUtil.getI18nLabel(97525,"字符查找替换函数"), funcDescUtil.get("SUBSTITUE"),"SUBSTITUE({源字符}, {被替换字符},{新字符})",paramArray,nullParamDatas,"String",CURRENTDATA);
+// stringList.add(excelFunc);
+// paramArray=new String[]{};
+// excelFunc=new ExcelFunc("LOWER",SalaryI18nUtil.getI18nLabel(97526,"字符转小写函数"), funcDescUtil.get("LOWER"),"LOWER({源字符})",paramArray,nullParamDatas,"String",CURRENTDATA);
+// stringList.add(excelFunc);
+// paramArray=new String[]{};
+// excelFunc=new ExcelFunc("UPPER",SalaryI18nUtil.getI18nLabel(97527,"字符转大写函数"), funcDescUtil.get("UPPER"),"UPPER({源字符})",paramArray,nullParamDatas,"String",CURRENTDATA);
+// stringList.add(excelFunc);
+// paramArray=new String[]{};
+// excelFunc=new ExcelFunc("EXACT",SalaryI18nUtil.getI18nLabel(97528,"字符比较函数"), funcDescUtil.get("EXACT"),"EXACT({字符1}, {字符2})",paramArray,nullParamDatas,"String",CURRENTDATA);
+// stringList.add(excelFunc);
+ return stringList;
+ }
+
+ /**
+ * 数学函数的列表
+ * @return
+ */
+ public List getMathList(){
+ List mathList=new LinkedList<>();
+ ExcelFunc excelFunc=null;
+ String [] paramArray=new String[]{};
+ excelFunc=new ExcelFunc("ROUNDUP",SalaryI18nUtil.getI18nLabel(94963,"向上舍入"), funcDescUtil.get("ROUNDUP"),"ROUNDUP(数值, [小数位精确度])",paramArray,nullParamDatas,"Number",CURRENTDATA);
+ mathList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("ROUND",SalaryI18nUtil.getI18nLabel(17392,"四舍五入"), funcDescUtil.get("ROUND"),"ROUND(数值, [小数位精确度])",paramArray,nullParamDatas,"Number",CURRENTDATA);
+ mathList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("ROUNDDOWN",SalaryI18nUtil.getI18nLabel(94964,"向下舍入"), funcDescUtil.get("ROUNDDOWN"),"ROUNDDOWN(数值, [小数位精确度])",paramArray,nullParamDatas,"Number",CURRENTDATA);
+ mathList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("AGGREGATION",SalaryI18nUtil.getI18nLabel(94965,"聚合运算"), funcDescUtil.get("AGGREGATION"),"AGGREGATION({数字}...,{聚合运算类型})",paramArray,nullParamDatas,"Number",CURRENTDATA);
+ mathList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("MOD",SalaryI18nUtil.getI18nLabel(94966,"求余"), funcDescUtil.get("MOD"),"ROUNDDOWN({数字},{数字})",paramArray,nullParamDatas,"Number",CURRENTDATA);
+ mathList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("TRUNC",SalaryI18nUtil.getI18nLabel(94967,"数字格式化"), funcDescUtil.get("TRUNC"),"ROUNDDOWN({数字},{精度})",paramArray,nullParamDatas,"Number",CURRENTDATA);
+ mathList.add(excelFunc);
+
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("ISINT",SalaryI18nUtil.getI18nLabel(0,"字符内容是否是整数"), funcDescUtil.get("ISINT"),"ISINT({字符})",paramArray,nullParamDatas,"String",CURRENTDATA);
+ mathList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("ISNUMBER",SalaryI18nUtil.getI18nLabel(0,"字符内容是否是数字"), funcDescUtil.get("ISNUMBER"),"ISNUMBER({字符})",paramArray,nullParamDatas,"String",CURRENTDATA);
+ mathList.add(excelFunc);
+
+ return mathList;
+
+ }
+
+ /**
+ * 查找函数的列表
+ * @return
+ */
+ public List getFindList(){
+ List findList=new LinkedList<>();
+ ExcelFunc excelFunc=null;
+ String [] paramArray=new String[]{};
+ excelFunc=new ExcelFunc("CHOOSE",SalaryI18nUtil.getI18nLabel(94968,"返回索引范围内指定的值"), funcDescUtil.get("CHOOSE"),"CHOOSE(数据源,[条件])",paramArray,nullParamDatas,"Array",CURRENTDATA);
+ findList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("VLOOKUPS",SalaryI18nUtil.getI18nLabel(94969,"按列查找,返回所需值"), funcDescUtil.get("VLOOKUPS"),"VLOOKUPS(表,[条件],[返回参数])",paramArray,nullParamDatas,"Array",CURRENTDATA);
+ findList.add(excelFunc);
+
+ paramArray=new String[]{};
+ excelFunc=new ExcelFunc("MATCH",SalaryI18nUtil.getI18nLabel(94970,"返回指定数值在指定数组区域中的位置"), funcDescUtil.get("MATCH"),"MATCH(值,[数组])",paramArray,nullParamDatas,"Number",CURRENTDATA);
+ findList.add(excelFunc);
+ return findList;
+ }
+
+ /**
+ * 聚合函数 COUNT(表格, [统计条件])
+ * @return
+ */
+ public List getAggList(){
+ List aggList=new LinkedList<>();
+ ExcelFunc excelFunc=null;
+
+ String [] paramArray=new String[]{"Form","Number","Boolean"};
+ excelFunc=new ExcelFunc("COUNT", SalaryI18nUtil.getI18nLabel(16654,"计数"), funcDescUtil.get("COUNT"),"COUNT(表格)",paramArray,paramDatas,"Number",ALLFORM);
+ aggList.add(excelFunc);
+
+ paramArray=new String[]{"Number","Number","Boolean"};
+ excelFunc=new ExcelFunc("SUM",SalaryI18nUtil.getI18nLabel(95012,"求和") , funcDescUtil.get("SUM"),"SUM(数字字段)",paramArray,paramDatas,"Number",ALLFORM);
+ aggList.add(excelFunc);
+
+ paramArray=new String[]{"Number","Number","Boolean"};
+ excelFunc=new ExcelFunc("AVG",SalaryI18nUtil.getI18nLabel(19550,"平均值"), funcDescUtil.get("AVG"),"AVG(数字字段)",paramArray,paramDatas,"Number",ALLFORM);
+ aggList.add(excelFunc);
+
+ paramArray=new String[]{"Number","Number","Boolean"};
+ excelFunc=new ExcelFunc("MIN",SalaryI18nUtil.getI18nLabel(12318,"最小值"), funcDescUtil.get("MIN"),"MIN(表格)",paramArray,paramDatas,"Number",ALLFORM);
+ aggList.add(excelFunc);
+
+ paramArray=new String[]{"Number","Number","Boolean"};
+ excelFunc=new ExcelFunc("MAX",SalaryI18nUtil.getI18nLabel(66750,"最大值"), funcDescUtil.get("MAX"),"MAX(表格)",paramArray,paramDatas,"Number",ALLFORM);
+ aggList.add(excelFunc);
+ return aggList;
+ }
+
+ /**
+ * 财务类函数列表
+ * @return
+ */
+ public Object getFinanceList(){
+ ExcelFunc excelFunc = null;
+ List funcs = Lists.newArrayList();
+ excelFunc = new ExcelFunc("GETMONEY",SalaryI18nUtil.getI18nLabel(0,"获取锁给定数字的金额大写"), funcDescUtil.get("GETMONEY"),"GETMONEY({数字})",null,nullParamDatas,"",CURRENTDATA);
+ funcs.add(excelFunc);
+
+ return funcs;
+ }
+ /**
+ * 数据库函数列表
+ * @return
+ */
+ public Object getDataBaseList() {
+ ExcelFunc excelFunc = null;
+ List funcs = Lists.newArrayList();
+
+// excelFunc = new ExcelFunc("GETHRMLOGINID",SalaryI18nUtil.getI18nLabel(100807,"返回指定人员系统账号"), funcDescUtil.get("GETHRMLOGINID"),"GETHRMLOGINID({表单.人员})",null,nullParamDatas,"",CURRENTDATA);
+// funcs.add(excelFunc);
+//
+// excelFunc = new ExcelFunc("GETHRMWORKCODE",SalaryI18nUtil.getI18nLabel(100809,"返回指定人员编号"), funcDescUtil.get("GETHRMWORKCODE"),"GETHRMWORKCODE({表单.人员})",null,nullParamDatas,"",CURRENTDATA);
+// funcs.add(excelFunc);
+//
+// excelFunc = new ExcelFunc("GETHRMMANAGER",SalaryI18nUtil.getI18nLabel(100811,"返回指定人员直接上级"), funcDescUtil.get("GETHRMMANAGER"),"GETHRMMANAGER({表单.人员})",null,nullParamDatas,"",CURRENTDATA);
+// funcs.add(excelFunc);
+//
+// excelFunc = new ExcelFunc("GETHRMALLMANAGER",SalaryI18nUtil.getI18nLabel(100813,"返回指定人员所有上级"), funcDescUtil.get("GETHRMALLMANAGER"),"GETHRMALLMANAGER({表单.人员})",null,nullParamDatas,"",CURRENTDATA);
+// funcs.add(excelFunc);
+//
+// excelFunc = new ExcelFunc("GETHRMDEPARTMENT",SalaryI18nUtil.getI18nLabel(100815,"返回指定人员部门"), funcDescUtil.get("GETHRMDEPARTMENT"),"GETHRMDEPARTMENT({表单.人员})",null,nullParamDatas,"",CURRENTDATA);
+// funcs.add(excelFunc);
+//
+// excelFunc = new ExcelFunc("GETHRMSUBCOMPANY",SalaryI18nUtil.getI18nLabel(100817,"返回指定人员分部"), funcDescUtil.get("GETHRMSUBCOMPANY"),"GETHRMSUBCOMPANY({表单.人员})",null,nullParamDatas,"",CURRENTDATA);
+// funcs.add(excelFunc);
+//
+// excelFunc = new ExcelFunc("GETDEPARTMENTNAME",SalaryI18nUtil.getI18nLabel(100819,"返回指定部门名称"), funcDescUtil.get("GETDEPARTMENTNAME"),"GETDEPARTMENTNAME({表单.部门})",null,nullParamDatas,"",CURRENTDATA);
+// funcs.add(excelFunc);
+//
+// excelFunc = new ExcelFunc("GETDEPARTMENTCODE",SalaryI18nUtil.getI18nLabel(100821,"返回指定部门编号"), funcDescUtil.get("GETDEPARTMENTCODE"),"GETDEPARTMENTCODE({表单.部门})",null,nullParamDatas,"",CURRENTDATA);
+// funcs.add(excelFunc);
+//
+// excelFunc = new ExcelFunc("GETSUPERDEPARTMENT",SalaryI18nUtil.getI18nLabel(100823,"返回指定部门直接上级部门"), funcDescUtil.get("GETSUPERDEPARTMENT"),"GETSUPERDEPARTMENT({表单.部门})",null,nullParamDatas,"",CURRENTDATA);
+// funcs.add(excelFunc);
+//
+// excelFunc = new ExcelFunc("GETALLSUPERDEPARTMENT",SalaryI18nUtil.getI18nLabel(100825,"返回指定部门所有上级部门"), funcDescUtil.get("GETALLSUPERDEPARTMENT"),"GETALLSUPERDEPARTMENT({表单.部门})",null,nullParamDatas,"",CURRENTDATA);
+// funcs.add(excelFunc);
+//
+// excelFunc = new ExcelFunc("GETSUBCOMPANYNAME",SalaryI18nUtil.getI18nLabel(100827,"返回指定分部名称"), funcDescUtil.get("GETSUBCOMPANYNAME"),"GETSUBCOMPANYNAME({表单.分部})",null,nullParamDatas,"",CURRENTDATA);
+// funcs.add(excelFunc);
+//
+// excelFunc = new ExcelFunc("GETSUBCOMPANYCODE",SalaryI18nUtil.getI18nLabel(100829,"返回指定分部编号"), funcDescUtil.get("GETSUBCOMPANYCODE"),"GETSUBCOMPANYCODE({表单.分部})",null,nullParamDatas,"",CURRENTDATA);
+// funcs.add(excelFunc);
+//
+// excelFunc = new ExcelFunc("GETSUPERSUBCOMPANY",SalaryI18nUtil.getI18nLabel(100831,"返回指定分部直接上级分部"), funcDescUtil.get("GETSUPERSUBCOMPANY"),"GETSUPERSUBCOMPANY({表单.分部})",null,nullParamDatas,"",CURRENTDATA);
+// funcs.add(excelFunc);
+//
+// excelFunc = new ExcelFunc("GETALLSUPERSUBCOMPANY",SalaryI18nUtil.getI18nLabel(100833,"返回指定分部所有上级分部"), funcDescUtil.get("GETALLSUPERSUBCOMPANY"),"GETALLSUPERSUBCOMPANY({表单.分部})",null,nullParamDatas,"",CURRENTDATA);
+// funcs.add(excelFunc);
+
+ excelFunc = new ExcelFunc("GETHRMNAME",SalaryI18nUtil.getI18nLabel(100833,"获取人员名称"), funcDescUtil.get("GETHRMNAME"),"GETHRMNAME({人员})",null,nullParamDatas,"",CURRENTDATA);
+ funcs.add(excelFunc);
+
+ excelFunc = new ExcelFunc("GETHRMMOBILE",SalaryI18nUtil.getI18nLabel(100833,"获取人员手机号码"), funcDescUtil.get("GETHRMMOBILE"),"GETHRMMOBILE({人员})",null,nullParamDatas,"",CURRENTDATA);
+ funcs.add(excelFunc);
+
+ return funcs;
+ }
+}
diff --git a/src/com/engine/salary/formlua/entity/parameter/FormulaContext.java b/src/com/engine/salary/formlua/entity/parameter/FormulaContext.java
new file mode 100644
index 000000000..d51715e23
--- /dev/null
+++ b/src/com/engine/salary/formlua/entity/parameter/FormulaContext.java
@@ -0,0 +1,35 @@
+package com.engine.salary.formlua.entity.parameter;
+
+import com.alibaba.fastjson.JSONObject;
+
+
+public class FormulaContext {
+ public static ThreadLocal fmCtx=new ThreadLocal();
+
+ private JSONObject formulaJson=new JSONObject();
+
+ public static FormulaContext get(){
+ if(null==fmCtx.get()){
+ fmCtx.set(new FormulaContext());
+ }
+ return fmCtx.get();
+ }
+
+ public JSONObject getFormulaJson() {
+ return formulaJson;
+ }
+ public void setValue(String func){
+ if(formulaJson.getInteger(func)!=null){
+ int i=formulaJson.getInteger(func)+1;
+ formulaJson.put(func,i);
+ }else {
+ formulaJson.put(func,1);
+ }
+ }
+ public Integer getValue(String func){
+ return formulaJson.getInteger(func);
+ }
+ public void removeContext(){
+ fmCtx.remove();
+ }
+}
\ No newline at end of file
diff --git a/src/com/engine/salary/formlua/entity/parameter/FuncDescUtil.java b/src/com/engine/salary/formlua/entity/parameter/FuncDescUtil.java
new file mode 100644
index 000000000..d4e5fcee3
--- /dev/null
+++ b/src/com/engine/salary/formlua/entity/parameter/FuncDescUtil.java
@@ -0,0 +1,134 @@
+package com.engine.salary.formlua.entity.parameter;
+
+import com.engine.salary.util.SalaryI18nUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+@Component
+public class FuncDescUtil {
+ protected final Logger logger = LoggerFactory.getLogger(FuncDescUtil.class);
+ Map funcMap = new HashMap();
+
+ public void initData() {
+ //聚合函数
+ funcMap.put("COUNT", SalaryI18nUtil.getI18nLabel(94986, "返回指定表格中满足条件的数据条数。示例:COUNT({员工表})"));
+ funcMap.put("SUM", SalaryI18nUtil.getI18nLabel(94987, "返回指定表格中满足条件的数据,其指定数字字段值的总和。统计条件中不可嵌套使用统计函数。示例:SUM({员工表.工资})"));
+ funcMap.put("AVG", SalaryI18nUtil.getI18nLabel(94988, "返回指定表格中满足条件的数据,其指定数字字段值的平均值。统计条件中不可嵌套使用统计函数。示例:AVG({员工表.工资})"));
+ funcMap.put("MIN", SalaryI18nUtil.getI18nLabel(94989, "返回指定表格中满足条件的数据,其指定数字字段值的最小值。统计条件中不可嵌套使用统计函数。示例:MIN({员工表.工资})"));
+ funcMap.put("MAX", SalaryI18nUtil.getI18nLabel(94990, "返回指定表格中满足条件的数据,其指定数字字段值的最大值。统计条件中不可嵌套使用统计函数。示例:MAX({员工表.工资})"));
+ //日期函数
+ funcMap.put("TODAY", SalaryI18nUtil.getI18nLabel(97678, "返回当天日期。示例:TODAY() 结果: '2020-01-01'"));
+ funcMap.put("NOW", SalaryI18nUtil.getI18nLabel(97689, "返回当天日期+时间。示例:NOW() 结果: '2016-12-24 12:05:38'"));
+ funcMap.put("DATEADD", SalaryI18nUtil.getI18nLabel(97691, "对日期加减按照单位加减。单位默认为日,可选单位:年Y、月M、日D、时H、分I、秒S。示例:
DATEADD('2016-12-21', 3) 结果: '2016-12-24'
DATEADD('2016-12-24 20:00:00', 3, 'H') 结果: '2016-12-24 23:00:00'"));
+ funcMap.put("DATEDIFF", SalaryI18nUtil.getI18nLabel(97692, "根据指定的单位,返回日期2减去日期1的差值。当日期2小于日期1时,差值为负值。单位默认为日,可选单位:年Y、月M、日D、时H、分I、秒S。
示例:
DATEDIF('2016-12-21', '2016-12-24') 结果: 3
DATEDIF('2016-12-24 20:00:00', '2016-12-25 20:00:00', 'H') 结果: 24"));
+ funcMap.put("DATEFORMAT", SalaryI18nUtil.getI18nLabel(97693, "将日期转为指定格式返回。 示例:
DATEFORMAT('2016-12-24', 'YY年MM月DD日') 结果: 2016年12月24日
yyyy 将年份显示为1900-9999
yy 将年份显示为00-99
mm 将月份显示为 01–12
dd 将日期显示为 01–31"));
+ funcMap.put("YEAR", SalaryI18nUtil.getI18nLabel(97694, "返回指定日期中的年。示例:
YEAR('2016-12-24') 结果: 2016"));
+ funcMap.put("MONTH", SalaryI18nUtil.getI18nLabel(97695, "返回指定日期中的月。示例:
MONTH('2016-12-24') 结果: 12"));
+ funcMap.put("DAY", SalaryI18nUtil.getI18nLabel(97696, "返回指定日期中的日。示例:
DAY('2016-12-24') 结果: 24"));
+ funcMap.put("HOUR", SalaryI18nUtil.getI18nLabel(97697, "返回指定日期中的小时。示例:
HOUR('2016-12-24 20:30:56') 结果: 20"));
+ funcMap.put("MINUTE", SalaryI18nUtil.getI18nLabel(97698, "返回指定日期中的分钟。示例:
MINUTE('2016-12-24 20:30:56') 结果: 30"));
+ funcMap.put("SECOND", SalaryI18nUtil.getI18nLabel(97699, "返回指定日期中的秒钟。示例:
SECOND('2016-12-24 20:30:56') 结果: 56"));
+ funcMap.put("WEEKNUM", SalaryI18nUtil.getI18nLabel(97700, "返回指定日期为第几周,从每年第1天开始算第1周。示例:
WEEKNUM('2016-12-24') 结果: 52"));
+ funcMap.put("WEEKDAY", SalaryI18nUtil.getI18nLabel(97701, "返回指定日期为星期几。返回值为0~6,代表周日~周六。示例:
WEEKDAY('2016-12-24') 结果: 6"));
+ funcMap.put("EOMONTH", SalaryI18nUtil.getI18nLabel(97702, "将某月最后一天日期返回。日期可以为指定日期也可以是日期参数,之前的月数用负数表示,之后的月数用正数表示。所输入月数需为整数。
示例:EOMONTH('2021-11-07', -2)
结果:2021-09-30"));
+ funcMap.put("NETWORKDAYSPI", SalaryI18nUtil.getI18nLabel(97703, "将指定日期(仅限的过去时间,最大支持跨度为365天)之间包含的工作日天数返回。注意:此函数只能选择过去的时间才可使用,跨度不能超过365天。当日期2小于日期1时,差值为负值。单位默认为日。
示例:想知道李四在2021-11-07和2021-11-12之间的工作日天数。
NETWORKDAYSPI('2021-11-07', '2021-11-12','李四')
结果:5"));
+ funcMap.put("MAXDATE", SalaryI18nUtil.getI18nLabel(100804, "取一组日期中的最大值。示例:
MAXDATE('2016-12-24', '2022-12-24') 结果: 2022-12-24"));
+ funcMap.put("MINDATE", SalaryI18nUtil.getI18nLabel(100806, "取一组日期中的最小值。示例:
MINDATE('2016-12-24', '2022-12-24') 结果: 2016-12-24"));
+ //日期中的当前时间操作
+ funcMap.put("CURRYEAR", SalaryI18nUtil.getI18nLabel(101066, "取当前日期的年份。示例:
假设当前时间为:2022年2月17日 11:20:30 ,CURRYEAR() 结果: 2022"));
+ funcMap.put("CURRMONTH", SalaryI18nUtil.getI18nLabel(101067, "取当前日期的月份。示例:
假设当前时间为:2022年2月17日 11:20:30 ,CURRMONTH() 结果: 2"));
+ funcMap.put("CURRDAY", SalaryI18nUtil.getI18nLabel(101068, "取当前日期的天。示例:
假设当前时间为:2022年2月17日 11:20:30 ,CURRDAY() 结果: 17"));
+ funcMap.put("CURRWEEK", SalaryI18nUtil.getI18nLabel(101069, "取当前日期是周几。示例:
假设当前时间为:2022年2月17日 11:20:30 ,CURRWEEK() 结果: 4"));
+ funcMap.put("CURRHOUR", SalaryI18nUtil.getI18nLabel(101070, "取当前日期的小时。示例:
假设当前时间为:2022年2月17日 11:20:30 ,CURRHOUR() 结果: 11"));
+ funcMap.put("CURRMINUTE", SalaryI18nUtil.getI18nLabel(101071, "取当前日期的分钟。示例:
假设当前时间为:2022年2月17日 11:20:30 ,CURRMINUTE() 结果: 20"));
+ funcMap.put("CURRSECOND", SalaryI18nUtil.getI18nLabel(101072, "取当前日期的秒钟。示例:
假设当前时间为:2022年2月17日 11:20:30 ,CURRSECOND() 结果: 30"));
+
+ //逻辑函数
+ funcMap.put("IF", SalaryI18nUtil.getI18nLabel(97704, "如果条件为真,则执行表达式1,为假则执行表达式2。条件中不可嵌套使用IF函数。示例:
IF({员工表.年龄} > 60, '退休', '在职')、IF({员工表.年龄} > 60, IF({员工表.性别} = {员工表.性别.女}, '退休', '在职'), '在职')"));
+ funcMap.put("AND", SalaryI18nUtil.getI18nLabel(97705, "所有条件均为真,则返回真,否则返回假。逻辑操作AND的函数模式。示例:
AND(2 = 2, 2 < 2)"));
+ funcMap.put("OR", SalaryI18nUtil.getI18nLabel(97706, "任意一个条件为真,则返回真,否则返回假。逻辑操作OR的函数模式。示例:
OR(2 = 2, 2 > 3)"));
+ funcMap.put("NOT", SalaryI18nUtil.getI18nLabel(97707, "对逻辑结果取反。示例:
NOT(2 > 3)"));
+ funcMap.put("IN", SalaryI18nUtil.getI18nLabel(97708, "任意类型的变量或常量等于一组同类型变量或常量结果中的任意一个,则返回真。示例:
IN(2, [2, 3, 4])"));
+ funcMap.put("LIKE", SalaryI18nUtil.getI18nLabel(97709, "文本类型的变量或常量包含一组文本类型变量或常量结果中的任意一个,则返回真。逻辑操作LIKE的函数模式。示例:
LIKE('大家好', ['大家', '好'])"));
+ funcMap.put("TRUE", SalaryI18nUtil.getI18nLabel(97710, "返回真。示例:TRUE()"));
+ funcMap.put("FALSE", SalaryI18nUtil.getI18nLabel(97712, "返回假。示例:FALSE()"));
+ funcMap.put("IFS", SalaryI18nUtil.getI18nLabel(97713, "多个条件判断,位于单数位置的参数设置为条件,位于双数位置的参数设置为结果,最后一个参数为默认返回值,当所有条件都不满足的时候返回默认参数。示例:IFS(1>1,1,1=1,2,0),结果:2"));
+ funcMap.put("FIND", SalaryI18nUtil.getI18nLabel(97714, "用指定参数去另一个参数列表中查找匹配项,指定参数时,填写1则去第一个参数列表中查找,2则是第二个参数列表里匹配查找第一个参数,成功则返回true,失败返回false。示例:FIND([1,2,3],[1,2,3,4],1),结果:true"));
+
+ //文本函数
+ funcMap.put("CONCAT", SalaryI18nUtil.getI18nLabel(97730, "可用于连接多个任意类型的文本、日期、数字变量或常量。示例:
CONCAT({总价}/10000, '万元')"));
+ funcMap.put("TEXT", SalaryI18nUtil.getI18nLabel(97731, "将变量转为文本。示例:
TEXT({当前数据.性别}) 结果: '男'"));
+ funcMap.put("VALUE", SalaryI18nUtil.getI18nLabel(97732, "将文本转为数字。示例:
VALUE('23') 结果: 23"));
+ funcMap.put("LEN", SalaryI18nUtil.getI18nLabel(97733, "返回文本的长度,中文、英文都算1个字符。示例:
LEN('大家好dajiahao') 结果: 12"));
+ funcMap.put("SEARCH", SalaryI18nUtil.getI18nLabel(97734, "在指定文本中查找关键字,返回第一次出现关键字的字符位置,文本的第一个字记为1。未找到,返回0。搜索开始位置,表示从文本的第几个字符开始搜索,默认为1。示例:
SEARCH('大家', '大家好大家好', 3) 结果: 4"));
+ funcMap.put("REPLACE", SalaryI18nUtil.getI18nLabel(97735, "在原文本中,从替换位置开始,往后数指定的替换字符数,将这段文本替换为新文本。示例:
REPLACE('大家好大家好', 2, 3, 'dajia') 结果: '大dajia家好'"));
+ funcMap.put("REPT", SalaryI18nUtil.getI18nLabel(97736, "将文本重复指定次数。示例:
REPT('大家', 2) 结果: '大家大家'"));
+ funcMap.put("PAD", SalaryI18nUtil.getI18nLabel(97737, "将原文本填充到指定长度,如果文本长度大于设置的长度,则不做任何操作。填充位置可用参数:'LEFT'、'RIGHT'。示例:
PAD('你好', 4, '你', 'LEFT') 结果: '你你你好'"));
+ funcMap.put("TRIM", SalaryI18nUtil.getI18nLabel(97738, "删除文本首尾的空格。示例:
TRIM(' 大家好 ') 结果: '大家好'"));
+ funcMap.put("LEFT", SalaryI18nUtil.getI18nLabel(97739, "从文本左侧开始,返回指定字符数的文字。示例:
LEFT('大家好', 2) 结果: '大家'"));
+ funcMap.put("RIGHT", SalaryI18nUtil.getI18nLabel(97740, "从文本右侧开始,返回指定字符数的文字。示例:
RIGHT('大家好', 2) 结果: '家好'"));
+ funcMap.put("MID", SalaryI18nUtil.getI18nLabel(97741, "从文本指定位置之后开始,返回指定字符数的文字。示例:
MID('大家好', 2, 1) 结果: '家'"));
+ funcMap.put("ISEMPTY", SalaryI18nUtil.getI18nLabel(97742, "变量为空或未填写,则返回真。示例:
ISEMPTY({员工表.电话})"));
+ funcMap.put("IDCARD", SalaryI18nUtil.getI18nLabel(97743, "从身份证号码中获取相关信息,比如:生日(BD)、年龄(AGE)、籍贯(NA)、性别(GENDER)。示例:
IDCARD( ‘43070319980706334X’ , ‘BD’ ) 结果: '1998-07-06'"));
+ funcMap.put("SCORE", SalaryI18nUtil.getI18nLabel(97744, "获取选项型控件(单选框、复选框、下拉菜单)分数。示例:SCORE({当前数据.单选框}) 结果:选项分数
注:未设置选项分数时,结果为0"));
+ funcMap.put("SUBSTRING", SalaryI18nUtil.getI18nLabel(97745, "字符截取函数,用于按起始位置截取字符。
示例:SUBSTRING('abcdefg',2,3)
结果:bc"));
+ funcMap.put("SUBSTITUE", SalaryI18nUtil.getI18nLabel(97746, "字符查找替换函数,替换字符中的所有关键词为新字符。
示例:SUBSTITUE('泛微移动办公','泛微','eteams')
结果:eteams移动办公"));
+ funcMap.put("LOWER", SalaryI18nUtil.getI18nLabel(97747, "将字符中的字母转为小写。
示例:LOWER('abc')
结果:ABC"));
+ funcMap.put("UPPER", SalaryI18nUtil.getI18nLabel(97748, "将字符中的字母转为大写。
示例:LOWER('ABC')
结果:abc"));
+ funcMap.put("EXACT", SalaryI18nUtil.getI18nLabel(97749, "比较两个字符是否相等,区分字母的大小写。
示例:EXACT('泛微Eteams','泛微eteams')
结果:false"));
+ funcMap.put("ISSTRING", SalaryI18nUtil.getI18nLabel(0, "判断是否是字符。
示例:ISSTRING('泛微Eteams')
结果:true"));
+
+ //数学函数
+ funcMap.put("ROUND", SalaryI18nUtil.getI18nLabel(97750, "根据设置的小数位精确度,返回对数值四舍五入后的值。小数位精确度取值可为正整数,0,负整数。如果小数位精确度为正整数,针对小数点后的数据进行四舍五入;如果小数位精确度等于 0,返回最接近数值的整数;如果小数位精确度为负整数,针对小数点前的数据进行四舍五入,被舍掉的数据用0占位。小数位精确度不支持变量。小数位精确度默认为0,即只保留整数。
示例:ROUND(123.456,2),ROUND(123.456,0),ROUND(123.456,-2)
结果:依次为123.46,123,100"));
+ funcMap.put("ROUNDUP", SalaryI18nUtil.getI18nLabel(97751, "根据设置的小数位精确度,返回对数值向上舍入后的值。小数位精确度取值可为正整数,0,负整数。如果小数位精确度为正整数,则向上舍入到指定的小数位。如果小数位精确度等于 0,则向上舍入到最接近的整数。如果小数位精确度为负整数,则在小数点左侧向上进行舍入。小数位精确度不支持变量。小数位精确度默认为0,即只保留整数。示例:ROUNDDOWN(76.9,0)结果:77"));
+ funcMap.put("ROUNDDOWN", SalaryI18nUtil.getI18nLabel(97752, "根据设置的小数位精确度,返回对数值向下舍入后的值。小数位精确度取值可为正整数,0,负整数。如果小数位精确度为正整数,则向下舍入到指定的小数位。如果小数位精确度等于 0,则向下舍入到最接近的整数。如果小数位精确度为负整数,则在小数点左侧向下进行舍入。小数位精确度不支持变量。小数位精确度默认为0,即只保留整数。
示例:ROUNDDOWN(76.9,0)
结果:76"));
+ funcMap.put("AGGREGATION", SalaryI18nUtil.getI18nLabel(97753, "将一组数据进行统计计算,支持最大值(MAX)、最小值(MIN)、平均值(AVG)。示例:AGGREGATION(1 , 2,3,'AVG'),结果:2"));
+ funcMap.put("MOD", SalaryI18nUtil.getI18nLabel(97754, "将两个参数进行除法运算然后得出余数返回。示例:MOD( 7 , 3 ),结果:1"));
+ funcMap.put("TRUNC", SalaryI18nUtil.getI18nLabel(97755, "将小数点格式化成指定位数。示例:TRUNC( 2.123 , 2 ),结果:2.12"));
+ funcMap.put("ISINT", SalaryI18nUtil.getI18nLabel(0, "判断字符内容是否是整数。示例:ISINT( 2.123 ),结果:false"));
+ funcMap.put("ISNUMBER", SalaryI18nUtil.getI18nLabel(0, "判断字符内容是否是数字。示例:ISNUMBER('2.123'),结果:true"));
+
+ //查找函数
+ funcMap.put("CHOOSE", SalaryI18nUtil.getI18nLabel(97756, "根据条件获取指定数据源中的全部数据。数据源支持选表单、表单中的字段。
示例:想知道税表中,收入大于15000的数值
CHOOSE({税表}, {税表.收入}>15000)
结果:返回税表中收入大于15000的集合"));
+ funcMap.put("MATCH", SalaryI18nUtil.getI18nLabel(97757, "将指定数值在指定数组区域中的位置返回。若数组中无指定值,返回null。
示例:MATCH(15000, [1000, 15000, 2000])
结果:1"));
+ funcMap.put("VLOOKUPS", SalaryI18nUtil.getI18nLabel(97758, "按列查找,返回所需值。常用于薪酬模块。根据条件获取查询参数所在列的返回参数的值。返回参数可填写多个,用英文逗号隔开。若查询不到返回null。
示例:VLOOKUPS({税表},{税表.收入},AND({税表.收入}>{税表.应纳税所得额下限},{税表.收入}<{税表.应纳税所得额上限}),[{税表.税率},{税表.速算扣除数}])
结果:按列查找返回税表中收入所在的收入区间所对应的税率和速算扣除数的数值"));
+
+ //数据库函数
+ funcMap.put("GETHRMLOGINID", SalaryI18nUtil.getI18nLabel(100808, "获取指定人员系统账号。
示例:GETHRMLOGINID({表单.张三})
结果:zhangsan@qq.com"));
+ funcMap.put("GETHRMWORKCODE", SalaryI18nUtil.getI18nLabel(100810, "获取指定人员编号。
示例:GETHRMWORKCODE({表单.张三})
结果:A001"));
+ funcMap.put("GETHRMMANAGER", SalaryI18nUtil.getI18nLabel(100812, "获取指定人员直接上级。
示例:GETHRMMANAGER({表单.张三})
结果:返回张三的直接上级"));
+ funcMap.put("GETHRMALLMANAGER", SalaryI18nUtil.getI18nLabel(100814, "获取指定人员所有上级。
示例:GETHRMMANAGER({表单.张三})
结果:返回张三的所有上级形成的数组"));
+ funcMap.put("GETHRMDEPARTMENT", SalaryI18nUtil.getI18nLabel(100816, "获取指定人员部门。
示例:GETHRMDEPARTMENT({表单.张三})
结果:返回张三的部门"));
+ funcMap.put("GETHRMSUBCOMPANY", SalaryI18nUtil.getI18nLabel(100818, "获取指定人员分部。
示例:GETHRMSUBCOMPANY({表单.张三})
结果:返回张三的分部"));
+ funcMap.put("GETDEPARTMENTNAME", SalaryI18nUtil.getI18nLabel(100820, "获取指定部门名称。
示例:GETDEPARTMENTNAME({表单.A部门})
结果:A部门"));
+ funcMap.put("GETDEPARTMENTCODE", SalaryI18nUtil.getI18nLabel(100822, "获取指定部门编号。
示例:GETDEPARTMENTCODE({表单.A部门})
结果:A001"));
+ funcMap.put("GETSUPERDEPARTMENT", SalaryI18nUtil.getI18nLabel(100824, "获取指定部门直接上级部门。
示例:GETDEPARTMENTCODE({表单.A部门})
结果:A部门的直接上级部门"));
+ funcMap.put("GETALLSUPERDEPARTMENT", SalaryI18nUtil.getI18nLabel(100826, "获取指定部门所有上级部门。
示例:GETALLSUPERDEPARTMENT({表单.A部门})
结果:A部门的所有上级部门形成的数组"));
+ funcMap.put("GETSUBCOMPANYNAME", SalaryI18nUtil.getI18nLabel(100828, "获取指定分部名称。
示例:GETSUBCOMPANYNAME({表单.A分部})
结果:A分部"));
+ funcMap.put("GETSUBCOMPANYCODE", SalaryI18nUtil.getI18nLabel(100830, "获取指定分部编号。
示例:GETSUBCOMPANYCODE({表单.A分部})
结果:B001"));
+ funcMap.put("GETSUPERSUBCOMPANY", SalaryI18nUtil.getI18nLabel(100832, "获取指定分部直接上级分部。
示例:GETSUPERSUBCOMPANY({表单.A分部})
结果:A分部的直接上级分部"));
+ funcMap.put("GETALLSUPERSUBCOMPANY", SalaryI18nUtil.getI18nLabel(100834, "获取指定分部所有上级分部。
示例:GETALLSUPERSUBCOMPANY({表单.A分部})
结果:A分部的所有上级分部形成的数组"));
+ funcMap.put("GETHRMNAME", SalaryI18nUtil.getI18nLabel(100834, "获取指定人员的姓名。
示例:GETHRMNAME({U:张三})
结果:张三"));
+ funcMap.put("GETHRMMOBILE", SalaryI18nUtil.getI18nLabel(100834, "获取指定人员的手机号码。
示例:GETHRMMOBILE({U:张三})
结果:13123232323"));
+
+ //财务函数
+ funcMap.put("GETMONEY", SalaryI18nUtil.getI18nLabel(0, "将金额转换成中文金额大写。
示例:GETMONEY({1234})
结果:壹仟贰佰叁拾肆元整"));
+
+ }
+
+ public String get(String key) {
+ if (funcMap.size() > 0) {
+// logger.info("描述数据存在:"+funcMap.size());
+ } else {
+ logger.info("初始化函数描述数据");
+ initData();
+ }
+
+ return funcMap.get(key);
+ }
+}
diff --git a/src/com/engine/salary/formlua/entity/parameter/FuncNames.java b/src/com/engine/salary/formlua/entity/parameter/FuncNames.java
new file mode 100644
index 000000000..b70235490
--- /dev/null
+++ b/src/com/engine/salary/formlua/entity/parameter/FuncNames.java
@@ -0,0 +1,20 @@
+package com.engine.salary.formlua.entity.parameter;
+
+
+public enum FuncNames {
+ AND("and"), OR("or"), IF("ifF"), LIKE("likeFunc"), DATEDIFF("dateDiff"), DATEADD("dateAdd"), NOW("now"), DATEFORMAT("dateFormat"), COUNT("counts"), SUM("sumNumber"), MAX("maxNumber"), MIN("minNumber"), CONCAT("concatString"), SEARCH("search"), TEXT("text"), PAD("pad"), REPLACE("replace"), VALUE("value"), LEN("len"), LEFT("left"), RIGHT("right"), MID("mid"), TRUE("isTrue"), FALSE("isFalse"), NOT("not"), ISEMPTY("isEmpty"), TODAY("today"), IFS("ifs"), AGGREGATION("aggregation"), MOD("mod"), FIND("find"), SWITCH("switchs"), TRUNC("Trunc"), IDCARD("idCard"),
+ RANDOMNUMBER("randomNumber"), ROUNDUP("roundUp"), ROUNDDOWN("roundDown"), ROUND("round"), ADDRESS("addressAnalysis"), EOMONTH("eoMonth"), NETWORKDAYSPI("networkdaysPastIntl"),
+ CHOOSE("choose"), MATCH("match"), VLOOKUPS("vlookups"), GETHRMLOGINID("getHrmLoginId"), GETHRMWORKCODE("getHrmWorkcode"), GETHRMMANAGER("getHrmManager"), GETHRMALLMANAGER("getHrmAllManager"),
+ GETHRMDEPARTMENT("getHrmDepartment"), GETHRMSUBCOMPANY("getHrmSubcompany"), GETDEPARTMENTNAME("getDepartmentName"), GETDEPARTMENTCODE("getDepartmentCode"), GETSUPERDEPARTMENT("getSuperDepartment"),
+ GETALLSUPERDEPARTMENT("getAllSuperDepartment"), GETSUBCOMPANYNAME("getSubcompanyName"), GETSUBCOMPANYCODE("getSubcompanyCode"), GETSUPERSUBCOMPANY("getSuperSubcompany"), GETALLSUPERSUBCOMPANY("getAllSuperSubcompany"),
+ ISINT("isInt"), ISNUMBER("isNumber"), ISSTRING("isString"), GETMONEY("getMoney"), GETHRMNAME("getHrmName"), GETHRMMOBILE("getHrmMobile");
+ String name;
+
+ FuncNames(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+}
diff --git a/src/com/engine/salary/formlua/entity/parameter/IllegalList.java b/src/com/engine/salary/formlua/entity/parameter/IllegalList.java
new file mode 100644
index 000000000..5ed75febf
--- /dev/null
+++ b/src/com/engine/salary/formlua/entity/parameter/IllegalList.java
@@ -0,0 +1,19 @@
+package com.engine.salary.formlua.entity.parameter;
+
+
+
+public class IllegalList {
+ private final String[] operArray=new String[]{"<",">","+","-","*","/","{","}","[","]","(",")","=","!=","'","\"","!",".",">=","<="};
+ private final String[] nameIllegalArray=new String[]{"<",">","+","-","*","/","{","}","[","]","(",")","=","!=","'","\"","!",".",
+ "LIKE","like",">=","<=","IN","IF","AND","OR","TRUE","FALSE","NOW","DATEDIFF","DATEADD","Y","M","D","H","I","S","WEEKNUM",
+ "WEEKDAY","TODAY","DATEFORMAT","COUNT","SUM","MAX","MIN","CONCAT","SEARCH","TEXT","PAD","REPLACE","VALUE","LEN","LEFT","RIGHT","MID"};
+ private IllegalList(){}
+ private static IllegalList illegalList=new IllegalList();
+ public static IllegalList getInstance(){return illegalList;}
+ public String[] getNameIllegalArray() {
+ return nameIllegalArray;
+ }
+ public String[] getOperArray() {
+ return operArray;
+ }
+}
diff --git a/src/com/engine/salary/formlua/entity/parameter/ParamContext.java b/src/com/engine/salary/formlua/entity/parameter/ParamContext.java
new file mode 100644
index 000000000..afc1b65e5
--- /dev/null
+++ b/src/com/engine/salary/formlua/entity/parameter/ParamContext.java
@@ -0,0 +1,30 @@
+package com.engine.salary.formlua.entity.parameter;
+
+import com.alibaba.fastjson.JSONObject;
+
+/**
+ * @className:
+ * @Description:本地线程存储的Excel函数变量context,线程结束后会清空释放当前线程的变量context
+ * @Author:
+ * @date:
+ */
+public class ParamContext {
+ public static ThreadLocal fmCtx=new ThreadLocal();
+ private JSONObject jsonObject=new JSONObject();
+
+ public static ParamContext get(){
+ if(null==fmCtx.get()){
+ fmCtx.set(new ParamContext());
+ }
+ return fmCtx.get();
+ }
+ public void setValue(String func,Object value){
+ jsonObject.put(func,value);
+ }
+ public Object getValue(String func){
+ return jsonObject.get(func);
+ }
+ public void removeContext(){
+ fmCtx.remove();
+ }
+}
diff --git a/src/com/engine/salary/formlua/entity/parameter/ParamFactory.java b/src/com/engine/salary/formlua/entity/parameter/ParamFactory.java
new file mode 100644
index 000000000..b0cbab51e
--- /dev/null
+++ b/src/com/engine/salary/formlua/entity/parameter/ParamFactory.java
@@ -0,0 +1,127 @@
+package com.engine.salary.formlua.entity.parameter;
+
+/**
+ * @className:默认本地参数
+ * @Description:注释
+ * @Author:
+ * @date:
+ */
+public class ParamFactory {
+ private String charValue;
+ private Double doubleValue;
+ private Integer integerValue;
+ private Long longValue;
+ private Float floatValue;
+ private Boolean boolValue;
+ private String dateTimeValue;
+ private String selectValue;
+ private String timeValue;
+ private String textValue;
+ private ParamFactory(){}
+
+ private ParamFactory(String charValue, Double doubleValue, Integer integerValue, Long longValue, Float floatValue, Boolean boolValue,String dateTimeValue,String selectValue,String timeValue,String textValue) {
+ this.charValue = charValue;
+ this.doubleValue = doubleValue;
+ this.integerValue = integerValue;
+ this.longValue = longValue;
+ this.floatValue = floatValue;
+ this.boolValue = boolValue;
+ this.dateTimeValue=dateTimeValue;
+ this.selectValue=selectValue;
+ this.timeValue=timeValue;
+ this.textValue=textValue;
+ }
+
+ private static ParamFactory paramFactory=new ParamFactory("2020-01-12 12:23:33",5.2,2020,100L,new Float(20.4),true,"2020-01-12 12:23:33","8428149709910469289","12:12:30","abcd");
+ public static ParamFactory getInstance(){
+ return paramFactory;
+ }
+
+ public String getTimeValue() {
+ return timeValue;
+ }
+
+ public void setTimeValue(String timeValue) {
+ this.timeValue = timeValue;
+ }
+
+ public String getSelectValue() {
+ return selectValue;
+ }
+
+ public void setSelectValue(String selectValue) {
+ this.selectValue = selectValue;
+ }
+
+ public String getCharValue() {
+ return charValue;
+ }
+
+ public void setCharValue(String charValue) {
+ this.charValue = charValue;
+ }
+
+ public Double getDoubleValue() {
+ return doubleValue;
+ }
+
+ public String getDateTimeValue() {
+ return dateTimeValue;
+ }
+
+ public void setDateTimeValue(String dateTimeValue) {
+ this.dateTimeValue = dateTimeValue;
+ }
+
+ public void setDoubleValue(Double doubleValue) {
+ this.doubleValue = doubleValue;
+ }
+
+ public Integer getIntegerValue() {
+ return integerValue;
+ }
+
+ public void setIntegerValue(Integer integerValue) {
+ this.integerValue = integerValue;
+ }
+
+ public Long getLongValue() {
+ return longValue;
+ }
+
+ public void setLongValue(Long longValue) {
+ this.longValue = longValue;
+ }
+
+ public Float getFloatValue() {
+ return floatValue;
+ }
+
+ public void setFloatValue(Float floatValue) {
+ this.floatValue = floatValue;
+ }
+
+ public Boolean getBoolValue() {
+ return boolValue;
+ }
+
+ public void setBoolValue(Boolean boolValue) {
+ this.boolValue = boolValue;
+ }
+
+ public static ParamFactory getParamFactory() {
+ return paramFactory;
+ }
+
+ public static void setParamFactory(ParamFactory paramFactory) {
+ ParamFactory.paramFactory = paramFactory;
+ }
+
+ public String getTextValue() {
+ return textValue;
+ }
+
+ public void setTextValue(String textValue) {
+ this.textValue = textValue;
+ }
+}
diff --git a/src/com/engine/salary/formlua/entity/parameter/ParamType.java b/src/com/engine/salary/formlua/entity/parameter/ParamType.java
new file mode 100644
index 000000000..f11a1ceca
--- /dev/null
+++ b/src/com/engine/salary/formlua/entity/parameter/ParamType.java
@@ -0,0 +1,15 @@
+package com.engine.salary.formlua.entity.parameter;
+
+
+public enum ParamType {
+ STRING("String"),INTEGER("Integer"),DOUBLE("Double"),LONG("Long"),SHORT("Short"),JSONOBJECT("JSONObject"),FLOAT("Float"),BOOLEAN("Boolean");
+ String name;
+ ParamType(String name) {
+ this.name=name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+}
diff --git a/src/com/engine/salary/formlua/entity/parameter/ReturnType.java b/src/com/engine/salary/formlua/entity/parameter/ReturnType.java
new file mode 100644
index 000000000..601a097cb
--- /dev/null
+++ b/src/com/engine/salary/formlua/entity/parameter/ReturnType.java
@@ -0,0 +1,13 @@
+package com.engine.salary.formlua.entity.parameter;
+
+
+public class ReturnType {
+ public final static int BOOLEAN_VALUE=0;
+ public final static int NUMBER_VALUE=1;
+ public final static int STRING_VALUE=2;
+ public final static String[] NUMBER_TYPE=new String[]{"NumberComponent","Money","Raty","score","Monitor"};
+ public final static String[] DATETIME_TYPE=new String[]{"DateComponent","DateInterval"};
+ public final static String[] CHECK_TYPE=new String[]{"RadioBox","CheckBox","Select","ComboSelect"};
+ public final static String[] DROPDOWN_LIST=new String[]{"Select","ComboSelect"};
+ public final static String[]CHECKBOX_LIST=new String[]{"RadioBox","CheckBox"};
+}
diff --git a/src/com/engine/salary/formlua/entity/parameter/ThreadLocalData.java b/src/com/engine/salary/formlua/entity/parameter/ThreadLocalData.java
new file mode 100644
index 000000000..7e9c14289
--- /dev/null
+++ b/src/com/engine/salary/formlua/entity/parameter/ThreadLocalData.java
@@ -0,0 +1,59 @@
+package com.engine.salary.formlua.entity.parameter;
+
+import com.engine.salary.entity.datacollection.DataCollectionEmployee;
+import org.mozilla.javascript.commonjs.module.provider.ModuleSource;
+
+import java.util.Iterator;
+import java.util.Map;
+
+
+public class ThreadLocalData {
+ private Map expressContext;
+ private ModuleSource moduleSource;
+
+ private DataCollectionEmployee employee;
+
+ public ModuleSource getModuleSource() {
+ return moduleSource;
+ }
+
+ public void setModuleSource(ModuleSource moduleSource) {
+ this.moduleSource = moduleSource;
+ }
+
+ public DataCollectionEmployee getEmployee() {
+ return employee;
+ }
+
+ public void setEmployee(DataCollectionEmployee employee) {
+ this.employee = employee;
+ }
+
+ public Map getExpressContext() {
+ return expressContext;
+ }
+
+ public void setExpressContext(Map expressContext) {
+ transMap(expressContext);
+ this.expressContext = expressContext;
+ }
+
+ private void transMap(Map expressContext){
+ Iterator iterator=expressContext.keySet().iterator();
+ while (iterator.hasNext()){
+ String key=iterator.next();
+ Object obj=expressContext.get(key);
+ if(obj instanceof DataType){
+ DataType dataType=(DataType)obj;
+ if(dataType.getFieldId()!=null){
+ int idx=key.indexOf(dataType.getFieldId().toString());
+ if(idx>=0){
+ String localKey=key.substring(0,idx+dataType.getFieldId().toString().length());
+ dataType.setAggCndKey(localKey);
+ }
+ }
+
+ }
+ }
+ }
+}
diff --git a/src/com/engine/salary/formlua/entity/standard/AggFunc.java b/src/com/engine/salary/formlua/entity/standard/AggFunc.java
new file mode 100644
index 000000000..34215605c
--- /dev/null
+++ b/src/com/engine/salary/formlua/entity/standard/AggFunc.java
@@ -0,0 +1,8 @@
+package com.engine.salary.formlua.entity.standard;
+
+public enum AggFunc {
+ count("计数"),avg("平均数"),min("最小数"),max("最大数"),sum("合计数");
+
+ AggFunc(String name) {
+ }
+}
diff --git a/src/com/engine/salary/formlua/entity/standard/ExcelModuleFixField.java b/src/com/engine/salary/formlua/entity/standard/ExcelModuleFixField.java
new file mode 100644
index 000000000..92e05d744
--- /dev/null
+++ b/src/com/engine/salary/formlua/entity/standard/ExcelModuleFixField.java
@@ -0,0 +1,34 @@
+package com.engine.salary.formlua.entity.standard;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class ExcelModuleFixField {
+ /**
+ * 审批发起人
+ */
+ public static String FLOW_CREATOR="creator";
+ /**
+ * 审批请求ID
+ */
+ public static String FLOW_REQUEST_ID="requestid";
+ /**
+ * 审批发起人所属部门
+ */
+ public static String FLOW_CREATOR_DEPT="creator_depart";
+ /**
+ * 上报收集人
+ */
+ public static String REPORT_CREATOR="creator";
+ /**
+ * 上报名称
+ */
+ public static String REPORT_NAME="name";
+ /**
+ * 上报提交人
+ */
+ public static String REPORT_REPORTER="reporter";
+
+ public static List ALLFIXFIELD = new ArrayList<>(Arrays.asList(FLOW_CREATOR,FLOW_CREATOR_DEPT,FLOW_REQUEST_ID,REPORT_CREATOR,REPORT_NAME,REPORT_REPORTER));
+}
diff --git a/src/com/engine/salary/formlua/entity/standard/ExcelPage.java b/src/com/engine/salary/formlua/entity/standard/ExcelPage.java
new file mode 100644
index 000000000..dddf2300c
--- /dev/null
+++ b/src/com/engine/salary/formlua/entity/standard/ExcelPage.java
@@ -0,0 +1,56 @@
+package com.engine.salary.formlua.entity.standard;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author
+ */
+public class ExcelPage implements Serializable {
+ private static final long serialVersionUID = -3149769813337109956L;
+ private int pageNo;
+ private int pageSize;
+ private int count;
+ private String keywords;
+ private List pageResult;
+
+ public String getKeywords() {
+ return keywords;
+ }
+
+ public void setKeywords(String keywords) {
+ this.keywords = keywords;
+ }
+
+ public int getCount() {
+ return count;
+ }
+
+ public void setCount(int count) {
+ this.count = count;
+ }
+
+ public int getPageNo() {
+ return pageNo;
+ }
+
+ public void setPageNo(int pageNo) {
+ this.pageNo = pageNo;
+ }
+
+ public int getPageSize() {
+ return pageSize;
+ }
+
+ public void setPageSize(int pageSize) {
+ this.pageSize = pageSize;
+ }
+
+ public List getPageResult() {
+ return pageResult;
+ }
+
+ public void setPageResult(List pageResult) {
+ this.pageResult = pageResult;
+ }
+}
diff --git a/src/com/engine/salary/formlua/entity/standard/ExcelResult.java b/src/com/engine/salary/formlua/entity/standard/ExcelResult.java
new file mode 100644
index 000000000..f504acc33
--- /dev/null
+++ b/src/com/engine/salary/formlua/entity/standard/ExcelResult.java
@@ -0,0 +1,87 @@
+package com.engine.salary.formlua.entity.standard;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author roy
+ */
+public class ExcelResult implements Serializable {
+ private static final long serialVersionUID = 4578033427466119428L;
+ /**
+ * 文本、数字、日期从这里取值
+ */
+ private Object data;
+ /**
+ * 布尔值从这里取值
+ */
+ private boolean boolData;
+ private String stringData;
+ private BigDecimal numberData;
+ /**
+ * 执行状态,true为执行成功,false为执行失败
+ */
+ private boolean status;
+ private String errorMsg;
+ private String formulaId;
+
+ public String getFormulaId() {
+ return formulaId;
+ }
+
+ public void setFormulaId(String formulaId) {
+ this.formulaId = formulaId;
+ }
+
+ public boolean isBoolData() {
+ return boolData;
+ }
+
+ public String getStringData() {
+ return stringData;
+ }
+
+ public void setStringData(String stringData) {
+ this.stringData = stringData;
+ }
+
+ public BigDecimal getNumberData() {
+ return numberData;
+ }
+
+ public void setNumberData(BigDecimal numberData) {
+ this.numberData = numberData;
+ }
+
+ public String getErrorMsg() {
+ return errorMsg;
+ }
+
+ public void setErrorMsg(String errorMsg) {
+ this.errorMsg = errorMsg;
+ }
+
+ public boolean getBoolData() {
+ return boolData;
+ }
+
+ public void setBoolData(boolean boolData) {
+ this.boolData = boolData;
+ }
+
+ public Object getData() {
+ return data;
+ }
+
+ public void setData(Object data) {
+ this.data = data;
+ }
+
+ public boolean isStatus() {
+ return status;
+ }
+
+ public void setStatus(boolean status) {
+ this.status = status;
+ }
+}
diff --git a/src/com/engine/salary/formlua/entity/standard/FormulaCategory.java b/src/com/engine/salary/formlua/entity/standard/FormulaCategory.java
new file mode 100644
index 000000000..fbc482888
--- /dev/null
+++ b/src/com/engine/salary/formlua/entity/standard/FormulaCategory.java
@@ -0,0 +1,58 @@
+package com.engine.salary.formlua.entity.standard;
+
+import java.io.Serializable;
+
+/**
+ * @author roy
+ */
+public class FormulaCategory implements Serializable {
+ private static final long serialVersionUID = 376155360889274784L;
+ /**
+ * 分类ID
+ */
+ private String id;
+ /**
+ * 分类名称
+ */
+ private String name;
+ /**
+ * 所属模块
+ */
+ private String module;
+ /**
+ * 类别,和module保持一致即可,为兼容老数据的保留字段
+ */
+ private String type;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getModule() {
+ return module;
+ }
+
+ public void setModule(String module) {
+ this.module = module;
+ }
+}
diff --git a/src/com/engine/salary/formlua/entity/standard/FormulaDataSource.java b/src/com/engine/salary/formlua/entity/standard/FormulaDataSource.java
new file mode 100644
index 000000000..83bdbcf52
--- /dev/null
+++ b/src/com/engine/salary/formlua/entity/standard/FormulaDataSource.java
@@ -0,0 +1,37 @@
+package com.engine.salary.formlua.entity.standard;
+
+import java.io.Serializable;
+
+/**
+ * @author roy
+ */
+public class FormulaDataSource implements Serializable {
+ private static final long serialVersionUID = 8657467498740290598L;
+ private String dataId;
+ private String title;
+ private String module;
+
+ public String getDataId() {
+ return dataId;
+ }
+
+ public void setDataId(String dataId) {
+ this.dataId = dataId;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getModule() {
+ return module;
+ }
+
+ public void setModule(String module) {
+ this.module = module;
+ }
+}
diff --git a/src/com/engine/salary/formlua/entity/standard/FormulaFilterData.java b/src/com/engine/salary/formlua/entity/standard/FormulaFilterData.java
new file mode 100644
index 000000000..a27498278
--- /dev/null
+++ b/src/com/engine/salary/formlua/entity/standard/FormulaFilterData.java
@@ -0,0 +1,299 @@
+package com.engine.salary.formlua.entity.standard;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author roy
+ */
+public class FormulaFilterData implements Serializable {
+ public static final String CONDITION_AND = "and";
+ public static final String CONDITION_OR = "or";
+ public static final String TERM_EQ = "eq";
+ public static final String TERM_NOT_EQ = "neq";
+ public static final String TERM_NULL = "null";
+ public static final String TERM_NOT_NULL = "notnull";
+ public static final String TERM_LIKE = "like";
+ public static final String TERM_GT = "gt";
+ public static final String TERM_GE = "ge";
+ public static final String TERM_LE = "le";
+ public static final String TERM_LT = "lt";
+ public static final String TERM_BEQ = "beq";
+ public static final String TERM_SEQ = "seq";
+ public static final String SOURCE_TYPE_CONSTANT = "constant";
+ public static final String SOURCE_TYPE_VARIABLE = "variable";
+ private static final long serialVersionUID = 2902385161856666369L;
+ /**
+ * 字段ID
+ */
+ private String fieldId;
+ /**
+ * 明细子表ID
+ */
+ private String subFormId;
+ /**
+ * 控件名称
+ */
+ private String componentKey;
+ /**
+ * 操作符,具体符号在上面的静态变量中
+ */
+ private String term;
+ private String tremStr;
+ /**
+ * 条件的值
+ */
+ private String content;
+ /**
+ * 范围条件的截止范围
+ */
+ private String endContent;
+ /**
+ * 选项条件的值
+ */
+ private List ids;
+// private List children;
+ private List contents;
+ private List