sh-tools 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sh-tools",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "基于xe-ajax和xe-utils二次封装",
5
5
  "main": "packages/index.js",
6
6
  "scripts": {
@@ -1,84 +1,84 @@
1
- import XEAjax from 'xe-ajax'
2
- import Notice from '../components/sh-notification'
3
-
4
- class HttpRequest {
5
- constructor(options = {}) {
6
- this.instance = XEAjax
7
- this.options = options
8
- this.setOptions(options)
9
- this.interceptors()
10
- }
11
- setOptions(options) {
12
- this.instance.setup(options)
13
- }
14
- // 继承类重写方法 用于处理个性化业务 预留
15
- setRequest(request) {}
16
- setResponse(response) {}
17
- request(options) {
18
- return this.instance.ajax(options)
19
- }
20
- get(url, params, options) {
21
- return this.instance.get(url, params, options)
22
- }
23
- post(url, params, options) {
24
- return this.instance.post(url, params, options)
25
- }
26
- put(url, params, options) {
27
- return this.instance.put(url, params, options)
28
- }
29
- delete(url, params, options) {
30
- return this.instance.delete(url, params, options)
31
- }
32
- patch(url, params, options) {
33
- return this.instance.patch(url, params, options)
34
- }
35
- head(url, params, options) {
36
- return this.instance.head(url, params, options)
37
- }
38
- jsonp(url, params, options) {
39
- return this.instance.jsonp(url, params, options)
40
- }
41
- // 拦截器
42
- interceptors() {
43
- // 请求拦截
44
- this.instance.interceptors.request.use((request, next) => {
45
- this.setRequest(request)
46
- next()
47
- })
48
- // 响应拦截
49
- this.instance.interceptors.response.use((response, next) => {
50
- this.responseNext(response, next)
51
- })
52
- }
53
- // 错误处理
54
- async responseNext(response, next) {
55
- const { status, statusText, headers } = response
56
- let resBody = null
57
- try {
58
- resBody = await response.json()
59
- } catch (e) {
60
- resBody = response.__response || {}
61
- }
62
- let errorMsg = resBody.error || resBody.msg || resBody.message || resBody.result || statusText || '系统错误'
63
- switch (status) {
64
- case 0:
65
- Notice.error({ title: '请求错误', content: errorMsg })
66
- break
67
- case 200:
68
- break
69
- case 401:
70
- Notice.error({ title: '系统提示 401', content: '未授权,请重新登录' })
71
- return
72
- case 504:
73
- Notice.error({ title: '系统提示 网络超时', content: errorMsg })
74
- break
75
- default:
76
- Notice.error({ title: `系统提示 ${status}`, content: errorMsg })
77
- break
78
- }
79
- this.setResponse(resBody)
80
- next({ status: 200, body: resBody })
81
- }
82
- }
83
-
84
- export default HttpRequest
1
+ import XEAjax from 'xe-ajax'
2
+ import Notice from '../components/sh-notification'
3
+
4
+ class HttpRequest {
5
+ constructor(options = {}) {
6
+ this.instance = XEAjax
7
+ this.options = options
8
+ this.setOptions(options)
9
+ this.interceptors()
10
+ }
11
+ setOptions(options) {
12
+ this.instance.setup(options)
13
+ }
14
+ // 继承类重写方法 用于处理个性化业务 预留
15
+ setRequest(request) {}
16
+ async setResponse(body, response, status) {
17
+ return { status: 200, body }
18
+ }
19
+ request(options) {
20
+ return this.instance.ajax(options)
21
+ }
22
+ get(url, params, options) {
23
+ return this.instance.get(url, params, options)
24
+ }
25
+ post(url, params, options) {
26
+ return this.instance.post(url, params, options)
27
+ }
28
+ put(url, params, options) {
29
+ return this.instance.put(url, params, options)
30
+ }
31
+ delete(url, params, options) {
32
+ return this.instance.delete(url, params, options)
33
+ }
34
+ patch(url, params, options) {
35
+ return this.instance.patch(url, params, options)
36
+ }
37
+ head(url, params, options) {
38
+ return this.instance.head(url, params, options)
39
+ }
40
+ jsonp(url, params, options) {
41
+ return this.instance.jsonp(url, params, options)
42
+ }
43
+ // 拦截器
44
+ interceptors() {
45
+ // 请求拦截
46
+ this.instance.interceptors.request.use((request, next) => {
47
+ this.setRequest(request)
48
+ next()
49
+ })
50
+ // 响应拦截
51
+ this.instance.interceptors.response.use((response, next) => {
52
+ this.responseNext(response, next)
53
+ })
54
+ }
55
+ // 错误处理
56
+ async responseNext(response, next) {
57
+ const { status, statusText, headers } = response
58
+ let resBody = null
59
+ try {
60
+ resBody = await response.json()
61
+ } catch (e) {
62
+ resBody = response._response || {}
63
+ }
64
+ let errorMsg = resBody.error || resBody.msg || resBody.message || resBody.result || statusText || '系统错误'
65
+ switch (status) {
66
+ case 0:
67
+ Notice.error({ title: '请求错误', content: errorMsg })
68
+ break
69
+ case 401:
70
+ Notice.error({ title: '系统提示 401', content: '未授权,请重新登录' })
71
+ return
72
+ case 504:
73
+ Notice.error({ title: '系统提示 网络超时', content: errorMsg })
74
+ break
75
+ default:
76
+ Notice.error({ title: `系统提示 ${status}`, content: errorMsg })
77
+ break
78
+ }
79
+ let nextBody = await this.setResponse(resBody, response, status)
80
+ next(nextBody)
81
+ }
82
+ }
83
+
84
+ export default HttpRequest
@@ -1,313 +1,257 @@
1
- import XEUtils from 'xe-utils'
2
-
3
- export default {
4
- toDateDiffText(date) {
5
- let currDate = 1544407800000 // '2018-12-10 10:10:00'
6
- let dateDiff = XEUtils.getDateDiff(date, currDate)
7
- if (dateDiff.done) {
8
- if (dateDiff.time < 31536000000) {
9
- if (dateDiff.time < 2592000000) {
10
- if (dateDiff.time < 86400000) {
11
- if (dateDiff.time < 360000) {
12
- if (dateDiff.time < 60000) {
13
- if (dateDiff.time < 10000) {
14
- return '刚刚'
15
- }
16
- return `${dateDiff.ss}秒之前`
17
- }
18
- return `${dateDiff.mm}分钟之前`
19
- }
20
- return `${dateDiff.HH}小时之前`
21
- }
22
- return `${dateDiff.dd}天之前`
23
- }
24
- return `${dateDiff.MM}个月之前`
25
- }
26
- return `${dateDiff.yyyy}年之前`
27
- }
28
- return '错误类型'
29
- },
30
- ioToFile(io, fileName = 'download', type = 'blob') {
31
- return new Promise((resolve, reject) => {
32
- try {
33
- if ('download' in document.createElement('a')) {
34
- // 非IE下载
35
- const elink = document.createElement('a')
36
- const url = window.URL || window.webkitURL || window.moxURL
37
- elink.style.display = 'none'
38
- elink.href = url.createObjectURL(io)
39
- elink.download = fileName
40
- elink.click()
41
- url.revokeObjectURL(elink.href)
42
- } else {
43
- // IE10+下载
44
- navigator.msSaveBlob(io, fileName)
45
- }
46
- resolve()
47
- } catch (e) {
48
- reject(e)
49
- }
50
- })
51
- },
52
- // 数字金额转大写
53
- toMoneyChies(val, option = {}) {
54
- let { upcase = true } = option
55
- //汉字的数字
56
- var cnNums = upcase ? ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'] : ['零', '一', '二', '三', '四', '伍', '六', '七', '八', '九']
57
- //基本单位
58
- var cnIntRadice = ['', '拾', '佰', '仟']
59
- //对应整数部分扩展单位
60
- var cnIntUnits = ['', '万', '亿', '兆']
61
- //对应小数部分单位
62
- var cnDecUnits = ['角', '分', '毫', '厘']
63
- //整数金额时后面跟的字符
64
- var cnInteger = '整'
65
- //整型完以后的单位
66
- var cnIntLast = '元'
67
- //最大处理的数字
68
- var maxNum = 999999999999999.9999
69
- //金额整数部分
70
- var integerNum
71
- //金额小数部分
72
- var decimalNum
73
- //输出的中文金额字符串
74
- var chineseStr = ''
75
- //分离金额后用的数组,预定义
76
- var parts
77
- if (val === '') return val
78
- val = parseFloat(val)
79
- if (val >= maxNum) {
80
- //超出最大处理数字
81
- return ''
82
- }
83
- if (val === 0) {
84
- chineseStr = cnNums[0] + cnIntLast + cnInteger
85
- return chineseStr
86
- }
87
- //转换为字符串
88
- val = val.toString()
89
- if (val.indexOf('.') === -1) {
90
- integerNum = val
91
- decimalNum = ''
92
- } else {
93
- parts = val.split('.')
94
- integerNum = parts[0]
95
- decimalNum = parts[1].substr(0, 4)
96
- }
97
- //获取整型部分转换
98
- if (parseInt(integerNum, 10) > 0) {
99
- var zeroCount = 0
100
- var IntLen = integerNum.length
101
- for (let i = 0; i < IntLen; i++) {
102
- let n = integerNum.substr(i, 1)
103
- var p = IntLen - i - 1
104
- var q = p / 4
105
- var m = p % 4
106
- if (n === '0') {
107
- zeroCount++
108
- } else {
109
- if (zeroCount > 0) {
110
- chineseStr += cnNums[0]
111
- }
112
- //归零
113
- zeroCount = 0
114
- chineseStr += cnNums[parseInt(n)] + cnIntRadice[m]
115
- }
116
- if (m === 0 && zeroCount < 4) {
117
- chineseStr += cnIntUnits[q]
118
- }
119
- }
120
- chineseStr += cnIntLast
121
- }
122
- //小数部分
123
- if (decimalNum !== '') {
124
- var decLen = decimalNum.length
125
- for (var i = 0; i < decLen; i++) {
126
- var n = decimalNum.substr(i, 1)
127
- if (n !== '0') {
128
- chineseStr += cnNums[Number(n)] + cnDecUnits[i]
129
- }
130
- }
131
- }
132
- if (chineseStr === '') {
133
- chineseStr += cnNums[0] + cnIntLast + cnInteger
134
- } else if (decimalNum === '') {
135
- chineseStr += cnInteger
136
- }
137
- return chineseStr
138
- },
139
- // 补全金额位数,返回字符串
140
- formatMoneyPad(value) {
141
- //基本单位
142
- let cnIntRadice = ['亿', '千', '百', '十', '万', '千', '百', '十', '元']
143
- // 小数单位
144
- let cnDecUnits = ['角', '分', '毫', '厘']
145
- let intValue = String(value).split('.')[0] || ''
146
- let decValue = String(value).split('.')[1] || ''
147
- let intFixed = intValue.padStart(cnIntRadice.length, ' ')
148
- let decFixed = decValue.padEnd(cnDecUnits.length, '0')
149
- return intFixed + '.' + decFixed
150
- },
151
- // 封装 系统内对渲染器格式化方法
152
- formatRender(value, key, rowData, renderName, renderProps, renderContext, editable) {
153
- // editable: 是否对返回值进行修正 默认 否
154
- let rvalue, rtext, rname, iscross
155
- let { $vUtils, $vxePluginNames, rform } = renderContext
156
- let { min, max, formula, digits, type, multiple, split, options, format, nodeKey, moneyUnit, commafy, openValue, openLabel, closeValue, closeLabel, bill } = renderProps
157
- let defaultDateFormat = {
158
- date: 'yyyy-MM-dd',
159
- time: 'HH:mm:ss',
160
- datetime: 'yyyy-MM-dd HH:mm:ss',
161
- month: 'yyyy-MM',
162
- week: 'yyyy-MM-dd',
163
- year: 'yyyy'
164
- }
165
- if (renderName === '$vRowCell') {
166
- let field = rowData[key + 'field'] || key
167
- rname = rowData[field + 'RenderName'] || '$vInput'
168
- } else {
169
- rname = renderName
170
- }
171
- switch (rname) {
172
- case '$vInput':
173
- if (formula) {
174
- value = $vUtils.calculate(formula, rowData)
175
- }
176
- if (editable && ['integer', 'number', 'float'].includes(type) && !$vUtils.isNone(value)) {
177
- if ($vUtils.isNumber(+max) && +value > +max) {
178
- value = +max
179
- iscross = true
180
- } else if ($vUtils.isNumber(+min) && +value < +min) {
181
- value = +min
182
- iscross = true
183
- }
184
- }
185
- switch (type) {
186
- case 'integer':
187
- rvalue = value || value === 0 ? $vUtils.toInteger(value) : ''
188
- break
189
- case 'number':
190
- case 'float':
191
- rvalue = value || value === 0 ? $vUtils.truncate(value, digits) : ''
192
- break
193
- default:
194
- rvalue = value
195
- break
196
- }
197
- rvalue = $vUtils.replaceNutrim(rvalue)
198
- rtext = rvalue
199
- break
200
- case '$vTime':
201
- format = format ? format.replace('YYYY', 'yyyy').replace('DD', 'dd').replace('hh', 'HH') : defaultDateFormat[type]
202
- if ($vUtils.isNumber(value)) value = String(value)
203
- rvalue = format ? (value ? $vUtils.toDateString(value, format) : '') : value
204
- rvalue = $vUtils.replaceNutrim(rvalue)
205
- if ($vUtils.isDate(value)) $vUtils.set(rowData, key, rvalue)
206
- rtext = rvalue
207
- break
208
- case '$vTextArea':
209
- case '$vCheckbox':
210
- case '$vRadio':
211
- case '$vHref':
212
- rvalue = $vUtils.replaceNutrim(value)
213
- rtext = rvalue
214
- break
215
- case '$vSelect':
216
- if (multiple) {
217
- let oriArray = Array.isArray(value) ? value : value ? value.split(split).filter(_ => _ && _ !== 'undefined') : []
218
- let rns = oriArray.map(orv => {
219
- return options.find(opt => String(opt.value) === String(orv)).label || ''
220
- })
221
- rtext = rns.join(split)
222
- rvalue = oriArray
223
- } else {
224
- let optionObj = options.find(_ => String(_.value) === String(value))
225
- rtext = optionObj ? optionObj.label : ''
226
- rvalue = value
227
- }
228
- break
229
- case '$vTree':
230
- let prefixKey = key.endsWith('Id') ? String(key).replace('Id', '') : key
231
- if (multiple) {
232
- let oriArray = Array.isArray(value) ? value : value ? value.split(split).filter(_ => _ && _ !== 'undefined') : []
233
- if (options && options.length > 0) {
234
- let rns = oriArray.map(orv => options.find(opt => String(opt[nodeKey]) === String(orv)).label || '')
235
- rtext = rns.join(split)
236
- }
237
- rvalue = oriArray
238
- } else {
239
- if (options && options.length > 0) {
240
- let optionObj = options.find(opt => String(opt[nodeKey]) === String(value))
241
- rtext = optionObj ? optionObj.label : ''
242
- }
243
- rvalue = value ? [value] : []
244
- }
245
- if (format) {
246
- let dataformat = format.replace(/@/gi, prefixKey)
247
- rtext = $vUtils.format(dataformat, rowData)
248
- }
249
- break
250
- case '$vProgress':
251
- rvalue = value || value === 0 ? $vUtils.truncate(value, digits) : ''
252
- rtext = rvalue
253
- break
254
- case '$vSwitch':
255
- rvalue = $vUtils.replaceNutrim(value)
256
- if (String(rvalue) === openValue) {
257
- rtext = openLabel
258
- } else if (String(rvalue) === closeValue) {
259
- rtext = closeLabel
260
- }
261
- break
262
- case '$vMoney':
263
- if (formula) {
264
- value = $vUtils.calculate(formula, rowData)
265
- }
266
- if (editable && !$vUtils.isNone(value)) {
267
- if ($vUtils.isNumber(+max) && +value > +max) {
268
- value = +max
269
- iscross = true
270
- } else if ($vUtils.isNumber(+min) && +value < +min) {
271
- value = +min
272
- iscross = true
273
- }
274
- }
275
- rvalue = value || value === 0 ? (type !== 'integer' ? $vUtils.truncate(value, digits) : $vUtils.toInteger(value)) : ''
276
- rvalue = $vUtils.replaceNutrim(rvalue)
277
- rtext = rvalue !== '' ? $vUtils.truncate($vUtils.divide(rvalue, moneyUnit), digits) : ''
278
- if (commafy && !bill && bill !== '0') rtext = $vUtils.commafy(rtext, { digits })
279
- break
280
- case '$vCheckgroup':
281
- let oriArray = Array.isArray(value) ? value : value ? value.split(split).filter(_ => _ && _ !== 'undefined') : []
282
- let rns = oriArray.map(orv => {
283
- return options.find(opt => String(opt.value) === String(orv)).label || ''
284
- })
285
- rtext = rns.join(split)
286
- rvalue = oriArray
287
- break
288
- case '$vRadiogroup':
289
- let optionObj = options.find(_ => String(_.value) === String(value))
290
- rtext = optionObj ? optionObj.label : ''
291
- rvalue = value
292
- break
293
- case '$vUpload':
294
- rvalue = Array.isArray(value) ? value : value.split(split).filter(_ => _ && _ !== 'undefined')
295
- break
296
- case '$vCode':
297
- rvalue = value
298
- rtext = value
299
- break
300
- default:
301
- rvalue = value
302
- rtext = value
303
- break
304
- }
305
- if (formula) {
306
- $vUtils.set(rowData, key, rvalue)
307
- }
308
- // if (!rform && $vxePluginNames.expendRenders && $vxePluginNames.expendRenders.includes(renderName)) {
309
- // $vUtils.set(rowData, `${key}${$vxePluginNames.expendName}`, rtext)
310
- // }
311
- return { rvalue, rtext }
312
- }
313
- }
1
+ import XEUtils from 'xe-utils'
2
+
3
+ export default {
4
+ toDateDiffText(date) {
5
+ let currDate = 1544407800000 // '2018-12-10 10:10:00'
6
+ let dateDiff = XEUtils.getDateDiff(date, currDate)
7
+ if (dateDiff.done) {
8
+ if (dateDiff.time < 31536000000) {
9
+ if (dateDiff.time < 2592000000) {
10
+ if (dateDiff.time < 86400000) {
11
+ if (dateDiff.time < 360000) {
12
+ if (dateDiff.time < 60000) {
13
+ if (dateDiff.time < 10000) {
14
+ return '刚刚'
15
+ }
16
+ return `${dateDiff.ss}秒之前`
17
+ }
18
+ return `${dateDiff.mm}分钟之前`
19
+ }
20
+ return `${dateDiff.HH}小时之前`
21
+ }
22
+ return `${dateDiff.dd}天之前`
23
+ }
24
+ return `${dateDiff.MM}个月之前`
25
+ }
26
+ return `${dateDiff.yyyy}年之前`
27
+ }
28
+ return '错误类型'
29
+ },
30
+ ioToFile(io, fileName = 'download', type = 'blob') {
31
+ return new Promise((resolve, reject) => {
32
+ try {
33
+ if ('download' in document.createElement('a')) {
34
+ // 非IE下载
35
+ const elink = document.createElement('a')
36
+ const url = window.URL || window.webkitURL || window.moxURL
37
+ elink.style.display = 'none'
38
+ elink.href = url.createObjectURL(io)
39
+ elink.download = fileName
40
+ elink.click()
41
+ url.revokeObjectURL(elink.href)
42
+ } else {
43
+ // IE10+下载
44
+ navigator.msSaveBlob(io, fileName)
45
+ }
46
+ resolve()
47
+ } catch (e) {
48
+ reject(e)
49
+ }
50
+ })
51
+ },
52
+ // 数字金额转大写
53
+ toMoneyChies(val, option = {}) {
54
+ let { upcase = true } = option
55
+ //汉字的数字
56
+ var cnNums = upcase ? ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'] : ['零', '一', '二', '三', '四', '伍', '六', '七', '八', '九']
57
+ //基本单位
58
+ var cnIntRadice = ['', '拾', '佰', '仟']
59
+ //对应整数部分扩展单位
60
+ var cnIntUnits = ['', '万', '亿', '兆']
61
+ //对应小数部分单位
62
+ var cnDecUnits = ['角', '分', '毫', '厘']
63
+ //整数金额时后面跟的字符
64
+ var cnInteger = '整'
65
+ //整型完以后的单位
66
+ var cnIntLast = '元'
67
+ //最大处理的数字
68
+ var maxNum = 999999999999999.9999
69
+ //金额整数部分
70
+ var integerNum
71
+ //金额小数部分
72
+ var decimalNum
73
+ //输出的中文金额字符串
74
+ var chineseStr = ''
75
+ //分离金额后用的数组,预定义
76
+ var parts
77
+ if (val === '') return val
78
+ val = parseFloat(val)
79
+ if (val >= maxNum) {
80
+ //超出最大处理数字
81
+ return ''
82
+ }
83
+ if (val === 0) {
84
+ chineseStr = cnNums[0] + cnIntLast + cnInteger
85
+ return chineseStr
86
+ }
87
+ //转换为字符串
88
+ val = val.toString()
89
+ if (val.indexOf('.') === -1) {
90
+ integerNum = val
91
+ decimalNum = ''
92
+ } else {
93
+ parts = val.split('.')
94
+ integerNum = parts[0]
95
+ decimalNum = parts[1].substr(0, 4)
96
+ }
97
+ //获取整型部分转换
98
+ if (parseInt(integerNum, 10) > 0) {
99
+ var zeroCount = 0
100
+ var IntLen = integerNum.length
101
+ for (let i = 0; i < IntLen; i++) {
102
+ let n = integerNum.substr(i, 1)
103
+ var p = IntLen - i - 1
104
+ var q = p / 4
105
+ var m = p % 4
106
+ if (n === '0') {
107
+ zeroCount++
108
+ } else {
109
+ if (zeroCount > 0) {
110
+ chineseStr += cnNums[0]
111
+ }
112
+ //归零
113
+ zeroCount = 0
114
+ chineseStr += cnNums[parseInt(n)] + cnIntRadice[m]
115
+ }
116
+ if (m === 0 && zeroCount < 4) {
117
+ chineseStr += cnIntUnits[q]
118
+ }
119
+ }
120
+ chineseStr += cnIntLast
121
+ }
122
+ //小数部分
123
+ if (decimalNum !== '') {
124
+ var decLen = decimalNum.length
125
+ for (var i = 0; i < decLen; i++) {
126
+ var n = decimalNum.substr(i, 1)
127
+ if (n !== '0') {
128
+ chineseStr += cnNums[Number(n)] + cnDecUnits[i]
129
+ }
130
+ }
131
+ }
132
+ if (chineseStr === '') {
133
+ chineseStr += cnNums[0] + cnIntLast + cnInteger
134
+ } else if (decimalNum === '') {
135
+ chineseStr += cnInteger
136
+ }
137
+ return chineseStr
138
+ },
139
+ // 补全金额位数,返回字符串
140
+ formatMoneyPad(value) {
141
+ //基本单位
142
+ let cnIntRadice = ['亿', '千', '百', '十', '万', '千', '百', '十', '元']
143
+ // 小数单位
144
+ let cnDecUnits = ['角', '分', '毫', '厘']
145
+ let intValue = String(value).split('.')[0] || ''
146
+ let decValue = String(value).split('.')[1] || ''
147
+ let intFixed = intValue.padStart(cnIntRadice.length, ' ')
148
+ let decFixed = decValue.padEnd(cnDecUnits.length, '0')
149
+ return intFixed + '.' + decFixed
150
+ },
151
+ // 封装 系统内对渲染器格式化方法
152
+ formatRender(value, key, rowData, renderName, renderProps, renderContext, editable) {
153
+ // editable: 是否对返回值进行修正 默认 否
154
+ let rvalue, rtext, rname
155
+ let { $vUtils, $vxePluginNames } = renderContext
156
+ let { min, max, formula, digits, type, multiple, split, options, format, nodeKey, labelField, moneyUnit, commafy, openValue, openLabel, closeValue, closeLabel, bill } = renderProps
157
+ let defaultDateFormat = {
158
+ date: 'yyyy-MM-dd',
159
+ time: 'HH:mm:ss',
160
+ datetime: 'yyyy-MM-dd HH:mm:ss',
161
+ month: 'yyyy-MM',
162
+ week: 'yyyy-MM-dd',
163
+ year: 'yyyy'
164
+ }
165
+ if (renderName === '$vRowCell') {
166
+ let field = rowData[key + 'field'] || key
167
+ rname = rowData[field + 'RenderName'] || '$vInput'
168
+ } else {
169
+ rname = renderName
170
+ }
171
+ // 对于多选获取数组类型值进行解析 赋值
172
+ let oriArray = []
173
+ // 进行默认赋值 若没有任何解析原数返回
174
+ rvalue = value
175
+ // 首先提取公式进行公式计算
176
+ if (formula) value = $vUtils.calculate(formula, rowData)
177
+ // 自定渲染器进行解析与重新赋值
178
+ switch (rname) {
179
+ case '$vInput':
180
+ case '$vMoney':
181
+ if (editable && (type === '$vMoney' || ['integer', 'number', 'float'].includes(type)) && !$vUtils.isNone(value)) {
182
+ if ($vUtils.isNumber(+max) && +value > +max) {
183
+ value = +max
184
+ } else if ($vUtils.isNumber(+min) && +value < +min) {
185
+ value = +min
186
+ }
187
+ }
188
+ if (!$vUtils.isNone(value) && ['integer'].includes(type)) {
189
+ rvalue = $vUtils.toInteger(value)
190
+ } else if (!$vUtils.isNone(value) && ['number', 'float'].includes(type)) {
191
+ rvalue = $vUtils.truncate(value, digits)
192
+ }
193
+ if ($vUtils.isString(rvalue)) rvalue = $vUtils.replaceNutrim(rvalue)
194
+ if (type === '$vMoney' && !$vUtils.isNone(rvalue)) {
195
+ rtext = $vUtils.truncate($vUtils.divide(rvalue, moneyUnit), digits)
196
+ }
197
+ if (commafy && !bill && bill !== '0') rtext = $vUtils.commafy(rtext, { digits })
198
+ break
199
+ case '$vTime':
200
+ format = format ? format.replace('YYYY', 'yyyy').replace('DD', 'dd').replace('hh', 'HH') : defaultDateFormat[type]
201
+ if (!$vUtils.isNone(value) && format) rvalue = $vUtils.toDateString(value, format)
202
+ if ($vUtils.isDate(value)) $vUtils.set(rowData, key, rvalue)
203
+ break
204
+ case '$vSelect':
205
+ case '$vCheckgroup':
206
+ case '$vRadiogroup':
207
+ case '$vUpload':
208
+ case '$vTree':
209
+ let prefixKey = key.endsWith('Id') ? String(key).replace('Id', '') : key
210
+ let isMutiple = multiple || ['$vCheckgroup', '$vUpload'].includes(type)
211
+ let optionValue = 'value'
212
+ let optionLabel = 'label'
213
+ if (type === '$vTree') {
214
+ optionValue = nodeKey
215
+ if (labelField) optionLabel = labelField
216
+ }
217
+ if (isMutiple) {
218
+ if (Array.isArray(value)) {
219
+ oriArray = value
220
+ } else if (!$vUtils.isNone(value)) {
221
+ oriArray = String(value)
222
+ .split(split)
223
+ .filter(_ => _ && _ !== 'undefined')
224
+ }
225
+ if (options && options.length) {
226
+ let rns = oriArray.map(orv => options.find(option => $vUtils.isEqual(option[optionValue], orv))[optionLabel] || '')
227
+ rtext = rns.join(split)
228
+ }
229
+ rvalue = oriArray
230
+ } else {
231
+ rtext = options.find(opt => $vUtils.isEqual(opt[optionValue], value))[optionLabel] || ''
232
+ rvalue = type === '$vTree' ? (value ? [value] : []) : value
233
+ }
234
+ if (format) {
235
+ let dataformat = format.replace(/@/gi, prefixKey)
236
+ rtext = $vUtils.format(dataformat, rowData)
237
+ }
238
+ break
239
+ case '$vProgress':
240
+ if (!$vUtils.isNone(value)) rvalue = $vUtils.truncate(value, digits)
241
+ break
242
+ case '$vSwitch':
243
+ if ($vUtils.isEqual(value, openValue)) {
244
+ rtext = openLabel
245
+ } else if ($vUtils.isEqual(value, closeValue)) {
246
+ rtext = closeLabel
247
+ }
248
+ break
249
+ }
250
+ if ($vUtils.isString(rvalue)) rvalue = $vUtils.replaceNutrim(rvalue)
251
+ if (formula) {
252
+ $vUtils.set(rowData, key, rvalue)
253
+ }
254
+ rtext = rtext || rvalue
255
+ return { rvalue, rtext }
256
+ }
257
+ }