# 功能描述

tools工具提供系统常用的函数。
源码路径: node_modules/sei-ui/src/utils/tools.js。

# 引入方式

import {tools} from 'sei-ui'
1

# 方法Methods

/**
 * 获得32位长的唯一id
 * @returns {*}
 */
const getUUID = ();

/**
 * 获得当前登录的用户所有信息
 * @returns {any | {}}
 */
const getUser = ();

/**
 * 获得当前登录的用户账号(编号)
 * @returns {null|number}
 */
const getUid = ();

/**
 * 获得当前登录的用户名
 * @returns {string}
 */
const getUname = ();

/**
 * 获得当前登录的组织机构代码
 * @returns {string}
 */
const getOid = ();

/**
 * 获得当前登录的组织机构名称
 * @returns {string}
 */
const getOidName = ();

/**
 * 获得当前登录的用户角色编号
 * @returns {string}
 */
const getRid = ();

/**
 * 截取字符串中指定字符串后的内容
 * @param str: 原始字符串
 * @param sub: 查找的字符串
 * @returns {string|null}
 */
const subAfterString = (str, sub);

/**
 * 获得el对象的css属性值.例如:width/height/margin
 * @param obj: vue的el对象
 * @param attr: 要取得的css属性名称
 * @returns {string}
 */
const getStyle = (obj, attr);

/**
 * 计算自身高度(通过父元素的高度减去前置元素的高度)
 * @param el: vue的el对象
 * @returns {number}
 */
const getHeight = (el);


/**
 * 对象拷贝,注意:obj中还有对象则为拷贝指向该对象的引用而非该真实对象
 * @param obj: 源对象
 * @returns {null|any}
 */
const clone = (obj);

/**
 * 获得数组中包括json对象的key值在数组中的索引位置
 * @param array: json数组
 * @param json: 要查找的json对象
 * @param key: 比较的json对象中的key
 * @returns {null|number}
 */
const arrayIndexOf = (array, json, key);

/**
 * 获得数组中是否包含json对象的key值
 * @param array
 * @param key
 * @param val
 * @returns {boolean}
 */
const arrayIncludes = (array, key, val);

/**
 * 获得数组中最后一个满足条件的json的索引
 * @param array
 * @param json
 * @param key
 * @returns {null|number}
 */
const arrayLastIndexOf = (array, json, key);

/**
 * 满足条件的个数
 * @param array
 * @param json
 * @param key
 * @returns {*}
 */
const arrayIndexCount = (array, json, key);

/**
 * 判断是否是字符串
 * @param str
 * @returns {boolean}
 */
const isString = (str);

/**
 * 判断是否是Json对象
 * @param obj
 * @returns {boolean}
 */
const isJson = (obj);

/**
 * 判断json是否为空值
 * @param json
 * @returns {boolean}
 */
const isEmpty = (json);

/**
 * 遍历解析Json
 * @param jsonObj: 要遍历的json对象
 * @param callBack: 回调方法,参数: 1.当前子json, 2.当前key, 3.当前key的值
 */
const parseJson = (jsonObj, callBack);

/**
 * 字符串格式化
 * @param str: 要格式化的字符串
 * @param args: 格式化参数值
 * @returns {void|*}
 */
const format = function(str, args);

/**
 * 判断两个json的差异,但不包括children项
 * @param oldJson
 * @param newJson
 * @returns {*}
 */
const diff = (oldJson, newJson);

/**
 * 首字母大写
 * @param first
 * @param rest
 * @param lowerRest: 为true代表后面的字符全部转小写,否则后面的字符原样不变
 * @returns {string}
 */
const capitalize = ([first, ...rest], lowerRest = false);

/**
 * 数据转换
 * @param data: 要转换的json数据对象{}
 * @param conver: 转换类型,例如将ff字段在数组与字符串间转换:{ff: 'array->string'}
 */
function dataConver(data, conver);

/**
 * 将一维的扁平数组转换为多层级对象,针对父级儿子各一条记录的情况
 * @param data: 要转换的json数组
 * @param option: {pid: 父亲字段, id: id字段名称}
 * @param pidVal: 父字段值,如果有值则代表只建立顶层为该值的树
 * @param conver: 转换
 * @param rowCallBack: 每一行的回调,返回false则不加入树中
 * @returns 返回建立的树对象{[]}
 */
const towToTree = (data, option, pidVal = null, conver, rowCallBack);

/**
 * 针对父亲儿子都在一条记录中,因此分离出父亲并添加父亲行
 * @param data: json数组
 * @param option:{pid: 父亲字段, keyField: id字段名称, label: 名称字段名称}
 * @param conver: 数据转换,常用于将字符串转为数组等
 * @param callBack: 每次产生父节点记录后的回调,用于外部修正父节点
 * @returns {[]}
 */
const oneToTree = (data, option, conver, callBack);

/**
 * 将json数组转化为树型结构,父子为同1条记录,用户级联选择(待测试)
 * @param data:list数组
 * @param parm: {}
 * @returns {Array}
 */
const mapToTree = (data, parm=[{label: '_pid'}, {id: 'id'}]);

/**
 * 在树中查找指定字段和指定值的节点和所在的当前上层树
 * @param data:数据
 * @param id:字段
 * @param value:对象或者具体值
 * @returns {{node: 当前节点, tree: 当前节点所在的树, index: 当前节点在当前层的索引}}
 */
const findTree = (data, id, value);

/**
 * 查找树形结构当前节点的所有父级结构
 * @param data: 树形结构数据
 * @param field: 比较的字段
 * @param fieldValue: 比较的值
 * @returns {[]}
 */
const findTreeParents = (data, field, fieldValue);


/**
 * 在树中查找指定字段和指定值所在的当前节点
 * @param data:数据
 * @param id:字段
 * @param value:具体值
 * @returns: {当前节点}
 */
const findTreeNode = (data, id, value);

/**
 * 在树中查找指定字段和指定值所在的当前节点
 * @param data:数据
 * @param id:字段
 * @param value:具体值
 * @returns: {当前节点}
 */
const findIndexTreeNode = (data, id, value, expand, callBack);

/**
 * 在树中查找指定字段和指定值所在的当前节点
 * @param data:数据
 * @param id:字段
 * @param value:具体值
 * @returns: {当前节点}
 */
const findIndexTreeNodeByObject = (data, obj);

/**
 *
 * @param data
 * @param Index
 * @param callBack
 * @returns {undefined}
 */
const findTreeNodeFromIndex = (data, Index, callBack);

/**
 * 删除树节点
 * @param tree
 * @param id:可以是字段或者节点对象,否则第三个参数value必须有值
 * @param value:当valueField为节点对象时,为空否则必须录入该字段的值
 */
const deleteTreeNode = (tree, id, value);

/**
 *  替换树节点
 * @param data
 * @param newNode
 * @param id
 * @param value
 */
const replaceTreeNode = (data, newNode, id = 'id', value = null);

/**
 * 防抖函数
 * @param fn: 函数
 * @returns {function(...[*]=)}
 */
const throttle = function (fn);

/**
 * 从指定的组件中查找第一个下级标签为指定标签的vue对象
 * @param fromComponent
 * @param tag
 * @returns {null|Vue}
 */
const findFirstChildrenComponent = (fromComponent, tag);

/**
 * 遍历下级组件并执行回调,返回false终止
 * @param fromComponent
 * @param callBack
 */
const findChildrenComponent = (fromComponent, callBack);

/**
 * 遍历上级组件并执行回调,返回false终止
 * @param fromComponent
 * @param includeSelf: 是否包含控件本身
 * @param callBack
 */
const findParentComponent = (fromComponent, includeSelf = false, callBack);

/**
 * 遍历树并执行回调
 * @param tree: 要遍历的树数组或单个对象
 * @param callback: 回调
 */
function treeEach(tree, callback);

/**
 * 在下级组件中查找expression为指定值得组件
 * @param component
 * @param field: expression值
 * @returns {null|Vue|boolean}
 */
const findInputComponent = (component, field);

/**
 * 获得最后一个分隔符后的内容
 * @param srcStr
 * @param splitChar
 * @returns {string}
 */
const getLastSplitString = (srcStr, splitChar);

/**
 * 自定义校验指定的规则
 * @param fieldVal
 * @param rules
 * @returns {boolean}
 */
const validateField = (fieldVal, rules);

/**
 * 校验element-ui的表单并执行func函数
 * @param form: element-ui的表单
 * @param func: 验证通过后执行的函数
 */
const validateFormAndDo = (form, func);

/**
 * 设置组件的校验操作
 * @param dataSource
 * @param component
 * @param currEditSelection
 * @param field
 * @param rules
 */
const setComponentRuleActon = (dataSource, component, currEditSelection, field, rules);

/**
 * 时间格式化, 例如: dateFormat('YYYY-mm-dd HH:MM:SS', new Date())
 * @param fmt: 格式化字符串
 * @param date: 日期
 * @returns {*}
 */
const dateFormat =(fmt, date);

/**
 * 退出时清理缓存
 */
const clearCache = ();

/**
 * 退出系统
 * @param callback
 */
const logOut = (callback);

/**
 * 获取字符串长度,英文字符 长度1,中文字符长度2
 * @param {*} str
 */
const getStrFullLength = (str = '') => str.split('').reduce((pre, cur);

/**
 * 截取字符串,根据 maxLength 截取后返回
 * @param {*} str
 * @param {*} maxLength
 */
const cutStrByFullLength = (str = '', maxLength);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379