util.js 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. import axios from 'axios'
  2. import FileSaver from 'file-saver'
  3. import { getToken } from '@/utils/auth'
  4. /**
  5. * 删除对象中的空值
  6. * @param {object} obj
  7. * @returns {Object}
  8. */
  9. export function deleteEmptyObj(obj) {
  10. const newObj = obj
  11. for (var key in newObj) {
  12. if (newObj[key] === '' || newObj[key] === null || newObj[key] === undefined) {
  13. delete newObj[key]
  14. }
  15. }
  16. return newObj
  17. }
  18. /**
  19. *
  20. * @param {*} array 要查询的数组
  21. * @param {*} attr 要查询的字段
  22. * @param {*} val 要查询的字段值
  23. * @returns
  24. */
  25. export function findElem(array, attr, val) {
  26. for (var i = 0; i < array.length; i++) {
  27. if (array[i][attr] == val) {
  28. return i // 返回当前索引值
  29. }
  30. }
  31. return -1
  32. }
  33. /**
  34. * 生成带参数的链接
  35. * @param {String} url
  36. * @param {Object} params
  37. * @returns
  38. */
  39. export function createParamsUrl(url, params) {
  40. if (typeof url === 'undefined' || url == null || url == '') {
  41. return ''
  42. }
  43. if (typeof params === 'undefined' || params == null || typeof params !== 'object') {
  44. return ''
  45. }
  46. url += url.indexOf('?') != -1 ? '' : '?'
  47. for (var k in params) {
  48. url += (url.indexOf('=') != -1 ? '&' : '') + k + '=' + encodeURI(params[k])
  49. }
  50. return url
  51. }
  52. /**
  53. * 导出功能
  54. * @param {*} obj
  55. * @returns
  56. */
  57. export function downloadFiles(url, params = {}) {
  58. params.token = getToken()
  59. const newParams = deleteEmptyObj(params)
  60. const newUrl = createParamsUrl(url, newParams)
  61. console.log(process.env.VUE_APP_BASE_API + newUrl)
  62. window.open(process.env.VUE_APP_BASE_API + newUrl)
  63. }
  64. /**
  65. * 导入功能
  66. * @param {*} url
  67. * @param {*} formData
  68. */
  69. export async function handleImport(url, formData) {
  70. const Result = await new Promise((resolve, reject) => {
  71. axios
  72. .post(
  73. process.env.VUE_APP_BASE_API + url,
  74. formData,
  75. {
  76. headers: {
  77. 'Content-Type': 'multipart/form-data',
  78. 'x-token': getToken()
  79. }
  80. }
  81. )
  82. .then(res => {
  83. resolve(res.data)
  84. })
  85. .catch(err => {
  86. reject(err)
  87. })
  88. })
  89. return Result
  90. }
  91. /**
  92. * 导入有返回二进制文件
  93. * @param {*} url
  94. * @param {*} formData
  95. */
  96. export async function handleImportTwo(url, formData) {
  97. const Result = await new Promise((resolve, reject) => {
  98. axios
  99. .post(
  100. process.env.VUE_APP_BASE_API + url,
  101. formData,
  102. {
  103. responseType: 'arraybuffer',
  104. headers: {
  105. 'Content-Type': 'multipart/form-data',
  106. 'x-token': getToken()
  107. }
  108. }
  109. )
  110. .then(res => {
  111. resolve(res.data)
  112. })
  113. .catch(err => {
  114. reject(err)
  115. })
  116. })
  117. return Result
  118. }
  119. /**
  120. * 重置时间格式
  121. * @param {*} date
  122. * @param {*} type
  123. */
  124. export function resetDateFormat(date, type) {
  125. let newDate = ''
  126. if (!date) {
  127. return ''
  128. }
  129. // type=1: yyyy-MM-dd 转 yyyy-MM-dd HH:mm:ss
  130. if (type == 1 || !type) {
  131. newDate = date + ' 00:00:00'
  132. }
  133. }
  134. /**
  135. * 若文档中已有命名dateFormat,可用dFormat()调用
  136. * 年(Y) 可用1-4个占位符
  137. * 月(m)、日(d)、小时(H)、分(M)、秒(S) 可用1-2个占位符
  138. * 星期(W) 可用1-3个占位符
  139. * 季度(q为阿拉伯数字,Q为中文数字)可用1或4个占位符
  140. *
  141. * let date = new Date()
  142. * dateFormat("YYYY-mm-dd HH:MM:SS", date) 2020-02-09 14:04:23
  143. * dateFormat("YYYY-mm-dd HH:MM:SS Q", date) 2020-02-09 14:09:03 一
  144. * dateFormat("YYYY-mm-dd HH:MM:SS WWW", date) 2020-02-09 14:45:12 星期日
  145. * dateFormat("YYYY-mm-dd HH:MM:SS QQQQ", date) 2020-02-09 14:09:36 第一季度
  146. * dateFormat("YYYY-mm-dd HH:MM:SS WWW QQQQ", date) 2020-02-09 14:46:12 星期日 第一季度
  147. */
  148. export function dateFormat(format, date) {
  149. const we = date.getDay() // 星期
  150. const qut = Math.floor((date.getMonth() + 3) / 3).toString() // 季度
  151. const opt = {
  152. 'Y+': date.getFullYear().toString(), // 年
  153. 'm+': (date.getMonth() + 1).toString(), // 月(月份从0开始,要+1)
  154. 'd+': date.getDate().toString(), // 日
  155. 'H+': date.getHours().toString(), // 时
  156. 'M+': date.getMinutes().toString(), // 分
  157. 'S+': date.getSeconds().toString(), // 秒
  158. 'q+': qut // 季度
  159. }
  160. const week = {
  161. // 中文数字 (星期)
  162. 0: '日',
  163. 1: '一',
  164. 2: '二',
  165. 3: '三',
  166. 4: '四',
  167. 5: '五',
  168. 6: '六'
  169. }
  170. const quarter = {
  171. // 中文数字(季度)
  172. 1: '一',
  173. 2: '二',
  174. 3: '三',
  175. 4: '四'
  176. }
  177. if (/(W+)/.test(format)) {
  178. format = format.replace(
  179. RegExp.$1,
  180. RegExp.$1.length > 1 ? (RegExp.$1.length > 2 ? '星期' + week[we] : '周' + week[we]) : week[we]
  181. )
  182. }
  183. if (/(Q+)/.test(format)) {
  184. // 输入一个Q,只输出一个中文数字,输入4个Q,则拼接上字符串
  185. format = format.replace(RegExp.$1, RegExp.$1.length == 4 ? '第' + quarter[qut] + '季度' : quarter[qut])
  186. }
  187. for (const k in opt) {
  188. const r = new RegExp('(' + k + ')').exec(format)
  189. if (r) {
  190. // 若输入的长度不为1,则前面补零
  191. format = format.replace(r[1], RegExp.$1.length == 1 ? opt[k] : opt[k].padStart(RegExp.$1.length, '0'))
  192. }
  193. }
  194. return format
  195. }
  196. /**
  197. * @param url {string} pdf地址
  198. * @param fileName {string} pdf名称
  199. */
  200. export function downloadPdf(url, fileName) {
  201. axios({
  202. method: 'get',
  203. url,
  204. responseType: 'blob'
  205. }).then(res => {
  206. const file = new Blob([res.data], {
  207. type: 'application/pdf'
  208. })
  209. FileSaver(file, fileName)
  210. })
  211. }
  212. export function changeNumberMoneyToChinese(money) {
  213. // 接收数字或者字符串数字
  214. if (typeof money === 'string') {
  215. if (money === '') return ''
  216. if (isNaN(parseFloat(money))) {
  217. throw Error(`参数有误:${money},请输入数字或字符串数字`)
  218. } else {
  219. // 去掉分隔符(,)
  220. money = money.replace(/,/g, '')
  221. }
  222. } else if (typeof money === 'number') {
  223. // 去掉分隔符(,)
  224. money = money.toString().replace(/,/g, '')
  225. } else {
  226. throw Error(`参数有误:${money},请输入数字或字符串数字`)
  227. }
  228. // 汉字的数字
  229. const cnNums = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']
  230. // 基本单位
  231. const cnIntRadice = ['', '拾', '佰', '仟']
  232. // 对应整数部分扩展单位
  233. const cnIntUnits = ['', '万', '亿', '兆']
  234. // 对应小数部分单位
  235. const cnDecUnits = ['角', '分', '毫', '厘']
  236. // 整数金额时后面跟的字符
  237. const cnInteger = '整'
  238. // 整型完以后的单位
  239. const cnIntLast = '元'
  240. // 金额整数部分
  241. let IntegerNum
  242. // 金额小数部分
  243. let DecimalNum
  244. // 输出的中文金额字符串
  245. let ChineseStr = ''
  246. // 正负值标记
  247. let Symbol = ''
  248. // 转成浮点数
  249. money = parseFloat(money)
  250. // 如果是0直接返回结果
  251. if (money === 0) {
  252. ChineseStr = cnNums[0] + cnIntLast + cnInteger
  253. return ChineseStr
  254. }
  255. // 如果小于0,则将Symbol标记为负,并转为正数
  256. if (money < 0) {
  257. money = -money
  258. Symbol = '负 '
  259. }
  260. // 转换为字符串
  261. money = money.toString()
  262. // 将整数部分和小数部分分别存入IntegerNum和DecimalNum
  263. if (money.indexOf('.') === -1) {
  264. IntegerNum = money
  265. DecimalNum = ''
  266. } else {
  267. const moneyArr = money.split('.')
  268. IntegerNum = moneyArr[0]
  269. DecimalNum = moneyArr[1].substr(0, 4)
  270. }
  271. // 获取整型部分转换
  272. if (parseInt(IntegerNum, 10) > 0) {
  273. let zeroCount = 0
  274. let IntLen = IntegerNum.length
  275. for (let i = 0; i < IntLen; i++) {
  276. // 获取整数的每一项
  277. let term = IntegerNum.substr(i, 1)
  278. // 剩余待处理的数量
  279. let surplus = IntLen - i - 1
  280. // 用于获取整数部分的扩展单位
  281. // 剩余数量除以4,比如12345,term为1时,expandUnit则为1,
  282. // cnIntUnits[expandUnit]对应得到的单位为万
  283. let expandUnit = surplus / 4
  284. // 用于获取整数部分的基本单位
  285. // 剩余数量取余4,比如123,那么第一遍遍历term为1,surplus为2,baseUnit则为2,
  286. // 所以cnIntRadice[baseUnit]对应得到的基本单位为'佰'
  287. let baseUnit = surplus % 4
  288. if (term === '0') {
  289. zeroCount++
  290. } else {
  291. // 连续存在多个0的时候需要补'零'
  292. if (zeroCount > 0) {
  293. ChineseStr += cnNums[0]
  294. }
  295. // 归零
  296. zeroCount = 0
  297. /*
  298. cnNums是汉字的零到玖组成的数组,term则是阿拉伯0-9,
  299. 直接将阿拉伯数字作为下标获取中文数字
  300. 例如term是0则cnNums[parseInt(term)]取的就是'零',9取的就是'玖'
  301. 最后加上单位就转换成功了!
  302. 这里只加十百千的单位
  303. */
  304. ChineseStr += cnNums[parseInt(term)] + cnIntRadice[baseUnit]
  305. }
  306. /*
  307. 如果baseUnit为0,意味着当前项和下一项隔了一个节权位即隔了一个逗号
  308. 扩展单位只有大单位进阶才需要,判断是否大单位进阶,则通过zeroCount判断
  309. baseUnit === 0即存在逗号,baseUnit === 0 && zeroCount < 4 意为大单位进阶
  310. */
  311. if (baseUnit === 0 && zeroCount < 4) {
  312. ChineseStr += cnIntUnits[expandUnit]
  313. }
  314. }
  315. ChineseStr += cnIntLast
  316. }
  317. // 小数部分转换
  318. if (DecimalNum !== '') {
  319. let decLen = DecimalNum.length
  320. for (let i = 0; i < decLen; i++) {
  321. // 同理,参考整数部分
  322. let term = DecimalNum.substr(i, 1)
  323. if (term !== '0') {
  324. ChineseStr += cnNums[Number(term)] + cnDecUnits[i]
  325. }
  326. }
  327. }
  328. ChineseStr = Symbol + ChineseStr
  329. return ChineseStr
  330. }