util.js 9.6 KB

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