util.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596
  1. import moment from "moment";
  2. import {
  3. post,
  4. get
  5. } from "@/utils/request";
  6. import Cookies from "js-cookie";
  7. import html2Canvas from "html2canvas";
  8. import JsPDF from "jspdf";
  9. import * as toEnglish from "./ACapital.js";
  10. import {
  11. ElMessage,
  12. ElMessageBox
  13. } from 'element-plus'
  14. import useUserStore from '@/store/modules/user'
  15. // businessIdList 业务id列表 dataSource 数据源 att 要对应的属性 fileAtt 要赋值的属性 filePathAtt 取第一张图片的属性
  16. export function getFile(businessIdList, dataSource, att = 'id', fileAtt = 'fileList', filePathAtt = '') {
  17. if (businessIdList && businessIdList.length > 0 && dataSource && dataSource.length > 0) {
  18. post("/fileInfo/getList", {
  19. businessIdList,
  20. }).then((res) => {
  21. for (let i = 0; i < dataSource.length; i++) {
  22. const ele = dataSource[i];
  23. for (const key in res) {
  24. if (ele[att] == key && res[key] && res[key].length > 0) {
  25. ele[fileAtt] = res[key]
  26. if (filePathAtt) {
  27. ele[filePathAtt] = res[key][0].fileUrl
  28. }
  29. }
  30. }
  31. }
  32. });
  33. }
  34. return false
  35. }
  36. // businessIdList 业务id列表 data 数据源 att 要对应的属性 businessType取业务类型的数据 fileAtt 要赋值的属性 filePathAtt 取第一张图片的属性
  37. export function getFileData(option = {}) {
  38. return new Promise((resolve) => {
  39. let {
  40. businessIdList,
  41. data,
  42. att = 'id',
  43. businessType = '',
  44. fileAtt = "fileList",
  45. filePathAtt = 'imageUrl',
  46. getAll = false
  47. } = option
  48. if (businessIdList && businessIdList.length > 0) {
  49. if (getAll) {
  50. resolve(post("/fileInfo/getList", {
  51. businessIdList,
  52. }))
  53. return
  54. } else {
  55. post("/fileInfo/getList", {
  56. businessIdList,
  57. }).then((res) => {
  58. if (data && data.length > 0) {
  59. for (let i = 0; i < data.length; i++) {
  60. const ele = data[i];
  61. for (const key in res) {
  62. if (ele[att] == key && res[key] && res[key].length > 0) {
  63. let list = []
  64. if (businessType) {
  65. list = res[key].filter((x) => x.businessType == businessType)
  66. } else {
  67. list = res[key]
  68. }
  69. ele[fileAtt] = list
  70. if (filePathAtt) {
  71. ele[filePathAtt] = list[0].fileUrl
  72. }
  73. }
  74. }
  75. }
  76. }
  77. });
  78. }
  79. }
  80. })
  81. }
  82. export function openImg(fileUrl) {
  83. if (fileUrl) {
  84. window.open(fileUrl, "_blank");
  85. }
  86. }
  87. export function isCurrentCompanyData(companyId) {
  88. const currentCompanyId = useUserStore().user.companyId
  89. if (companyId && (currentCompanyId == companyId)) {
  90. return true
  91. } else {
  92. return false
  93. }
  94. }
  95. //根据dictKey值回显字典label值
  96. export function dictKeyValue(value, arr) {
  97. if ((value || value == 0) && arr) {
  98. value = value + "";
  99. const current = arr.find((x) => x.dictKey == value);
  100. if (current != undefined && current.dictValue) {
  101. return current.dictValue;
  102. }
  103. return "";
  104. }
  105. return "";
  106. }
  107. //根据value值回显字典label值
  108. export function dictValueLabel(value, arr) {
  109. if ((value || value === 0) && arr) {
  110. const current = arr.filter((x) => x.value == value);
  111. if (current && current.length > 0) {
  112. return current[0].label;
  113. }
  114. return "";
  115. }
  116. return "";
  117. }
  118. export function getDict(key) {
  119. return new Promise((resolve, reject) => {
  120. let dictObj = {};
  121. let arr = {};
  122. let num = 0;
  123. for (let i = 0; i < key.length; i++) {
  124. const element = key[i];
  125. if (dictObj[element]) {
  126. arr[element] = dictObj[element];
  127. num++;
  128. if (num === key.length) {
  129. resolve(arr);
  130. }
  131. } else {
  132. post("/dictTenantData/page", {
  133. pageNum: 1,
  134. pageSize: 999,
  135. tenantId: Cookies.get("tenantId"),
  136. dictCode: element,
  137. }).then((res) => {
  138. dictObj[element] = res.rows;
  139. arr[element] = res.rows;
  140. sessionStorage.setItem("dict", JSON.stringify(dictObj));
  141. num++;
  142. if (num === key.length) {
  143. resolve(arr);
  144. }
  145. });
  146. }
  147. }
  148. });
  149. }
  150. export function getDictOne(key) {
  151. return new Promise((resolve, reject) => {
  152. let dictObj = {};
  153. let arr = {};
  154. let num = 0;
  155. for (let i = 0; i < key.length; i++) {
  156. const element = key[i];
  157. if (dictObj[element]) {
  158. arr[element] = dictObj[element];
  159. num++;
  160. if (num === key.length) {
  161. resolve(arr);
  162. }
  163. } else {
  164. post("/tenantDict/getDict", {
  165. dictCode: element,
  166. }).then((res) => {
  167. dictObj[element] = res;
  168. arr[element] = res;
  169. num++;
  170. if (num === key.length) {
  171. resolve(arr);
  172. }
  173. });
  174. }
  175. }
  176. });
  177. }
  178. // 金额千分符
  179. export function moneyFormat(s, n) {
  180. if (s) {
  181. s = s + "";
  182. let str = s.slice(0, 1);
  183. if (str === "-") {
  184. s = s.slice(1, s.length);
  185. }
  186. n = n > 0 && n <= 20 ? n : 2;
  187. s = parseFloat((s + "").replace(/[^\d\.-]/g, "")).toFixed(n) + "";
  188. var l = s.split(".")[0].split("").reverse(),
  189. r = s.split(".")[1];
  190. var t = "";
  191. for (let i = 0; i < l.length; i++) {
  192. t += l[i] + ((i + 1) % 3 == 0 && i + 1 != l.length ? "," : "");
  193. }
  194. let result = t.split("").reverse().join("") + "." + r;
  195. if (str === "-") {
  196. return "-" + result;
  197. } else {
  198. return result;
  199. }
  200. } else {
  201. return "0.00";
  202. }
  203. }
  204. // 计算该日期是星期几
  205. export function calculationWeek(val, format) {
  206. let weekArrayList = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
  207. let index = new Date(moment(val, format).format("yyyy-MM-DD")).getDay();
  208. let week = weekArrayList[index];
  209. return week;
  210. }
  211. export function getPdf(title) {
  212. // pdfDom 这个就是你vue页面中定义的ID 比如<div id="pdfDom"> 这个也要避下雷
  213. const element = document.getElementById("pdfDom");
  214. window.pageYoffset = 0;
  215. document.documentElement.scrollTop = 0;
  216. document.body.scrollTop = 0;
  217. setTimeout(() => {
  218. // const nowDate = new Date();
  219. // const date = {
  220. // year: nowDate.getFullYear(),
  221. // month: nowDate.getMonth() + 1,
  222. // date: nowDate.getDate(),
  223. // hours: nowDate.getHours(),
  224. // minutes: nowDate.getMinutes(),
  225. // seconds: nowDate.getSeconds(),
  226. // };
  227. // const newMonth = date.month > 10 ? date.month : "0" + date.month;
  228. // const newDay = date.date > 10 ? date.date : "0" + date.date;
  229. // const newMinutes = date.minutes < 10 ? "0" + date.minutes : date.minutes;
  230. // const newSeconds = date.seconds < 10 ? "0" + date.seconds : date.seconds;
  231. // const value = date.year + newMonth + newDay + date.hours + newMinutes + newSeconds;
  232. let id = "";
  233. //创建一个画布 --- 增加导出的pdf水印 !!
  234. let can = document.createElement("canvas");
  235. //设置画布的长宽
  236. can.width = 400;
  237. can.height = 500;
  238. let cans = can.getContext("2d");
  239. //旋转角度
  240. cans.rotate((-15 * Math.PI) / 180);
  241. cans.font = "18px Vedana";
  242. //设置填充绘画的颜色、渐变或者模式
  243. cans.fillStyle = "rgba(200, 200, 200, 0.40)";
  244. //设置文本内容的当前对齐方式
  245. cans.textAlign = "left";
  246. //设置在绘制文本时使用的当前文本基线
  247. cans.textBaseline = "Middle";
  248. //在画布上绘制填色的文本(输出的文本,开始绘制文本的X坐标位置,开始绘制文本的Y坐标位置)
  249. //cans.fillText(value, can.width / 8, can.height / 2)
  250. let div = document.createElement("div");
  251. div.id = id;
  252. div.style.pointerEvents = "none";
  253. div.style.top = "2000px";
  254. div.style.left = "-2000px";
  255. div.style.position = "fixed";
  256. div.style.zIndex = "100000";
  257. div.style.width = document.getElementById("pdfDom").scrollHeight + "px";
  258. div.style.height = document.getElementById("pdfDom").scrollHeight + "px";
  259. div.style.background = "url(" + can.toDataURL("image/png") + ") left top repeat";
  260. document.getElementById("pdfDom").appendChild(div); // 到页面中
  261. html2Canvas(element, {
  262. allowTaint: true,
  263. useCORS: true, // 需要注意,element的 高度 宽度一定要在这里定义一下,不然会存在只下载了当前你能看到的页面 避雷避雷!!!
  264. scale: 2, // 提升画面质量,但是会增加文件大小
  265. height: document.getElementById("pdfDom").scrollHeight,
  266. windowHeight: document.getElementById("pdfDom").scrollHeight,
  267. }).then(function (canvas) {
  268. var contentWidth = canvas.width;
  269. var contentHeight = canvas.height;
  270. // 一页pdf显示html页面生成的canvas高度;
  271. var pageHeight = (contentWidth * 841.89) / 592.28;
  272. // 未生成pdf的html页面高度
  273. var leftHeight = contentHeight;
  274. // 页面偏移
  275. var position = 0;
  276. // a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
  277. var imgWidth = 595.28;
  278. var imgHeight = (592.28 / contentWidth) * contentHeight;
  279. var pageData = canvas.toDataURL("image/jpeg", 1.0);
  280. var pdf = new JsPDF("", "pt", "a4");
  281. // 有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
  282. // 当内容未超过pdf一页显示的范围,无需分页
  283. if (leftHeight < pageHeight) {
  284. pdf.addImage(pageData, "JPEG", 0, 0, imgWidth, imgHeight);
  285. } else {
  286. while (leftHeight > 0) {
  287. pdf.addImage(pageData, "JPEG", 0, position, imgWidth, imgHeight);
  288. leftHeight -= pageHeight;
  289. position -= 841.89;
  290. // 避免添加空白页
  291. if (leftHeight > 0) {
  292. pdf.addPage();
  293. }
  294. }
  295. }
  296. pdf.save(title + ".pdf");
  297. });
  298. }, 1000);
  299. }
  300. export function getPdfTransverseA4(title) {
  301. html2Canvas(document.getElementById("pdfDom"), {
  302. // allowTaint: true,
  303. // taintTest: false,
  304. // logging: false,
  305. // useCORS: true,
  306. // dpi: window.devicePixelRatio * 2, // 将分辨率提高到特定的DPI 提高四倍
  307. // scale: 2, // 按比例增加分辨率
  308. allowTaint: true,
  309. useCORS: true, // 需要注意,element的 高度 宽度一定要在这里定义一下,不然会存在只下载了当前你能看到的页面 避雷避雷!!!
  310. scale: 4, // 提升画面质量,但是会增加文件大小
  311. height: document.getElementById("pdfDom").scrollHeight,
  312. windowHeight: document.getElementById("pdfDom").scrollHeight,
  313. }).then((canvas) => {
  314. // eslint-disable-next-line new-cap
  315. var pdf = new JsPDF("l", "mm", "a4"); // A3纸,横向
  316. // var pdf = new JsPDF('p', 'mm', 'a4') // A4纸,纵向
  317. var ctx = canvas.getContext("2d");
  318. // A4大小,210mm x 297mm,四边各保留10mm的边距,显示区域190x277
  319. // var a4w = 190;
  320. // var a4h = 277
  321. // A3大小,279mm x 420mm,四边各保留10mm的边距,显示区域259x400
  322. // var a4w = 259;
  323. // var a4h = 400;
  324. var a4w = 210;
  325. var a4h = 297;
  326. // var imgHeight = Math.floor(a4h * canvas.width / a4w) // 按A4显示比例换算一页图像的像素高度[这个计算方式应该是纵向]
  327. var imgHeight = Math.floor((a4w * canvas.width) / a4h); // 按A4显示比例换算一页图像的像素高度[这个是横向打印的计算方法]
  328. var renderedHeight = 0;
  329. while (renderedHeight < canvas.height) {
  330. var page = document.createElement("canvas");
  331. page.width = canvas.width;
  332. page.height = Math.min(imgHeight, canvas.height - renderedHeight); // 可能内容不足一页
  333. // 用getImageData剪裁指定区域,并画到前面创建的canvas对象中
  334. page.getContext("2d").putImageData(ctx.getImageData(0, renderedHeight, canvas.width, Math.min(imgHeight, canvas.height - renderedHeight)), 0, 0);
  335. // 添加图像到页面,保留10mm边距 [a4使用]
  336. // pdf.addImage(page.toDataURL('image/jpeg', 1.0), 'JPEG', 10, 10, a4w, Math.min(a4h, a4w * page.height / page.width))
  337. // 添加图像到页面,保留10mm边距[a3使用1.414换算比例]
  338. // pdf.addImage(page.toDataURL("image/jpeg", 1.0), "JPEG", 10, 10, a4w * 1.414, Math.min(a4h, (a4w * page.height) / page.width) * 1.414);
  339. pdf.addImage(page.toDataURL("image/jpeg", 1.0), "JPEG", 0, 0, a4w * 1.414, Math.min(a4h, (a4w * page.height) / page.width) * 1.414);
  340. renderedHeight += imgHeight;
  341. if (renderedHeight < canvas.height) {
  342. pdf.addPage(); // 如果后面还有内容,添加一个空页
  343. }
  344. }
  345. // 保存文件
  346. pdf.save(title + ".pdf");
  347. });
  348. }
  349. export function currencyPrefix(key) {
  350. return "SAY " + key + " ";
  351. }
  352. // 金额英文写法
  353. export function translateIntoEnglish(money, currencyType) {
  354. let text = "";
  355. if (money) {
  356. text = currencyPrefix(currencyType);
  357. if (!/^\d+$/.test(Number(money))) {
  358. text = text + parseFloat(money).toFixed(2).toEnglish().toUpperCase();
  359. } else {
  360. text = text + parseFloat(money).toFixed(2).toEnglish().toUpperCase() + " ONLY";
  361. }
  362. }
  363. text = text.split(" POINT ZERO ZERO ").join("");
  364. return text;
  365. }
  366. // 随机数
  367. export function random() {
  368. let $chars = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678";
  369. let maxPos = $chars.length;
  370. let random = "";
  371. for (let i = 0; i < 32; i++) {
  372. random += $chars.charAt(Math.floor(Math.random() * maxPos));
  373. }
  374. return random;
  375. }
  376. // 深拷贝
  377. export function checkType(target) {
  378. return Object.prototype.toString.call(target).slice(8, -1);
  379. }
  380. export function deepClone(data) {
  381. const obj = checkType(data) === "Array" ? [] : {};
  382. let arr = ["Object", "Array"];
  383. if (arr.includes(checkType(data))) {
  384. for (let key in data) {
  385. let value = data[key];
  386. //value为简单类型,直接赋值
  387. if (!arr.includes(checkType(value))) {
  388. obj[key] = value;
  389. } else {
  390. // 定义一个映射,初始化时,将data本身加入映射中
  391. const map = new WeakMap();
  392. // 如果拷贝的是复杂数据类型第一次拷贝后存入map
  393. // 第二次再遇到该值时,直接赋值为null,结束递归
  394. map.set(data, true);
  395. if (map.has(value)) {
  396. obj[key] = null;
  397. } else {
  398. map.set(value, true);
  399. obj[key] = deepClone(value);
  400. }
  401. }
  402. }
  403. } else {
  404. return data;
  405. }
  406. return obj;
  407. }
  408. // 计算时间间隔
  409. export function timeInterval(smallTime, largeTime) {
  410. //一般前端使用的时间分隔符是"-",需要替换成"/"
  411. let large = new Date(largeTime.replace("-", "/").replace("-", "/"));
  412. let small = new Date(smallTime.replace("-", "/").replace("-", "/"));
  413. if (large > small) {
  414. let date3 = large.getTime() - new Date(small).getTime(); //时间差的毫秒数
  415. //计算出相差天数
  416. let days = Math.floor(date3 / (24 * 3600 * 1000));
  417. //计算出小时数
  418. let leave1 = date3 % (24 * 3600 * 1000); //计算天数后剩余的毫秒数
  419. let hours = Math.floor(leave1 / (3600 * 1000));
  420. //计算相差分钟数
  421. let leave2 = leave1 % (3600 * 1000); //计算小时数后剩余的毫秒数
  422. let minutes = Math.floor(leave2 / (60 * 1000));
  423. //计算相差秒数
  424. let leave3 = leave2 % (60 * 1000); //计算分钟数后剩余的毫秒数
  425. let seconds = Math.round(leave3 / 1000);
  426. return {
  427. days: days,
  428. hours: hours,
  429. minutes: minutes,
  430. seconds: seconds,
  431. };
  432. }
  433. return {
  434. days: 0,
  435. hours: 0,
  436. minutes: 0,
  437. seconds: 0,
  438. };
  439. }
  440. // 比较时间大小
  441. export function compareTime(date1, date2) {
  442. var oDate1 = new Date(date1);
  443. var oDate2 = new Date(date2);
  444. if (oDate1.getTime() > oDate2.getTime()) {
  445. return true; //第一个大
  446. } else {
  447. return false; //第二个大
  448. }
  449. }
  450. export function toDx(n) {
  451. //阿拉伯数字转换函数
  452. switch (n) {
  453. case "0":
  454. return "零";
  455. case "1":
  456. return "壹";
  457. case "2":
  458. return "贰";
  459. case "3":
  460. return "叁";
  461. case "4":
  462. return "肆";
  463. case "5":
  464. return "伍";
  465. case "6":
  466. return "陆";
  467. case "7":
  468. return "柒";
  469. case "8":
  470. return "捌";
  471. case "9":
  472. return "玖";
  473. }
  474. }
  475. // 金额转大写
  476. export function NumberToChinese(m) {
  477. let unit = ["仟", "佰", "拾", "", "仟", "佰", "拾", "", "角", "分", "厘"];
  478. m *= 1000;
  479. m = Number(parseFloat(m).toFixed(0));
  480. m += "";
  481. var x = m.length;
  482. var result = "";
  483. for (var i = 0; i < x; i++) {
  484. if (i == 3) {
  485. result = "元" + result;
  486. } else if (i == 7) {
  487. result = "万" + result;
  488. }
  489. if (m.charAt(x - i - 1) == 0) {
  490. if (i != 0 && i != 1 && i != 2) {
  491. if (result.charAt(0) != "零" && result.charAt(0) != "元" && result.charAt(0) != "万") {
  492. result = "零" + result;
  493. }
  494. }
  495. continue;
  496. }
  497. result = toDx(m.charAt(x - i - 1)) + unit[unit.length - i - 1] + result;
  498. }
  499. result += result.charAt(result.length - 1) == "元" ? "整" : "";
  500. return result;
  501. }
  502. // 图片url转base64
  503. export function getImgBase64(url) {
  504. return new Promise((resolve, reject) => {
  505. let Img = new Image(),
  506. dataURL = "";
  507. Img.setAttribute("crossOrigin", "Anonymous");
  508. Img.src = url + "?v=" + Math.random();
  509. Img.onload = function () {
  510. let canvas = document.createElement("canvas"),
  511. width = Img.width,
  512. height = Img.height;
  513. canvas.width = width;
  514. canvas.height = height;
  515. canvas.getContext("2d").drawImage(Img, 0, 0, width, height);
  516. dataURL = canvas.toDataURL("image/png");
  517. resolve(dataURL);
  518. };
  519. Img.onerror = function () {
  520. reject("图片加载失败");
  521. };
  522. });
  523. };
  524. export function downloadFile(fileStream, fileName) {
  525. // 创建 Blob 对象
  526. const blob = new Blob([fileStream]);
  527. // 创建下载链接
  528. const url = URL.createObjectURL(blob);
  529. // 创建 <a> 元素
  530. const a = document.createElement("a");
  531. a.href = url;
  532. a.download = fileName;
  533. // 模拟点击下载
  534. a.click();
  535. // 释放对象
  536. URL.revokeObjectURL(url);
  537. }
  538. // 消息提示
  539. export function msgTip(message, type = 1) {
  540. let obj = {
  541. 1: 'success',
  542. 2: "info",
  543. 3: "warning",
  544. 4: "error"
  545. }
  546. ElMessage({
  547. type: obj[type],
  548. message,
  549. })
  550. return
  551. }
  552. // 消息确认
  553. export function msgConfirm(title = '您是否确认执行此操作? ') {
  554. return new Promise((resolve, reject) => {
  555. ElMessageBox.confirm(
  556. title,
  557. "提示", {
  558. confirmButtonText: "确定",
  559. cancelButtonText: "取消",
  560. type: "warning",
  561. }
  562. ).then((res) => {
  563. resolve(res)
  564. }).catch((err) => {
  565. reject(err)
  566. })
  567. })
  568. }