# 工具函数

# 导入

通过如下方式导入工具函数api

import util from "svr-api/utils";

# 方法

/**
 * 工具函数
 */

import { File } from "./fs";

/**
 * 进行md5算法加密,不可逆
 * 
 * @param obj 待加密对象,支持String|File|Blob|InputStream等类型,注意:内部会自动关闭流,使用者无须再做处理
 * @returns 返回16进制的字符串
 */
export function md5(obj: any): string;

/**
 * 进行sha1算法加密,不可逆
 * 
 * @param obj 待加密对象,支持String|File|Blob|InputStream等类型,注意:内部会自动关闭流,使用者无须再做处理
 * @returns 返回16进制的字符串
 */
export function sha1(obj: any): string;

/**
 * 进行sha256算法加密,不可逆
 * 
 * @param obj 待加密对象,支持String|File|Blob|InputStream等类型,注意:内部会自动关闭流,使用者无须再做处理
 * @returns 返回16进制的字符串
 */
export function sha256(obj: any): string;

/**
 * 创建一个加密算法的加密密执行器
 *
 * 1. 使用系统设置中配置的加密算法(指定{@link EncryptAlgorithmOptions.id})创建解密执行器:
 *
 *    ```
 *    createEncryptor({id: "xxxxxxx"})
 *    ```
 *
 * 2. 自定义加密算法配置的方式(指定{@link EncryptAlgorithmOptions.algorithm})创建加密执行器
 *
 *    ```
 *    createEncryptor({
 *       algorithm: "SM4",//系统自带有SM4和AES算法的实现,
 *       mode: "ECB",//系统自带的sm4,默认使用`CBC`模式,这里指定使用`ECB`模式
 *       iv: "xxxxx",//系统自带的SM4/AES算法,默认使用了`UISwD9fW6cFh9SNS`字符作为加密向量
 *       secreteKey: "xxxxx",//秘钥,对于秘钥有特定的长度要求,对于系统自带的SM4/AES算法要求使用16为长度`UTF-8`编码的字符
 *       expectedEncryptResultDataType: FieldDataType.C//期望加密后返回的数据类型
 *    })
 *    ```
 *
 * 如果要使用本方法,需要事先在系统中添加对应的加密算法扩展(参考
 * {@link succ.ExtendPoint.encryptAlgorithm}),系统自带有两种扩展算法(SM4和AES)
 *
 * @param options 加密算法配置
 * @returns 不会返回null,如果加密算法在系统中不存在,会抛出异常
 */
export function createEncryptor(options: EncryptAlgorithmOptions): Encryptor;

/**
 * 创建一个加密算法的解密执行器
 *
 * 1. 使用系统设置中配置的加密算法(指定{@link EncryptAlgorithmOptions.id})创建解密执行器:
 *
 *    ```
 *    createDecryptor({id: "xxxxxxx"})
 *    ```
 *
 * 2. 自定义加密算法配置的方式(指定
 *    {@link EncryptAlgorithmOptions.algorithm})创建解密执行器
 *
 *    ```
 *     createDecryptor({
 *        algorithm: "SM4",//系统自带有SM4和AES算法的实现,
 *        mode: "ECB",//系统自带的sm4,默认使用`CBC`模式,这里指定使用`ECB`模式
 *        iv: "xxxxx",//系统自带的sm4,默认使用了`UISwD9fW6cFh9SNS`字符作为加密向量
 *        secreteKey: "xxxxx",//秘钥,对于秘钥有特定的长度要求,对于系统自带的SM4/AES算法要求使用16为长度`UTF-8`编码的字符
 *        expectedDecryptResultDataType: FieldDataType.C//期望加密后返回的数据类型
 *     })
 *    ```
 *
 * 如果要使用本方法,需要事先在系统中添加对应的加密算法扩展(参考
 * {@link succ.ExtendPoint.encryptAlgorithm}),系统自带有两种扩展算法(SM4和AES)
 *
 * @param options 加密算法配置
 * @returns 可能返回null,加密算法可能为非对称加密算法,不能解密,没有对应的解密器;如果加密算法不存
 *         在,会直接抛出异常
 */
export function createDecryptor(options: EncryptAlgorithmOptions): Decryptor;

/**
 * {@link createEncryptor} 和{@link createDecryptor}的创建参数
 */
export interface EncryptAlgorithmOptions extends succ.encryptAlgorithm.EncryptAlgorithmOptions {
	/**
	 * 加密算法id
	 *
	 * 这里的id为系统设置中使用当前算法扩展所配置的算法
	 * id,{@link SysSettingsJson["security.encrypt.algorithms"]}
	 *
	 * 指定这个参数,说明要使用系统设置中的算法,如果id对应的系统设置算法不存在会抛出异常
	 */
	id?: EncryptAlgorithmId;

	/**
	 * 算法的名称
	 *
	 * 对应为{@link ExtensionContributeInfo.name}
	 *
	 * 指定这个参数,说明要自定义算法的配置,算法的配置请根据扩展的要求来添加,比如系统自带的`SM4`和
	 * `AES`算法扩展支持配置有:
	 *
	 * 1. mode: "ECB" | "CBC"//加密模式,默认使用`CBC`模式
	 * 2. secretKey: string; // 秘钥,必须要为长度为16的字符串
	 * 3. iv: string;// 加密向量;如果加密模式为`ECB`应该不指定向量,指定也会被忽略掉;默认使用
	 *    `UISwD9fW6cFh9SNS`作为向量
	 */
	algorithm?: string;

	/**
	 * 执行加密所期望结果类型
	 *
	 * 一般有且仅有`字符串`、`byte数组`两种:
	 *
	 * 1. `字符串`:用于展示以及写入数据库的`clob`类型、`字符类型`的字段中
	 * 2. `byte数组`:用于加密大数据时,生成流,用流的方式向数据库中写入数据,在一些场景下中有更好的
	 *    性能
	 *
	 * 默认为`字符串`{@link FieldDataType.C}
	 */
	expectedEncryptResultDataType?: FieldDataType;

	/**
	 * 当加密期望返回一个字符串结果时,字符串编码的格式
	 *
	 * 1. 在{@link createDecryptor}调用时如果{@link expectedEncryptResultDataType}指定为
	 * {@link FieldDataType.C}时,这个参数标识了加密结果字符串的格式
	 * 2. 在{@link createDecryptor}调用时传递给{@link Decryptor.decrypt}的内容是字符串,会直接认为字符
	 * 串就是当前属性指定的编码类型,会根据当前类型来生成byte数组
	 *
	 * 对于单向加密同通常使用{@link EncryptStringResultType.hex}十六进制字符串作为返回结果,对于双向
	 * 加密、非对称加密,一般使用{@link EncryptStringResultType.base64}作为返回结果
	 *
	 * 默认情况下为{@link EncryptStringResultType.base64}
	 */
	encryptStringResultType?: EncryptStringResultType;

	/**
	 * 执行解密所期望结果类型
	 *
	 * 在{@link createDecryptor}调用时有效果
	 *
	 * 可能有`数值`、`字符串`、`byte数组`、`日期`等
	 *
	 * 默认为`字符串`{@link FieldDataType.C}
	 */
	expectedDecryptResultDataType?: FieldDataType;
}

/**
 * 加密算法加密器
 *
 * 该对象是线程内复用的,在内部会复用变量,减少GC,约定此对象不会多线程并发使用。
 *
 * 对应`Encryptor.java`
 */
export interface Encryptor {

	/**
	 * 执行加密
	 *
	 * @param value 待加密内容,可能是数值、字符、流、byte数组、日期等类型;例如金额、税号等数据常用
	 *        数值存储,同样需要支持加密解密。
	 * @return 只有value传递null时才会返回null,如果无法进行加密会抛出异常;返回结果的类型参考
	 *         {@link EncryptAlgorithmOptions.expectedEncryptResultDataType}
	 */
	encrypt(value: any): any;
}

/**
 * 加密算法解密器
 *
 * 该对象是线程内复用的,在内部会复用变量,减少GC,约定此对象不会多线程并发使用。
 *
 * 对应`Decryptor.java`
 */
export interface Decryptor {

	/**
	 * 执行解密
	 *
	 * @param value 待解密内容,可能是字符、byte数组、流;如果是字符串,会根据
	 *        {@link EncryptAlgorithmOptions.encryptStringResultType}来解析字符串
	 * @return 只有value传递null时才会返回nulll,如果不能解密会抛出异常;返回结果的类型参考
	 *         {@link EncryptAlgorithmOptions.expectedEncryptResultDataType}
	 */
	decrypt(value: any): any;
}

/**
 * 生成一段随机字符串,字符串由字母和数字构成。
 * 
 * @param len 指定随机字符串长度,默认8
 */
export function randomString(len?: number): string;

/**
 * 生成一段纯数字的随机字符串。
 * 
 * @param len 指定随机字符串长度,默认8
 */
export function randomNumberString(len?: number): string;

/**
 * 生成一段uuid,生成一段uuid,为base64编码,仅含有数字和字母的字符串
 */
export function uuid(): string;

/**
 * 获取汉字的拼音。
 * 
 * @param str 汉字字符串
 * @param initial 是否只返回首字母,默认为true
 * @returns 返回拼音,首字母大写,其它字母小写
 */
export function pinyin(str: string, initial?: boolean): string;

/**
 * 确保字符串str以字符串suffix结尾,返回处理之后的字符串。
 * 
 * @example
 *  appendIfMissing(null, null) = null
 *  appendIfMissing("abc", null) = "abc"
 *  appendIfMissing("", "xyz") = "xyz"
 *  appendIfMissing("abcxyz", "xyz") = "abcxyz"
 *  appendIfMissing("abcXYZ", "xyz") = "abcXYZxyz"
 *  appendIfMissing("abc", "xyz", false, "mno") = "abcxyz"
 *  appendIfMissing("abcxyz", "xyz", true, "mno") = "abcxyz"
 *  appendIfMissing("abcmno", "xyz", true, "mno") = "abcmno"
 *  appendIfMissing("abcXYZ", "xyz", true, "mno") = "abcXYZxyz"
 * 
 * @param str 用于验证的字符串
 * @param suffix 匹配结尾的字符串
 * @param ignoreCase [可选] 是否忽略大小写,默认大小写敏感。
 * @param suffixes [可选] 当str不以其中任意一个结尾时,确保以suffix结尾。
 */
export function appendIfMissing(str: string, suffix: string, ignoreCase?: boolean, ...suffixes: string[]): string;

/**
 * 确保字符串str以字符串prefix开头或者以params中任意一个字符串开头,返回处理之后的字符串
 * @example
 *  prependIfMissing(null, null) = null
 *  prependIfMissing("abc", null) = "abc"
 *  prependIfMissing("", "xyz") = "xyz"
 *  prependIfMissing("abc", "xyz") = "xyzabc"
 *  prependIfMissing("abcxyz", "xyz") = "xyzabcxyz"
 *  prependIfMissing("ABCxyz", "abc") = "abcABCxyz"
 *  prependIfMissing("abc", "xyz", "") = "abc"
 *  prependIfMissing("xyzmno", "xyz", true, "mno") = "xyzmno"
 *  prependIfMissing("XYZmno", "xyz", true, "mno") = "xyzXYZmno"
 * 说明:若字符串str既不以prefix开头,也不以params中的任一项开头,优先确保字符串str以字符串prefix开头
 * @param str 用于验证的字符串
 * @param prefix 匹配开头的字符串
 * @param ignoreCase [可选] 是否忽略大小写,默认大小写敏感。
 * @param prefixes [可选] 匹配开头的字符串
 */
export function prependIfMissing(str: string, prefix: string, ignoreCase?: boolean, ...prefixes: string[]): string;

/**
 * 确保字符串str不以字符串prefix开头,返回处理之后的字符串
 * @example
 *  removeStart(null, null) = null
 *  removeStart("abc", null) = "abc"
 *  removeStart("", "xyz") = ""
 *  removeStart("xyz", "") = "xyz"
 *  removeStart("abcxyz", "abc") = "xyz"
 *  removeStart("ABCxyz", "abc") = "ABCxyz"
 * @param str 用于验证的字符串
 * @param prefix 匹配开头的字符串
 * @param ignoreCase [可选] 是否忽略大小写,默认大小写敏感。
 */
export function removeStart(str: string, prefix: string, ignoreCase?: boolean): string;

/**
 * 确保字符串str不以字符串suffix结尾,返回处理之后的字符串
 * @example
 *  removeEnd(null, null) = null
 *  removeEnd("abc", null) = "abc"
 *  removeEnd("", "xyz") = ""
 *  removeEnd("xyz", "") = "xyz"
 *  removeEnd("abcxyz", "xyz") = "abc"
 *  removeEnd("abcXYZ", "xyz") = "abcXYZ"
 * @param str 用于验证的字符串
 * @param suffix 匹配结尾的字符串
 * @param ignoreCase [可选] 是否忽略大小写,默认大小写敏感。
 */
export function removeEnd(str: string, suffix: string, ignoreCase?: boolean): string;

/**
 * 将传入的对象解析为boolean类型,若解析不成功,有def则返回def,没有则返回false
 * @example
 *  parseBoolean(null, true) = true
 *  parseBoolean("0", true) = false
 *  parseBoolean("1", true) = true
 *  parseBoolean("Y", true) = true
 *  parseBoolean("T", true) = true
 *  parseBoolean("yes", true) = true
 *  parseBoolean("N", true) = false
 *  parseBoolean("f", true) = false
 *  parseBoolean("no", true) = false
 *  parseBoolean("true", false) = true
 *  parseBoolean("false", true) = false
 *  parseBoolean("faLse", true) = false
 *  parseBoolean("on", false) = true
 *  parseBoolean("ON", false) = true
 *  parseBoolean("off", true) = false
 *  parseBoolean("oFf", true) = false
 *  parseBoolean("test", true) = true
 *  parseBoolean("test") = false
 * @param obj 需解析成boolean类型的对象,传入的对象不区分大小写
 * @param def 解析失败时的默认值
 */
export function parseBoolean(obj: any, def?: boolean): boolean;

/**
 * 解析xml内容,并返回xml文档对象。
 *
 * @param content xml内容,字符串或输入流
 * @param encoding 读取xml时的编码,传递null时将使用xml文件内声明的编码,没有声明编码将使用UTF-8
 * @param stripWhitespaceText 是否移除xml中的一些节点之间的空白文本,这些文本内容默认也是Node节点,默认false
 * 
 */
export function readXML(content: string | InputStream | File | Reader, encoding?: string, stripWhitespaceText?: boolean): Dom4j.Document;

/**
 * 将一个xml文档写入到指定的流中。
 *
 * @param doc 待写入的xml文档
 * @param target 目标文件或流,可传递文件对象、Writer、或输出流对象
 * @param encoding 默认将使用Document内声明的编码,没有声明编码将使用utf8。如果传递了明确的编码,但
 * 是编码和Document中声明的不一致,那么文件内容编码依然使用传递的编码,会和xml内容中声明的不一致。
 * @param pretty 是否格式化,默认false,传递true时默认使用tab缩进。
 * @param declaration 默认true,可以传递:
 *  1. true 输出默认的xml头,如:<?xml version=\"1.0\" encoding=\"UTF-8\"?>,其中的编码会替换为指定
 *     的编码。
 *  2. false 不输出xml头
 *  3. 其他字符串,输出指定的头
 */
export function writeXML(doc: Dom4j.Document, target: File | Writer, encoding?: string, pretty?: boolean, declaration?: any): void;

/**
 * 格式化XML,并返回格式化后的内容
 * 
 * @param xml 待格式化的xml,可以为string或Document
 * @return 返回格式化之后的xml字符串
 */
export function formatXML(xml: string | Dom4j.Document | File): string;

/**
 * 从指定的流或字节数组中读取字符串。
 *
 * 内部不会关闭流,调用者需要自行关闭。
 *
 * @param content 待读取的流或字节数组,支持传递
 *     `Reader|InputStream|byte[]|File|Blob|string`类型,`string`类型为文件路径,若文
 *     件不存在则抛出异常
 * @param encoding 文件内容编码,可选,默认编码`UTF-8`。
 */
export function readString(content: Reader | InputStream | number[] | File | Blob | string, encoding?: string): string;

/**
 * 将一个字符串写入到指定的流中。
 *
 * 内部不会关闭流,调用者需要自行关闭。
 *
 * @param str 待写入的字符串
 * @param target 目标流,支持传递`Writer|OutputStream|File|string`类型,`string`类
 *     型为文件路径,若文件不存在则自动创建
 * @param encoding 文件内容编码,可选,默认编码`UTF-8`
 * @param isAppend 是否追加写入,可选,默认为`false`,只对于文件类型有效
 */
export function writeString(str: string, target: Writer | OutputStream | File | string, encoding?: string, isAppend?: boolean): void;

/**
 * 从指定的流或字节数组中读取JSON。
 * 
 * 内部不会关闭流,调用者需要自行关闭。
 * 
 * @param content 待读取的流或字节数组,支持传递
 *     `Reader|InputStream|byte[]|File|Blob|string`类型,`string`类型为文件路径,若文
 *     件不存在则抛出异常
 * @param encoding 文件内容编码,可选,默认编码`UTF-8`。
 */
export function readJSON(content: Reader | InputStream | number[] | File | Blob | string, encoding?: string): JSONObject;

/**
 * 将一个JSON写入到指定的流中。
 * 
 * 内部不会关闭流,调用者需要自行关闭。
 * 
 * @param json 待写入的JSON
 * @param target 目标流,支持传递`Writer|OutputStream|File|string`类型,`string`类
 *     型为文件路径,若文件不存在则自动创建
 * @param encoding 文件内容编码,可选,默认编码`UTF-8`
 */
export function writeJSON(json: JSONObject, target: Writer | OutputStream | File | string, encoding?: string): void;

/**
 * 对传入的内容进行Base64编码,返回编码后的字符串可使用{@link decodeBase64()}函数可进行解码
 * 
 * @param obj 支持String|File|Blob|InputStream|byte[]等类型,注意:内部会自动关闭流,使用者无须再做处理
 * @return  返回base64编码的字符串
 */
export function encodeBase64(obj: any): string;

/**
 * 解码由{@link encodeBase64()}编码的字符串
 * 
 * @param str 待解码的字符串
 * @return 返回base64解码后的字符串
 */
export function decodeBase64(str: string): string;

/**
 * 对一串html的字符串内容进行转义
 * @example
 *  escapeHTML("<br/>&") = "&lt;br/&gt;&amp;"
 * @param str 要被转义或编码的字符串。
 * @return 转义之后的字符串
 */
export function escapeHTML(str: string): string;

/**
 * 对一串js的内容进行转义,将字符串转义内容再次转义
 * @example
 *  escapeJS("let test = \"test\"") = "let test = \\\"test\\\""
 * @param str 要被转义或编码的字符串。
 * @return 转义之后的字符串
 */
export function escapeJS(str: string): string;

/**
 * 执行前端指定的js模块中的指定的函数
 * 注意:
 * 1.若指定的函数中抛出了异常,则此方法也抛出异常
 * 2.支持异步函数
 * @param args 
 * @return 返回执行方法的返回值
 */
export function runNodeJs(args: {
	/**
	 * 前端js模块名称。
	 * 
	 * 如`metadata/metadata`、`ana/dashboard/dashboard`。
	 * 
	 * 如果是元数据脚本模块,则模块名为元数据的绝对路径,不包含ctx,不包含扩展名,例如:`/TestCase/app/test-scripts.app/scripts/test_svrScript`
	 */
	jsModule: string,
	/**要执行的函数的名称 */
	funcName: string,
	/**传递给函数的参数,参数是通过命令行传递给nodejs的,有字符限制 */
	args?: Array<string>,
	/**默认为true,支持前端代码中发起ajax请求 */
	supportAjax?: boolean,
	/**执行js模块的用户身份,可以为空,即用登录用户,在报表,仪表板,表单获取编译信息时,需要用一个有编辑权限的用户,不然在获取资源时可能会有权限异常 */
	userid?: string,
}): string;


/**
 * 加密一个密码,此函数使用的是可逆加密算法(使用{@link decryptPassword()}函数可进行解密),加密结果长度会比输入的密码长度略大。
 *
 * @param password 需要加密的明文密码字符串,null作空串处理
 */
export function encryptPassword(password: string): string;

/**
 * 解密由{@link encryptPassword()}加密的密文密码串,若该密码不是由encryptPassword加密的,则直接原样返回
 * 
 * @param password 需要解密的密文密码字符串,null作空串处理
 */
export function decryptPassword(password: string): string;

/**
 * 校验身份证号的合法性
 * @param pid 身份证号码
 * @example 
 * pidCheck("330722196501292110") = true
 * pidCheck("330722196501292112") = false	第18位数字校验失败
 * pidCheck("330722296501292110") = false	身份证生日不合法,校验失败
 * pidCheck("030722196501292110") = false	身份证区域校验失败
 * pidCheck("3307221965012921101") = false	身份证长度校验失败
 * pidCheck("330722650129211") = true
 */
export function pidCheck(pid: string): boolean;

/**
 * 校验身份证合法性,该方法返回详细信息
 * @param pid 身份证号码
 */
export function pidCheckInfo(pid: string): {

	/**身份证是否合法 */
	valid: boolean,

	/**
	 * 身份证错误信息代码
	 * err_checkcode,第十八位校验失败
	 * err_length,身份证长度不对
	 * err_city,身份证区位码不正确
	 * err_birthday,身份证生日不合法
	 */
	errorType?: string,

	/**身份证最后一位的字符 */
	checkCode?: string
}

/**
 * 将十六进制字符串转换成字符数组
 * @param hexString 16进制字符串
 */
export function hex2Bytes(hexString: string): Array<number>;

/**
 * 把一个字符串首尾和内部的非可见字符都去掉
 * @param str 
 */
export function trimAll(str: string): string;


/**
 * 对日期进行格式化,不传递date参数时,默认返回当前时间字符串
 * 
 * @param date  支持js的Date,java的Date,及long类型
 * @param pattern 格式,如yyyy-MM-dd HH:mm:ss ,默认为yyyyMMdd 
 */
export function formatDate(date: any, pattern?: string): string;

/**
 * 将日期字符串转换成java.util.Date类型
 * 
 * @param date 
 * @param pattern 如 yyyyMMdd,不传递时将尽量猜测各种可能的日期格式
 * @returns 无法解析时返回null
 */
export function parseDate(date: any, pattern?: string): any;

/**
 * 对传入的日期进行天数加len的操作
 * @param date 支持js的Date,java的Date,及String类型
 * @param len 
 * @param pattern 当传入字符串时,可指定字符串的格式,默认为yyyyMMdd 
 * @returns 传入String类型,返回String,传入jsDate或JavaDate,返回java.util.Date类型
 */
export function addDay(date: any, len: number, pattern?: string): any;

/**
 * 对传入的日期进行月份加len的操作
 * @param date 支持js的Date,java的Date,及String类型
 * @param len 
 * @param pattern 当传入字符串时,可指定字符串的格式,默认为yyyyMMdd
 * @returns 传入String类型,返回String,传入jsDate或JavaDate,返回java.util.Date类型
 */
export function addMonth(date: any, len: number, pattern?: string): any;

/**
 * 对传入的日期进行年份加len的操作
 * @param date 支持js的Date,java的Date,及String类型
 * @param len 
 * @param pattern 当传入字符串时,可指定字符串的格式,默认为yyyyMMdd
 * @returns 传入String类型,返回String,传入jsDate或JavaDate,返回java.util.Date类型
 */
export function addYear(date: any, len: number, pattern?: string): any;

/**
 * 判断指定的地点,是否在指定的区域内
 * 
 * 区域的格式为WKT格式的字符串,如:
 * 
 * 1. 矩形 `polygon((116.925304 38.935671,116.925304 39.118327, 117.195907 38.935671, 117.195907 39.118327, 116.925304 38.935671))`
 * 2. 多边形 `polygon((117.195907 39.118327, 116.925304 38.935671, 117.654173 39.032846, 117.195907 39.118327))`
 * 
 * TODO 此函数效率不高,当有一大批地点需要筛选判断时,geometrys每次都要解析,待优化。
 * 
 * @param lng  地点经度
 * @param lat  地点纬度
 * @param geometrys 表示一个地理几何结构区域,为WKT格式的字符串。
 * @return 判断是否在指定的区域内
 */
export function geoWithIn(lng: number, lat: number, geometrys: string): boolean;

/**
 * 计算两个地点(经纬度)间的距离
 * 
 * @param lng1 地点1经度
 * @param lat1 地点1纬度
 * @param lng2 地点2经度
 * @param lat2 地点2纬度
 * @return  返回两个地点之间的距离,返回单位:米
 */
export function geoDistance(lng1: number, lat1: number, lng2: number, lat2: number): number;

/**
 * 将连续的dot变量分解为独立的变量。
 *
 * 变量中的字段名可能有特殊字符,会用中括号扩起来,转换时保留中括号。
 *
 * 使用场景:
 *
 * 1. 解析雪花模型的字段,比如`XSDW.XZQH.DQ.$LEVEL0`
 * 2. 模型的完整表名“qualified name”,需要注意的是返回值是倒序的数组。
 *    比如:`catalog1.schema1.table1` 返回:`["catalog1","schema1","table1"]`
 *
 * 例子:
 * 'XSDW.DLWZ.[CD.M]' -> ['XSDW','DLWZ','[CD.M]']
 * 'XSDW.DLWZ.[[CD]].M]' -> 不支持字段名中有[]的情况,因为会用中括号判断字段开始/结束位置。
 *
 * @param dotVarName
 * @return 如果dotVarName为null,返回null,否则返回一个数组。
 */
export function splitVarName(dotVarName: string): string[];

/**
 *将一组变量拼接为一个dot变量。
 *
 * 是{@link splitVarName(String, boolean)}的还原方法。
 *
 * 使用场景:
 *
 * 1.将“qualified name”还原,比如:["catalog", "scharm", "table"] 还原为:"catalog.schema.table"
 *
 * @param varNames
 * @return 如果varNames为null,返回null。
 */
export function concatVarName(varNames: string[]): string;

/**
 * 转换为 java.match.BigDecimal 对象。
 */
export function toDecimal(value: any): any;

/**
 * 转换为 java.lang.String 对象。
 */
export function toString(value: any): string;

/**
 * 转换为 java.match.BigInteger 对象。
 */
export function toBigInteger(value: any): any;

/**
 * 转换为 java.util.Integer或java.util.Long
 */
export function toInteger(value: any): number;

/**
 * 转换为 java.util.Double
 */
export function toDouble(value: any): number;

/**
 * 转换为 java.util.Date 对象。
 */
export function toDate(value: any): any;

/**
 * 转换为 java.sql.Date 对象。
 */
export function toSqlDate(value: any): any;

/**
 * 转换为 java.sql.Timestamp 对象。
 */
export function toTimestamp(value: any): any;

/**
 * 转换为 boolean。
 */
export function toBoolean(value: any): boolean;

/**
* 将传入对象转换成目标类型。
*
* @param value 值
* @param type 目标类型
*/
export function castType(value: any, type: FieldDataType): any;

/**
 * 根据一个 {@link OutputStream} 创建一个 {@link Writer}
 *
 * @param outputStream
 * @param chaset 字符编码,默认使用UTF-8
 */
export function createWriter(outputStream: OutputStream, chaset?: string): Writer;

/**
 * 根据一个 {@link InputStream} 创建一个 {@link Reader}
 * 
 * @param inputStream 
 * @param chaset 字符编码,默认使用UTF-8
 */
export function createReader(inputStream: InputStream, chaset?: string): Reader

/**
 * 将一个键值对字符串解析为一个 {@link JSONObject} 对象。
 * 
 * 1. 键值对之间分隔符支持:`&;,|\n`
 * 2. 键值分隔符支持:`=:`
 * 3. 值如果有分隔符,需要用双引号扩起
 * 4. 值如果有双引号和转义符`\`,需要用`\`转义
 * 
 * 举例:
 * 
 * 1. `key1=value1&key2=value2&key3=value3`
 * 2. `key1=value1;key2=value2;key3=value3`
 * 3. `key1:value1\nkey2:value2\nkey3:value3`
 * 
 * @param content 键值对字符串
 * @param kvSeparator 键值对之间的分隔符,默认使用&
 * @param valueSeparator 键值对内的分隔符,默认使用=
 * @return {@link JSONObject} 对象,如果content为空,返回空的 {@link JSONObject} 对象。
 */
export function parseKVString(content: string, kvSeparator?: string, valueSeparator?: string): JSONObject;

/**
 * 将一个Map对象序列化为一个字符串。
 * 
 * 此方法是 {@link parseKVString(content)} 的逆方法。
 * 
 * @param obj {@link JSONObject} 对象
 * @param kvSeparator 键值对之间的分隔符,默认使用&
 * @param valueSeparator 键值对内的分隔符,默认使用=
 * @return 键值对字符串,如果obj为空,返回空字符串。
 */
export function stringifyKV(obj: JSONObject, kvSeparator?: string, valueSeparator?: string): string;

/**
 * 将一个字符串按指定分隔符分割为数组。
 * 
 * 1. 如果值里面包含分隔符,需要用双引号扩起
 * 2. 如果值里面包含双引号和转义符`\`,需要用`\`转义
 * 
 * @param content 字符串
 * @param separator 分隔符,默认使用逗号
 * @return 数组,content为空时,返回空数组。
 */
export function splitValues(content: string, separator?: string): Array<string>;

/**
 * 将一个数组按指定分隔符拼接为字符串。
 * 
 * 此方法为 {@link splitValues(content, separator)} 的逆方法。
 * 
 * @param arr 数组
 * @param separator 分隔符,默认使用逗号
 * @retuan 字符串,arr为空时,返回空字符串。
 */
export function joinValues(arr: Array<any>, separator?: string): string;

/**
 * 从url中提取参数列表
 *
 * 如果uri不含查询参数(即没有"?"及其后面的部分),该方法将返回一个空的Map对象。
 *
 * @param url 完整的URI字符串,包含参数部分。
 * @return 返回一个包含所有参数及其值的Map对象,若无参数,则返回一个空的Map对象,不会返回null。参数
 *         名和参数值都是字符串类型,且都已decode。
 */
export function parseURLParameters(url: string): JSONObject;

/**
 * 将参数添加到url中
 * 
 * @param url 完整的URI字符串,包含参数部分。
 * @param params 新的参数列表,是 {@link JSONObject} 对象。
 * @return 返回添加参数后的完整的url
 */
export function addURLParameters(url: string, params: JSONObject): string;

/**
 * 从url中删除参数
 * 
 * @param url 完整的URI字符串,包含参数部分。
 * @param paramNames 要删除的参数名列表,可以是字符串或字符串数组。
 * @return 返回删除参数后的完整的url。
 */
export function removeURLParameters(url: string, paramNames: string | Array<string>): string;
是否有帮助?
0条评论
评论