import moment from "moment";
import { post, get } from "@/utils/request";
import Cookies from "js-cookie";
import html2Canvas from "html2canvas";
import JsPDF from "jspdf";
import * as toEnglish from "./ACapital.js";
//根据value值回显字典label值
export function dictDataEcho(value, arr) {
if (value && arr) {
value = value + "";
const current = arr.find((x) => x.dictKey === value);
if (current != undefined && current.dictValue) {
return current.dictValue;
}
return "";
}
return "";
}
//根据value值回显字典label值
export function dictValueLabel(value, arr) {
if ((value || value === 0) && arr) {
const current = arr.filter((x) => x.value == value);
if (current && current.length > 0) {
return current[0].label;
}
return "";
}
return "";
}
export function getDict(key) {
return new Promise((resolve, reject) => {
let dictObj = {};
let arr = {};
let num = 0;
for (let i = 0; i < key.length; i++) {
const element = key[i];
if (dictObj[element]) {
arr[element] = dictObj[element];
num++;
if (num === key.length) {
resolve(arr);
}
} else {
post("/dictTenantData/page", {
pageNum: 1,
pageSize: 999,
tenantId: Cookies.get("tenantId"),
dictCode: element,
}).then((res) => {
dictObj[element] = res.rows;
arr[element] = res.rows;
sessionStorage.setItem("dict", JSON.stringify(dictObj));
num++;
if (num === key.length) {
resolve(arr);
}
});
}
}
});
}
export function getDictOne(key) {
return new Promise((resolve, reject) => {
let dictObj = {};
let arr = {};
let num = 0;
for (let i = 0; i < key.length; i++) {
const element = key[i];
if (dictObj[element]) {
arr[element] = dictObj[element];
num++;
if (num === key.length) {
resolve(arr);
}
} else {
post("/tenantDict/getDict", {
dictCode: element,
}).then((res) => {
dictObj[element] = res;
arr[element] = res;
num++;
if (num === key.length) {
resolve(arr);
}
});
}
}
});
}
// 金额千分符
export function moneyFormat(s, n) {
if (s) {
s = s + "";
let str = s.slice(0, 1);
if (str === "-") {
s = s.slice(1, s.length);
}
n = n > 0 && n <= 20 ? n : 2;
s = parseFloat((s + "").replace(/[^\d\.-]/g, "")).toFixed(n) + "";
var l = s.split(".")[0].split("").reverse(),
r = s.split(".")[1];
var t = "";
for (let i = 0; i < l.length; i++) {
t += l[i] + ((i + 1) % 3 == 0 && i + 1 != l.length ? "," : "");
}
let result = t.split("").reverse().join("") + "." + r;
if (str === "-") {
return "-" + result;
} else {
return result;
}
} else {
return "0.00";
}
}
// 计算该日期是星期几
export function calculationWeek(val, format) {
let weekArrayList = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
let index = new Date(moment(val, format).format("yyyy-MM-DD")).getDay();
let week = weekArrayList[index];
return week;
}
export function getPdf(title) {
// pdfDom 这个就是你vue页面中定义的ID 比如
这个也要避下雷
const element = document.getElementById("pdfDom");
window.pageYoffset = 0;
document.documentElement.scrollTop = 0;
document.body.scrollTop = 0;
setTimeout(() => {
// const nowDate = new Date();
// const date = {
// year: nowDate.getFullYear(),
// month: nowDate.getMonth() + 1,
// date: nowDate.getDate(),
// hours: nowDate.getHours(),
// minutes: nowDate.getMinutes(),
// seconds: nowDate.getSeconds(),
// };
// const newMonth = date.month > 10 ? date.month : "0" + date.month;
// const newDay = date.date > 10 ? date.date : "0" + date.date;
// const newMinutes = date.minutes < 10 ? "0" + date.minutes : date.minutes;
// const newSeconds = date.seconds < 10 ? "0" + date.seconds : date.seconds;
// const value = date.year + newMonth + newDay + date.hours + newMinutes + newSeconds;
let id = "";
//创建一个画布 --- 增加导出的pdf水印 !!
let can = document.createElement("canvas");
//设置画布的长宽
can.width = 400;
can.height = 500;
let cans = can.getContext("2d");
//旋转角度
cans.rotate((-15 * Math.PI) / 180);
cans.font = "18px Vedana";
//设置填充绘画的颜色、渐变或者模式
cans.fillStyle = "rgba(200, 200, 200, 0.40)";
//设置文本内容的当前对齐方式
cans.textAlign = "left";
//设置在绘制文本时使用的当前文本基线
cans.textBaseline = "Middle";
//在画布上绘制填色的文本(输出的文本,开始绘制文本的X坐标位置,开始绘制文本的Y坐标位置)
//cans.fillText(value, can.width / 8, can.height / 2)
let div = document.createElement("div");
div.id = id;
div.style.pointerEvents = "none";
div.style.top = "2000px";
div.style.left = "-2000px";
div.style.position = "fixed";
div.style.zIndex = "100000";
div.style.width = document.getElementById("pdfDom").scrollHeight + "px";
div.style.height = document.getElementById("pdfDom").scrollHeight + "px";
div.style.background = "url(" + can.toDataURL("image/png") + ") left top repeat";
document.getElementById("pdfDom").appendChild(div); // 到页面中
html2Canvas(element, {
allowTaint: true,
useCORS: true, // 需要注意,element的 高度 宽度一定要在这里定义一下,不然会存在只下载了当前你能看到的页面 避雷避雷!!!
scale: 2, // 提升画面质量,但是会增加文件大小
height: document.getElementById("pdfDom").scrollHeight,
windowHeight: document.getElementById("pdfDom").scrollHeight,
}).then(function (canvas) {
var contentWidth = canvas.width;
var contentHeight = canvas.height;
// 一页pdf显示html页面生成的canvas高度;
var pageHeight = (contentWidth * 841.89) / 592.28;
// 未生成pdf的html页面高度
var leftHeight = contentHeight;
// 页面偏移
var position = 0;
// a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
var imgWidth = 595.28;
var imgHeight = (592.28 / contentWidth) * contentHeight;
var pageData = canvas.toDataURL("image/jpeg", 1.0);
var pdf = new JsPDF("", "pt", "a4");
// 有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
// 当内容未超过pdf一页显示的范围,无需分页
if (leftHeight < pageHeight) {
pdf.addImage(pageData, "JPEG", 0, 0, imgWidth, imgHeight);
} else {
while (leftHeight > 0) {
pdf.addImage(pageData, "JPEG", 0, position, imgWidth, imgHeight);
leftHeight -= pageHeight;
position -= 841.89;
// 避免添加空白页
if (leftHeight > 0) {
pdf.addPage();
}
}
}
pdf.save(title + ".pdf");
});
}, 1000);
}
export function getPdfTransverseA4(title) {
html2Canvas(document.getElementById("pdfDom"), {
// allowTaint: true,
// taintTest: false,
// logging: false,
// useCORS: true,
// dpi: window.devicePixelRatio * 2, // 将分辨率提高到特定的DPI 提高四倍
// scale: 2, // 按比例增加分辨率
allowTaint: true,
useCORS: true, // 需要注意,element的 高度 宽度一定要在这里定义一下,不然会存在只下载了当前你能看到的页面 避雷避雷!!!
scale: 4, // 提升画面质量,但是会增加文件大小
height: document.getElementById("pdfDom").scrollHeight,
windowHeight: document.getElementById("pdfDom").scrollHeight,
}).then((canvas) => {
// eslint-disable-next-line new-cap
var pdf = new JsPDF("l", "mm", "a4"); // A3纸,横向
// var pdf = new JsPDF('p', 'mm', 'a4') // A4纸,纵向
var ctx = canvas.getContext("2d");
// A4大小,210mm x 297mm,四边各保留10mm的边距,显示区域190x277
// var a4w = 190;
// var a4h = 277
// A3大小,279mm x 420mm,四边各保留10mm的边距,显示区域259x400
// var a4w = 259;
// var a4h = 400;
var a4w = 210;
var a4h = 297;
// var imgHeight = Math.floor(a4h * canvas.width / a4w) // 按A4显示比例换算一页图像的像素高度[这个计算方式应该是纵向]
var imgHeight = Math.floor((a4w * canvas.width) / a4h); // 按A4显示比例换算一页图像的像素高度[这个是横向打印的计算方法]
var renderedHeight = 0;
while (renderedHeight < canvas.height) {
var page = document.createElement("canvas");
page.width = canvas.width;
page.height = Math.min(imgHeight, canvas.height - renderedHeight); // 可能内容不足一页
// 用getImageData剪裁指定区域,并画到前面创建的canvas对象中
page.getContext("2d").putImageData(ctx.getImageData(0, renderedHeight, canvas.width, Math.min(imgHeight, canvas.height - renderedHeight)), 0, 0);
// 添加图像到页面,保留10mm边距 [a4使用]
// pdf.addImage(page.toDataURL('image/jpeg', 1.0), 'JPEG', 10, 10, a4w, Math.min(a4h, a4w * page.height / page.width))
// 添加图像到页面,保留10mm边距[a3使用1.414换算比例]
// pdf.addImage(page.toDataURL("image/jpeg", 1.0), "JPEG", 10, 10, a4w * 1.414, Math.min(a4h, (a4w * page.height) / page.width) * 1.414);
pdf.addImage(page.toDataURL("image/jpeg", 1.0), "JPEG", 0, 0, a4w * 1.414, Math.min(a4h, (a4w * page.height) / page.width) * 1.414);
renderedHeight += imgHeight;
if (renderedHeight < canvas.height) {
pdf.addPage(); // 如果后面还有内容,添加一个空页
}
}
// 保存文件
pdf.save(title + ".pdf");
});
}
export function currencyPrefix(key) {
return "SAY " + key + " ";
}
// 金额英文写法
export function translateIntoEnglish(money, currencyType) {
let text = "";
if (money) {
text = currencyPrefix(currencyType);
if (!/^\d+$/.test(Number(money))) {
text = text + parseFloat(money).toFixed(2).toEnglish().toUpperCase();
} else {
text = text + parseFloat(money).toFixed(2).toEnglish().toUpperCase() + " ONLY";
}
}
text = text.split(" POINT ZERO ZERO ").join("");
return text;
}
// 随机数
export function random() {
let $chars = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678";
let maxPos = $chars.length;
let random = "";
for (let i = 0; i < 32; i++) {
random += $chars.charAt(Math.floor(Math.random() * maxPos));
}
return random;
}
// 深拷贝
export function checkType(target) {
return Object.prototype.toString.call(target).slice(8, -1);
}
export function deepClone(data) {
const obj = checkType(data) === "Array" ? [] : {};
let arr = ["Object", "Array"];
if (arr.includes(checkType(data))) {
for (let key in data) {
let value = data[key];
//value为简单类型,直接赋值
if (!arr.includes(checkType(value))) {
obj[key] = value;
} else {
// 定义一个映射,初始化时,将data本身加入映射中
const map = new WeakMap();
// 如果拷贝的是复杂数据类型第一次拷贝后存入map
// 第二次再遇到该值时,直接赋值为null,结束递归
map.set(data, true);
if (map.has(value)) {
obj[key] = null;
} else {
map.set(value, true);
obj[key] = deepClone(value);
}
}
}
} else {
return data;
}
return obj;
}
// 计算时间间隔
export function timeInterval(smallTime, largeTime) {
//一般前端使用的时间分隔符是"-",需要替换成"/"
let large = new Date(largeTime.replace("-", "/").replace("-", "/"));
let small = new Date(smallTime.replace("-", "/").replace("-", "/"));
if (large > small) {
let date3 = large.getTime() - new Date(small).getTime(); //时间差的毫秒数
//计算出相差天数
let days = Math.floor(date3 / (24 * 3600 * 1000));
//计算出小时数
let leave1 = date3 % (24 * 3600 * 1000); //计算天数后剩余的毫秒数
let hours = Math.floor(leave1 / (3600 * 1000));
//计算相差分钟数
let leave2 = leave1 % (3600 * 1000); //计算小时数后剩余的毫秒数
let minutes = Math.floor(leave2 / (60 * 1000));
//计算相差秒数
let leave3 = leave2 % (60 * 1000); //计算分钟数后剩余的毫秒数
let seconds = Math.round(leave3 / 1000);
return {
days: days,
hours: hours,
minutes: minutes,
seconds: seconds,
};
}
return {
days: 0,
hours: 0,
minutes: 0,
seconds: 0,
};
}
// 比较时间大小
export function compareTime(date1, date2) {
var oDate1 = new Date(date1);
var oDate2 = new Date(date2);
if (oDate1.getTime() > oDate2.getTime()) {
return true; //第一个大
} else {
return false; //第二个大
}
}
export function toDx(n) {
//阿拉伯数字转换函数
switch (n) {
case "0":
return "零";
case "1":
return "壹";
case "2":
return "贰";
case "3":
return "叁";
case "4":
return "肆";
case "5":
return "伍";
case "6":
return "陆";
case "7":
return "柒";
case "8":
return "捌";
case "9":
return "玖";
}
}
// 金额转大写
export function NumberToChinese(m) {
let unit = ["仟", "佰", "拾", "", "仟", "佰", "拾", "", "角", "分", "厘"];
m *= 1000;
m = Number(parseFloat(m).toFixed(0));
m += "";
var x = m.length;
var result = "";
for (var i = 0; i < x; i++) {
if (i == 3) {
result = "元" + result;
} else if (i == 7) {
result = "万" + result;
}
if (m.charAt(x - i - 1) == 0) {
if (i != 0 && i != 1 && i != 2) {
if (result.charAt(0) != "零" && result.charAt(0) != "元" && result.charAt(0) != "万") {
result = "零" + result;
}
}
continue;
}
result = toDx(m.charAt(x - i - 1)) + unit[unit.length - i - 1] + result;
}
result += result.charAt(result.length - 1) == "元" ? "整" : "";
return result;
}