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;



public class FuncDescUtil {
    protected final Logger logger = LoggerFactory.getLogger(FuncDescUtil.class);
    Map<String, String> 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。示例：<br> DATEADD('2016-12-21', 3) 结果： '2016-12-24' <br> 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。<br> 示例：<br> DATEDIF('2016-12-21', '2016-12-24') 结果： 3 <br> DATEDIF('2016-12-24 20:00:00', '2016-12-25 20:00:00', 'H') 结果： 24"));
        funcMap.put("DATEFORMAT", SalaryI18nUtil.getI18nLabel(97693, "将日期转为指定格式返回。 示例：<br> DATEFORMAT('2016-12-24', 'YY年MM月DD日') 结果： 2016年12月24日 <br> yyyy 将年份显示为1900-9999 <br> yy 将年份显示为00-99 <br> mm 将月份显示为 01–12 <br> dd 将日期显示为 01–31"));
        funcMap.put("YEAR", SalaryI18nUtil.getI18nLabel(97694, "返回指定日期中的年。示例：<br> YEAR('2016-12-24') 结果： 2016"));
        funcMap.put("MONTH", SalaryI18nUtil.getI18nLabel(97695, "返回指定日期中的月。示例：<br> MONTH('2016-12-24') 结果： 12"));
        funcMap.put("DAY", SalaryI18nUtil.getI18nLabel(97696, "返回指定日期中的日。示例：<br> DAY('2016-12-24') 结果： 24"));
        funcMap.put("HOUR", SalaryI18nUtil.getI18nLabel(97697, "返回指定日期中的小时。示例：<br> HOUR('2016-12-24 20:30:56') 结果： 20"));
        funcMap.put("MINUTE", SalaryI18nUtil.getI18nLabel(97698, "返回指定日期中的分钟。示例：<br> MINUTE('2016-12-24 20:30:56') 结果： 30"));
        funcMap.put("SECOND", SalaryI18nUtil.getI18nLabel(97699, "返回指定日期中的秒钟。示例：<br> SECOND('2016-12-24 20:30:56') 结果： 56"));
        funcMap.put("WEEKNUM", SalaryI18nUtil.getI18nLabel(97700, "返回指定日期为第几周，从每年第1天开始算第1周。示例：<br> WEEKNUM('2016-12-24') 结果： 52"));
        funcMap.put("WEEKDAY", SalaryI18nUtil.getI18nLabel(97701, "返回指定日期为星期几。返回值为0~6，代表周日~周六。示例：<br> WEEKDAY('2016-12-24') 结果： 6"));
        funcMap.put("EOMONTH", SalaryI18nUtil.getI18nLabel(97702, "将某月最后一天日期返回。日期可以为指定日期也可以是日期参数，之前的月数用负数表示，之后的月数用正数表示。所输入月数需为整数。<br>示例：EOMONTH('2021-11-07', -2)<br>结果：2021-09-30"));
        funcMap.put("NETWORKDAYSPI", SalaryI18nUtil.getI18nLabel(97703, "将指定日期（仅限的过去时间，最大支持跨度为365天）之间包含的工作日天数返回。注意:此函数只能选择过去的时间才可使用，跨度不能超过365天。当日期2小于日期1时，差值为负值。单位默认为日。<br>示例：想知道李四在2021-11-07和2021-11-12之间的工作日天数。<br>NETWORKDAYSPI('2021-11-07', '2021-11-12'，'李四') <br>结果：5"));
        funcMap.put("MAXDATE", SalaryI18nUtil.getI18nLabel(100804, "取一组日期中的最大值。示例：<br/> MAXDATE('2016-12-24', '2022-12-24') 结果： 2022-12-24"));
        funcMap.put("MINDATE", SalaryI18nUtil.getI18nLabel(100806, "取一组日期中的最小值。示例：<br/> MINDATE('2016-12-24', '2022-12-24') 结果： 2016-12-24"));
        //日期中的当前时间操作
        funcMap.put("CURRYEAR", SalaryI18nUtil.getI18nLabel(101066, "取当前日期的年份。示例：<br/> 假设当前时间为：2022年2月17日 11:20:30 ，CURRYEAR() 结果： 2022"));
        funcMap.put("CURRMONTH", SalaryI18nUtil.getI18nLabel(101067, "取当前日期的月份。示例：<br/> 假设当前时间为：2022年2月17日 11:20:30 ，CURRMONTH() 结果： 2"));
        funcMap.put("CURRDAY", SalaryI18nUtil.getI18nLabel(101068, "取当前日期的天。示例：<br/> 假设当前时间为：2022年2月17日 11:20:30 ，CURRDAY() 结果： 17"));
        funcMap.put("CURRWEEK", SalaryI18nUtil.getI18nLabel(101069, "取当前日期是周几。示例：<br/> 假设当前时间为：2022年2月17日 11:20:30 ，CURRWEEK() 结果： 4"));
        funcMap.put("CURRHOUR", SalaryI18nUtil.getI18nLabel(101070, "取当前日期的小时。示例：<br/> 假设当前时间为：2022年2月17日 11:20:30 ，CURRHOUR() 结果： 11"));
        funcMap.put("CURRMINUTE", SalaryI18nUtil.getI18nLabel(101071, "取当前日期的分钟。示例：<br/> 假设当前时间为：2022年2月17日 11:20:30 ，CURRMINUTE() 结果： 20"));
        funcMap.put("CURRSECOND", SalaryI18nUtil.getI18nLabel(101072, "取当前日期的秒钟。示例：<br/> 假设当前时间为：2022年2月17日 11:20:30 ，CURRSECOND() 结果： 30"));

        //逻辑函数
        funcMap.put("IF", SalaryI18nUtil.getI18nLabel(97704, "如果条件为真，则执行表达式1，为假则执行表达式2。条件中不可嵌套使用IF函数。示例：<br> IF({员工表.年龄} > 60, '退休', '在职')、IF({员工表.年龄} > 60, IF({员工表.性别} = {员工表.性别.女}, '退休', '在职'), '在职')"));
        funcMap.put("AND", SalaryI18nUtil.getI18nLabel(97705, "所有条件均为真，则返回真，否则返回假。逻辑操作AND的函数模式。示例：<br> AND(2 = 2, 2 < 2)"));
        funcMap.put("OR", SalaryI18nUtil.getI18nLabel(97706, "任意一个条件为真，则返回真，否则返回假。逻辑操作OR的函数模式。示例：<br> OR(2 = 2, 2 > 3)"));
        funcMap.put("NOT", SalaryI18nUtil.getI18nLabel(97707, "对逻辑结果取反。示例：<br> NOT(2 > 3)"));
        funcMap.put("IN", SalaryI18nUtil.getI18nLabel(97708, "任意类型的变量或常量等于一组同类型变量或常量结果中的任意一个，则返回真。示例：<br> IN(2, [2, 3, 4])"));
        funcMap.put("LIKE", SalaryI18nUtil.getI18nLabel(97709, "文本类型的变量或常量包含一组文本类型变量或常量结果中的任意一个，则返回真。逻辑操作LIKE的函数模式。示例：<br> 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, "可用于连接多个任意类型的文本、日期、数字变量或常量。示例：<br> CONCAT({总价}/10000, '万元')"));
        funcMap.put("TEXT", SalaryI18nUtil.getI18nLabel(97731, "将变量转为文本。示例：<br> TEXT({当前数据.性别}) 结果： '男'"));
        funcMap.put("VALUE", SalaryI18nUtil.getI18nLabel(97732, "将文本转为数字。示例：<br> VALUE('23') 结果： 23"));
        funcMap.put("LEN", SalaryI18nUtil.getI18nLabel(97733, "返回文本的长度，中文、英文都算1个字符。示例：<br> LEN('大家好dajiahao') 结果： 12"));
        funcMap.put("SEARCH", SalaryI18nUtil.getI18nLabel(97734, "在指定文本中查找关键字，返回第一次出现关键字的字符位置，文本的第一个字记为1。未找到，返回0。搜索开始位置，表示从文本的第几个字符开始搜索，默认为1。示例：<br> SEARCH('大家', '大家好大家好', 3) 结果： 4"));
        funcMap.put("REPLACE", SalaryI18nUtil.getI18nLabel(97735, "在原文本中，从替换位置开始，往后数指定的替换字符数，将这段文本替换为新文本。示例：<br> REPLACE('大家好大家好', 2, 3, 'dajia') 结果： '大dajia家好'"));
        funcMap.put("REPT", SalaryI18nUtil.getI18nLabel(97736, "将文本重复指定次数。示例：<br> REPT('大家', 2) 结果： '大家大家'"));
        funcMap.put("PAD", SalaryI18nUtil.getI18nLabel(97737, "将原文本填充到指定长度，如果文本长度大于设置的长度，则不做任何操作。填充位置可用参数：'LEFT'、'RIGHT'。示例：<br> PAD('你好', 4, '你', 'LEFT') 结果： '你你你好'"));
        funcMap.put("TRIM", SalaryI18nUtil.getI18nLabel(97738, "删除文本首尾的空格。示例：<br> TRIM(' 大家好 ') 结果： '大家好'"));
        funcMap.put("LEFT", SalaryI18nUtil.getI18nLabel(97739, "从文本左侧开始，返回指定字符数的文字。示例：<br> LEFT('大家好', 2) 结果： '大家'"));
        funcMap.put("RIGHT", SalaryI18nUtil.getI18nLabel(97740, "从文本右侧开始，返回指定字符数的文字。示例：<br> RIGHT('大家好', 2) 结果： '家好'"));
        funcMap.put("MID", SalaryI18nUtil.getI18nLabel(97741, "从文本指定位置之后开始，返回指定字符数的文字。示例：<br> MID('大家好', 2, 1) 结果： '家'"));
        funcMap.put("ISEMPTY", SalaryI18nUtil.getI18nLabel(97742, "变量为空或未填写，则返回真。示例：<br> ISEMPTY({员工表.电话})"));
        funcMap.put("IDCARD", SalaryI18nUtil.getI18nLabel(97743, "从身份证号码中获取相关信息，比如：生日（BD）、年龄（AGE）、籍贯（NA）、性别（GENDER）。示例：<br> IDCARD( ‘43070319980706334X’ , ‘BD’ ) 结果： '1998-07-06'"));
        funcMap.put("SCORE", SalaryI18nUtil.getI18nLabel(97744, "获取选项型控件（单选框、复选框、下拉菜单）分数。示例：SCORE({当前数据.单选框}) 结果：选项分数<br>注：未设置选项分数时，结果为0"));
        funcMap.put("SUBSTRING", SalaryI18nUtil.getI18nLabel(97745, "字符截取函数，用于按起始位置截取字符。<br>示例：SUBSTRING('abcdefg'，2，3) <br>结果：bc"));
        funcMap.put("SUBSTITUE", SalaryI18nUtil.getI18nLabel(97746, "字符查找替换函数，替换字符中的所有关键词为新字符。<br>示例：SUBSTITUE('泛微移动办公','泛微','eteams') <br>结果：eteams移动办公"));
        funcMap.put("LOWER", SalaryI18nUtil.getI18nLabel(97747, "将字符中的字母转为小写。<br>示例：LOWER('abc')<br>结果：ABC"));
        funcMap.put("UPPER", SalaryI18nUtil.getI18nLabel(97748, "将字符中的字母转为大写。<br>示例：LOWER('ABC')<br>结果：abc"));
        funcMap.put("EXACT", SalaryI18nUtil.getI18nLabel(97749, "比较两个字符是否相等，区分字母的大小写。<br>示例：EXACT('泛微Eteams','泛微eteams') <br> 结果：false"));
        funcMap.put("ISSTRING", SalaryI18nUtil.getI18nLabel(0, "判断是否是字符。<br>示例：ISSTRING('泛微Eteams') <br> 结果：true"));

        //数学函数
        funcMap.put("ROUND", SalaryI18nUtil.getI18nLabel(97750, "根据设置的小数位精确度，返回对数值四舍五入后的值。小数位精确度取值可为正整数，0，负整数。如果小数位精确度为正整数，针对小数点后的数据进行四舍五入；如果小数位精确度等于 0，返回最接近数值的整数；如果小数位精确度为负整数，针对小数点前的数据进行四舍五入，被舍掉的数据用0占位。小数位精确度不支持变量。小数位精确度默认为0，即只保留整数。<br>示例：ROUND(123.456，2)，ROUND(123.456，0)，ROUND(123.456，-2) <br>结果：依次为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，即只保留整数。<br>示例：ROUNDDOWN(76.9,0)<br>结果：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, "根据条件获取指定数据源中的全部数据。数据源支持选表单、表单中的字段。<br>示例：想知道税表中，收入大于15000的数值<br>CHOOSE({税表}, {税表.收入}>15000) <br>结果：返回税表中收入大于15000的集合"));
        funcMap.put("MATCH", SalaryI18nUtil.getI18nLabel(97757, "将指定数值在指定数组区域中的位置返回。若数组中无指定值，返回null。<br>示例：MATCH(15000,  [1000, 15000,  2000]) <br>结果：1"));
        funcMap.put("VLOOKUPS", SalaryI18nUtil.getI18nLabel(97758, "按列查找，返回所需值。常用于薪酬模块。根据条件获取查询参数所在列的返回参数的值。返回参数可填写多个，用英文逗号隔开。若查询不到返回null。<br>示例：VLOOKUPS({税表}，{税表.收入}，AND（{税表.收入}>{税表.应纳税所得额下限}，{税表.收入}<{税表.应纳税所得额上限}），[{税表.税率},{税表.速算扣除数}]) <br>结果：按列查找返回税表中收入所在的收入区间所对应的税率和速算扣除数的数值"));

        //数据库函数
        funcMap.put("GETHRMLOGINID", SalaryI18nUtil.getI18nLabel(100808, "获取指定人员系统账号。<br/>示例：GETHRMLOGINID({表单.张三}) <br/>结果：zhangsan@qq.com"));
        funcMap.put("GETHRMWORKCODE", SalaryI18nUtil.getI18nLabel(100810, "获取指定人员编号。<br/>示例：GETHRMWORKCODE({表单.张三}) <br/>结果：A001"));
        funcMap.put("GETHRMMANAGER", SalaryI18nUtil.getI18nLabel(100812, "获取指定人员直接上级。<br/>示例：GETHRMMANAGER({表单.张三}) <br/>结果：返回张三的直接上级"));
        funcMap.put("GETHRMALLMANAGER", SalaryI18nUtil.getI18nLabel(100814, "获取指定人员所有上级。<br/>示例：GETHRMMANAGER({表单.张三}) <br/>结果：返回张三的所有上级形成的数组"));
        funcMap.put("GETHRMDEPARTMENT", SalaryI18nUtil.getI18nLabel(100816, "获取指定人员部门。<br/>示例：GETHRMDEPARTMENT({表单.张三}) <br/>结果：返回张三的部门"));
        funcMap.put("GETHRMSUBCOMPANY", SalaryI18nUtil.getI18nLabel(100818, "获取指定人员分部。<br/>示例：GETHRMSUBCOMPANY({表单.张三}) <br/>结果：返回张三的分部"));
        funcMap.put("GETDEPARTMENTNAME", SalaryI18nUtil.getI18nLabel(100820, "获取指定部门名称。<br/>示例：GETDEPARTMENTNAME({表单.A部门}) <br/>结果：A部门"));
        funcMap.put("GETDEPARTMENTCODE", SalaryI18nUtil.getI18nLabel(100822, "获取指定部门编号。<br/>示例：GETDEPARTMENTCODE({表单.A部门}) <br/>结果：A001"));
        funcMap.put("GETSUPERDEPARTMENT", SalaryI18nUtil.getI18nLabel(100824, "获取指定部门直接上级部门。<br/>示例：GETDEPARTMENTCODE({表单.A部门}) <br/>结果：A部门的直接上级部门"));
        funcMap.put("GETALLSUPERDEPARTMENT", SalaryI18nUtil.getI18nLabel(100826, "获取指定部门所有上级部门。<br/>示例：GETALLSUPERDEPARTMENT({表单.A部门}) <br/>结果：A部门的所有上级部门形成的数组"));
        funcMap.put("GETSUBCOMPANYNAME", SalaryI18nUtil.getI18nLabel(100828, "获取指定分部名称。<br/>示例：GETSUBCOMPANYNAME({表单.A分部}) <br/>结果：A分部"));
        funcMap.put("GETSUBCOMPANYCODE", SalaryI18nUtil.getI18nLabel(100830, "获取指定分部编号。<br/>示例：GETSUBCOMPANYCODE({表单.A分部}) <br/>结果：B001"));
        funcMap.put("GETSUPERSUBCOMPANY", SalaryI18nUtil.getI18nLabel(100832, "获取指定分部直接上级分部。<br/>示例：GETSUPERSUBCOMPANY({表单.A分部}) <br/>结果：A分部的直接上级分部"));
        funcMap.put("GETALLSUPERSUBCOMPANY", SalaryI18nUtil.getI18nLabel(100834, "获取指定分部所有上级分部。<br/>示例：GETALLSUPERSUBCOMPANY({表单.A分部}) <br/>结果：A分部的所有上级分部形成的数组"));
        funcMap.put("GETHRMNAME", SalaryI18nUtil.getI18nLabel(100834, "获取指定人员的姓名。<br/>示例：GETHRMNAME({U:张三}) <br/>结果：张三"));
        funcMap.put("GETHRMMOBILE", SalaryI18nUtil.getI18nLabel(100834, "获取指定人员的手机号码。<br/>示例：GETHRMMOBILE({U:张三}) <br/>结果：13123232323"));

        //财务函数
        funcMap.put("GETMONEY", SalaryI18nUtil.getI18nLabel(0, "将金额转换成中文金额大写。<br/>示例：GETMONEY({1234}) <br/>结果：壹仟贰佰叁拾肆元整"));

    }

    public String get(String key) {
        if (funcMap.size() > 0) {
//			logger.info("描述数据存在："+funcMap.size());
        } else {
            logger.info("初始化函数描述数据");
            initData();
        }

        return funcMap.get(key);
    }
}
