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 +1 -1
- package/packages/api/index.js +84 -84
- package/packages/utils/other.js +257 -313
package/package.json
CHANGED
package/packages/api/index.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
resBody = response.
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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(
|
|
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
|
package/packages/utils/other.js
CHANGED
|
@@ -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
|
|
155
|
-
let { $vUtils, $vxePluginNames
|
|
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
|
-
|
|
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
|
-
if ($vUtils.
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
case '$
|
|
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
|
-
if (
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
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
|
+
}
|