util.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485
  1. import axios from 'axios'
  2. import FileSaver from 'file-saver'
  3. import { getToken } from '@/utils/auth'
  4. export function dateFormat2(format, date) {
  5. if (typeof date === 'string') {
  6. date = new Date(date);
  7. }
  8. const we = date.getDay(); // 星期
  9. const qut = Math.floor((date.getMonth() + 3) / 3).toString(); // 季度
  10. const opt = {
  11. 'Y+': date.getFullYear().toString(), // 年
  12. 'm+': (date.getMonth() + 1).toString(), // 月(月份从0开始,要+1)
  13. 'd+': date.getDate().toString(), // 日
  14. 'H+': date.getHours().toString(), // 时
  15. 'M+': date.getMinutes().toString(), // 分
  16. 'S+': date.getSeconds().toString(), // 秒
  17. 'q+': qut, // 季度
  18. };
  19. const week = {
  20. // 中文数字 (星期)
  21. 0: '日',
  22. 1: '一',
  23. 2: '二',
  24. 3: '三',
  25. 4: '四',
  26. 5: '五',
  27. 6: '六',
  28. };
  29. const quarter = {
  30. // 中文数字(季度)
  31. 1: '一',
  32. 2: '二',
  33. 3: '三',
  34. 4: '四',
  35. };
  36. if (/(W+)/.test(format)) {
  37. format = format.replace(
  38. RegExp.$1,
  39. RegExp.$1.length > 1
  40. ? RegExp.$1.length > 2
  41. ? '星期' + week[we]
  42. : '周' + week[we]
  43. : week[we]
  44. );
  45. }
  46. if (/(Q+)/.test(format)) {
  47. // 输入一个Q,只输出一个中文数字,输入4个Q,则拼接上字符串
  48. format = format.replace(
  49. RegExp.$1,
  50. RegExp.$1.length === 4 ? '第' + quarter[qut] + '季度' : quarter[qut]
  51. );
  52. }
  53. for (const k in opt) {
  54. const r = new RegExp('(' + k + ')').exec(format);
  55. if (r) {
  56. // 若输入的长度不为1,则前面补零
  57. format = format.replace(
  58. r[1],
  59. RegExp.$1.length === 1 ? opt[k] : opt[k].padStart(RegExp.$1.length, '0')
  60. );
  61. }
  62. }
  63. return format;
  64. }
  65. // 定义一个函数将树形数据转换为列表
  66. export function treeToList(tree, key = "children", list = []) {
  67. // 将当前节点添加到列表中
  68. list.push(...tree);
  69. // 遍历当前节点的子节点
  70. tree?.forEach(item => {
  71. if (item?.[key]?.length) {
  72. // 递归调用,将子节点及其后代节点添加到列表中
  73. treeToList(item?.[key], key, list);
  74. }
  75. });
  76. return list;
  77. }
  78. /**
  79. * 删除对象中的空值
  80. * @param {object} obj
  81. * @returns {Object}
  82. */
  83. export function deleteEmptyObj(obj) {
  84. let newObj = obj;
  85. for (var key in newObj) {
  86. if (newObj[key] === '' || newObj[key] === null || newObj[key] === undefined) {
  87. delete newObj[key]
  88. }
  89. }
  90. return newObj;
  91. }
  92. /**
  93. *
  94. * @param {*} array 要查询的数组
  95. * @param {*} attr 要查询的字段
  96. * @param {*} val 要查询的字段值
  97. * @returns
  98. */
  99. export function findElem(array, attr, val) {
  100. if (!array || !array.length) {
  101. return -1
  102. }
  103. for (var i = 0; i < array.length; i++) {
  104. if (array[i][attr] == val) {
  105. return i; //返回当前索引值
  106. }
  107. }
  108. return -1;
  109. }
  110. /**
  111. * 生成带参数的链接
  112. * @param {String} url
  113. * @param {Object} params
  114. * @returns
  115. */
  116. export function createParamsUrl(url, params) {
  117. if (typeof url === 'undefined' || url == null || url == '') {
  118. return ''
  119. }
  120. if (typeof params === 'undefined' || params == null || typeof params !== 'object') {
  121. return ''
  122. }
  123. url += url.indexOf('?') != -1 ? '' : '?'
  124. for (var k in params) {
  125. url += (url.indexOf('=') != -1 ? '&' : '') + k + '=' + encodeURI(params[k])
  126. }
  127. return url
  128. }
  129. /**
  130. * 导出功能
  131. * @param {*} obj
  132. * @returns
  133. */
  134. export function downloadFiles(url, params = {}) {
  135. params['x-token'] = getToken()
  136. const newParams = deleteEmptyObj(params)
  137. const newUrl = createParamsUrl(url, newParams)
  138. console.log(process.env.VUE_APP_BASE_API + newUrl)
  139. window.open(process.env.VUE_APP_BASE_API + newUrl)
  140. }
  141. export function downloadFiles2(url, params = {}, name) {
  142. const newParams = deleteEmptyObj(params)
  143. const newUrl = createParamsUrl(url, newParams)
  144. axios({
  145. url: process.env.VUE_APP_BASE_API + newUrl,
  146. method: 'get',
  147. responseType: 'blob',
  148. headers: {
  149. 'x-token': getToken()
  150. }
  151. }).then(res => {
  152. var blob = new Blob([res.data], {
  153. type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=utf-8'
  154. })
  155. var filename = name + '.xlsx'
  156. var downloadElement = document.createElement('a')
  157. var href = window.URL.createObjectURL(blob) // 创建下载的链接
  158. downloadElement.style.display = 'none'
  159. downloadElement.href = href
  160. downloadElement.download = filename // 下载后文件名
  161. document.body.appendChild(downloadElement)
  162. downloadElement.click() // 点击下载
  163. document.body.removeChild(downloadElement) // 下载完成移除元素
  164. window.URL.revokeObjectURL(href) // 释放掉blob对象
  165. })
  166. // params['x-token'] = getToken()
  167. // const newParams = deleteEmptyObj(params)
  168. // const newUrl = createParamsUrl(url, newParams)
  169. // console.log(process.env.VUE_APP_BASE_API + newUrl)
  170. // window.open(process.env.VUE_APP_BASE_API + newUrl)
  171. }
  172. /**
  173. * 导入功能
  174. * @param {*} url
  175. * @param {*} formData
  176. */
  177. export async function handleImport(url, formData) {
  178. const Result = await new Promise((resolve, reject) => {
  179. axios
  180. .post(
  181. process.env.VUE_APP_BASE_API + url,
  182. formData,
  183. {
  184. headers: {
  185. 'Content-Type': 'multipart/form-data',
  186. 'x-token': getToken()
  187. }
  188. }
  189. )
  190. .then(res => {
  191. resolve(res.data)
  192. })
  193. .catch(err => {
  194. reject(err)
  195. })
  196. })
  197. return Result
  198. }
  199. /**
  200. * 导入有返回二进制文件
  201. * @param {*} url
  202. * @param {*} formData
  203. */
  204. export async function handleImportTwo(url, formData) {
  205. const Result = await new Promise((resolve, reject) => {
  206. axios
  207. .post(
  208. process.env.VUE_APP_BASE_API + url,
  209. formData,
  210. {
  211. responseType: 'arraybuffer',
  212. headers: {
  213. 'Content-Type': 'multipart/form-data',
  214. 'x-token': getToken()
  215. }
  216. }
  217. )
  218. .then(res => {
  219. resolve(res.data)
  220. })
  221. .catch(err => {
  222. reject(err)
  223. })
  224. })
  225. return Result
  226. }
  227. /**
  228. * 重置时间格式
  229. * @param {*} date
  230. * @param {*} type
  231. */
  232. export function resetDateFormat(date, type) {
  233. let newDate = ''
  234. if (!date) {
  235. return ''
  236. }
  237. // type=1: yyyy-MM-dd 转 yyyy-MM-dd HH:mm:ss
  238. if (type == 1 || !type) {
  239. newDate = date + ' 00:00:00'
  240. }
  241. }
  242. /**
  243. * 若文档中已有命名dateFormat,可用dFormat()调用
  244. * 年(Y) 可用1-4个占位符
  245. * 月(m)、日(d)、小时(H)、分(M)、秒(S) 可用1-2个占位符
  246. * 星期(W) 可用1-3个占位符
  247. * 季度(q为阿拉伯数字,Q为中文数字)可用1或4个占位符
  248. *
  249. * let date = new Date()
  250. * dateFormat("YYYY-mm-dd HH:MM:SS", date) 2020-02-09 14:04:23
  251. * dateFormat("YYYY-mm-dd HH:MM:SS Q", date) 2020-02-09 14:09:03 一
  252. * dateFormat("YYYY-mm-dd HH:MM:SS WWW", date) 2020-02-09 14:45:12 星期日
  253. * dateFormat("YYYY-mm-dd HH:MM:SS QQQQ", date) 2020-02-09 14:09:36 第一季度
  254. * dateFormat("YYYY-mm-dd HH:MM:SS WWW QQQQ", date) 2020-02-09 14:46:12 星期日 第一季度
  255. */
  256. export function dateFormat(format, date) {
  257. const we = date.getDay() // 星期
  258. const qut = Math.floor((date.getMonth() + 3) / 3).toString() // 季度
  259. const opt = {
  260. 'Y+': date.getFullYear().toString(), // 年
  261. 'm+': (date.getMonth() + 1).toString(), // 月(月份从0开始,要+1)
  262. 'd+': date.getDate().toString(), // 日
  263. 'H+': date.getHours().toString(), // 时
  264. 'M+': date.getMinutes().toString(), // 分
  265. 'S+': date.getSeconds().toString(), // 秒
  266. 'q+': qut // 季度
  267. }
  268. const week = {
  269. // 中文数字 (星期)
  270. 0: '日',
  271. 1: '一',
  272. 2: '二',
  273. 3: '三',
  274. 4: '四',
  275. 5: '五',
  276. 6: '六'
  277. }
  278. const quarter = {
  279. // 中文数字(季度)
  280. 1: '一',
  281. 2: '二',
  282. 3: '三',
  283. 4: '四'
  284. }
  285. if (/(W+)/.test(format)) {
  286. format = format.replace(
  287. RegExp.$1,
  288. RegExp.$1.length > 1 ? (RegExp.$1.length > 2 ? '星期' + week[we] : '周' + week[we]) : week[we]
  289. )
  290. }
  291. if (/(Q+)/.test(format)) {
  292. // 输入一个Q,只输出一个中文数字,输入4个Q,则拼接上字符串
  293. format = format.replace(RegExp.$1, RegExp.$1.length == 4 ? '第' + quarter[qut] + '季度' : quarter[qut])
  294. }
  295. for (const k in opt) {
  296. const r = new RegExp('(' + k + ')').exec(format)
  297. if (r) {
  298. // 若输入的长度不为1,则前面补零
  299. format = format.replace(r[1], RegExp.$1.length == 1 ? opt[k] : opt[k].padStart(RegExp.$1.length, '0'))
  300. }
  301. }
  302. return format
  303. }
  304. /**
  305. * @param url {string} pdf地址
  306. * @param fileName {string} pdf名称
  307. */
  308. export function downloadPdf(url, fileName) {
  309. axios({
  310. method: 'get',
  311. url,
  312. responseType: 'blob'
  313. }).then(res => {
  314. const file = new Blob([res.data], {
  315. type: 'application/pdf'
  316. })
  317. FileSaver(file, fileName)
  318. })
  319. }
  320. export function changeNumberMoneyToChinese(money) {
  321. // 接收数字或者字符串数字
  322. if (typeof money === 'string') {
  323. if (money === '') return ''
  324. if (isNaN(parseFloat(money))) {
  325. throw Error(`参数有误:${money},请输入数字或字符串数字`)
  326. } else {
  327. // 去掉分隔符(,)
  328. money = money.replace(/,/g, '')
  329. }
  330. } else if (typeof money === 'number') {
  331. // 去掉分隔符(,)
  332. money = money.toString().replace(/,/g, '')
  333. } else {
  334. throw Error(`参数有误:${money},请输入数字或字符串数字`)
  335. }
  336. // 汉字的数字
  337. const cnNums = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']
  338. // 基本单位
  339. const cnIntRadice = ['', '拾', '佰', '仟']
  340. // 对应整数部分扩展单位
  341. const cnIntUnits = ['', '万', '亿', '兆']
  342. // 对应小数部分单位
  343. const cnDecUnits = ['角', '分', '毫', '厘']
  344. // 整数金额时后面跟的字符
  345. const cnInteger = '整'
  346. // 整型完以后的单位
  347. const cnIntLast = '元'
  348. // 金额整数部分
  349. let IntegerNum
  350. // 金额小数部分
  351. let DecimalNum
  352. // 输出的中文金额字符串
  353. let ChineseStr = ''
  354. // 正负值标记
  355. let Symbol = ''
  356. // 转成浮点数
  357. money = parseFloat(money)
  358. // 如果是0直接返回结果
  359. if (money === 0) {
  360. ChineseStr = cnNums[0] + cnIntLast + cnInteger
  361. return ChineseStr
  362. }
  363. // 如果小于0,则将Symbol标记为负,并转为正数
  364. if (money < 0) {
  365. money = -money
  366. Symbol = '负 '
  367. }
  368. // 转换为字符串
  369. money = money.toString()
  370. // 将整数部分和小数部分分别存入IntegerNum和DecimalNum
  371. if (money.indexOf('.') === -1) {
  372. IntegerNum = money
  373. DecimalNum = ''
  374. } else {
  375. const moneyArr = money.split('.')
  376. IntegerNum = moneyArr[0]
  377. DecimalNum = moneyArr[1].substr(0, 4)
  378. }
  379. // 获取整型部分转换
  380. if (parseInt(IntegerNum, 10) > 0) {
  381. let zeroCount = 0
  382. let IntLen = IntegerNum.length
  383. for (let i = 0; i < IntLen; i++) {
  384. // 获取整数的每一项
  385. let term = IntegerNum.substr(i, 1)
  386. // 剩余待处理的数量
  387. let surplus = IntLen - i - 1
  388. // 用于获取整数部分的扩展单位
  389. // 剩余数量除以4,比如12345,term为1时,expandUnit则为1,
  390. // cnIntUnits[expandUnit]对应得到的单位为万
  391. let expandUnit = surplus / 4
  392. // 用于获取整数部分的基本单位
  393. // 剩余数量取余4,比如123,那么第一遍遍历term为1,surplus为2,baseUnit则为2,
  394. // 所以cnIntRadice[baseUnit]对应得到的基本单位为'佰'
  395. let baseUnit = surplus % 4
  396. if (term === '0') {
  397. zeroCount++
  398. } else {
  399. // 连续存在多个0的时候需要补'零'
  400. if (zeroCount > 0) {
  401. ChineseStr += cnNums[0]
  402. }
  403. // 归零
  404. zeroCount = 0
  405. /*
  406. cnNums是汉字的零到玖组成的数组,term则是阿拉伯0-9,
  407. 直接将阿拉伯数字作为下标获取中文数字
  408. 例如term是0则cnNums[parseInt(term)]取的就是'零',9取的就是'玖'
  409. 最后加上单位就转换成功了!
  410. 这里只加十百千的单位
  411. */
  412. ChineseStr += cnNums[parseInt(term)] + cnIntRadice[baseUnit]
  413. }
  414. /*
  415. 如果baseUnit为0,意味着当前项和下一项隔了一个节权位即隔了一个逗号
  416. 扩展单位只有大单位进阶才需要,判断是否大单位进阶,则通过zeroCount判断
  417. baseUnit === 0即存在逗号,baseUnit === 0 && zeroCount < 4 意为大单位进阶
  418. */
  419. if (baseUnit === 0 && zeroCount < 4) {
  420. ChineseStr += cnIntUnits[expandUnit]
  421. }
  422. }
  423. ChineseStr += cnIntLast
  424. }
  425. // 小数部分转换
  426. if (DecimalNum !== '') {
  427. let decLen = DecimalNum.length
  428. for (let i = 0; i < decLen; i++) {
  429. // 同理,参考整数部分
  430. let term = DecimalNum.substr(i, 1)
  431. if (term !== '0') {
  432. ChineseStr += cnNums[Number(term)] + cnDecUnits[i]
  433. }
  434. }
  435. }
  436. ChineseStr = Symbol + ChineseStr
  437. return ChineseStr
  438. }
  439. // 区分单击事件和双击事件
  440. export function clickBG(millisecond) {
  441. this.timer = null
  442. this.click = callback => {
  443. clearTimeout(this.timer)
  444. this.timer = setTimeout(function () {
  445. clearTimeout(this.timer)
  446. callback && callback()
  447. }, millisecond)
  448. }
  449. this.dblClick = callback => {
  450. clearTimeout(this.timer)
  451. callback && callback()
  452. }
  453. }
  454. // 获取地址栏参数
  455. export function getUrlParam() {
  456. let getqyinfo = window.location.href.split('?')[1] || ''
  457. let getqys = getqyinfo.split('&')
  458. let obj = {} //创建空对象,接收截取的参数
  459. for (let i = 0; i < getqys.length; i++) {
  460. let item = getqys[i].split('=')
  461. let key = item[0]
  462. let value = item[1]
  463. obj[key] = value
  464. }
  465. return obj
  466. }