util.js 11 KB

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