/**
|
* 获取距离date的dayCount天数( 年月日)
|
* @param {*} dayCount 距离date的天数
|
* @param {*} date 日期
|
* @returns 返回 yyyy-MM-dd
|
*/
|
export function getDay(dayCount, date) {
|
var today = date ? new Date(date) : new Date();
|
var targetday_milliseconds = today.getTime() + 1000 * 60 * 60 * 24 * dayCount;
|
today.setTime(targetday_milliseconds); //注意,这行是关键代码
|
var tYear = today.getFullYear();
|
var tMonth = today.getMonth();
|
var tDate = today.getDate();
|
tMonth = doHandleMonth(tMonth + 1);
|
tDate = doHandleMonth(tDate);
|
return tYear + '-' + tMonth + '-' + tDate;
|
}
|
function doHandleMonth(month) {
|
var m = month;
|
if (month.toString().length == 1) {
|
m = '0' + month;
|
}
|
return m;
|
}
|
|
// 格式化时间格式
|
/**
|
* 格式化时间格式
|
* @param {*} template 格式化模板
|
* @param {*} date 格式化日期
|
* @returns
|
*/
|
export function formatTime(template, date) {
|
var today = date ? new Date(date) : new Date();
|
var o = {
|
'M+': today.getMonth() + 1, //月份
|
'd+': today.getDate(), //日
|
'h+': today.getHours(), //小时
|
'm+': today.getMinutes(), //分
|
's+': today.getSeconds(), //秒
|
'q+': Math.floor((today.getMonth() + 3) / 3), //季度
|
S: today.getMilliseconds(), //毫秒
|
};
|
var fmt = template;
|
if (/(y+)/.test(fmt)) {
|
fmt = fmt.replace(RegExp.$1, (today.getFullYear() + '').substr(4 - RegExp.$1.length));
|
}
|
|
for (var k in o) {
|
if (new RegExp('(' + k + ')').test(fmt)) {
|
fmt = fmt.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length));
|
}
|
}
|
return fmt;
|
}
|
|
/**
|
* 数组去重
|
* @param {*} arr 原始数组
|
* @returns
|
*/
|
export function uniqueInArray(arr) {
|
if (Array.hasOwnProperty('from')) {
|
return Array.from(new Set(arr));
|
} else {
|
var n = {},
|
r = [];
|
for (var i = 0; i < arr.length; i++) {
|
if (!n[arr[i]]) {
|
n[arr[i]] = true;
|
r.push(arr[i]);
|
}
|
}
|
return r;
|
}
|
}
|
|
/**
|
* 计算echarts 的 max ,min ,interval
|
* @param {*} max 最大值
|
* @param {*} min 最小值
|
* @param {*} splitNumber 分隔数
|
* @returns '{ max: 0, min: 0, interval: 0 }'
|
*/
|
export function getChartMaxMinInterval(max, min, splitNumber) {
|
function getMaxMinNumber(n, l) {
|
var a1 = Math.floor(Math.log(n) / Math.LN10);
|
var b;
|
if (l) {
|
a1 < 2
|
? (b =
|
n / Math.pow(10, a1) - parseInt(n / Math.pow(10, a1)) > 0.5
|
? Math.round(n / Math.pow(10, a1)) * Math.pow(10, a1)
|
: (parseInt(n / Math.pow(10, a1)) + 0.5) * Math.pow(10, a1))
|
: (b = Math.ceil(n / Math.pow(10, 1)) * Math.pow(10, 1));
|
} else {
|
a1 < 2
|
? (b =
|
n / Math.pow(10, a1) - parseInt(n / Math.pow(10, a1)) > 0.5
|
? (parseInt(n / Math.pow(10, a1)) + 0.5) * Math.pow(10, a1)
|
: Math.floor(n / Math.pow(10, a1)) * Math.pow(10, a1))
|
: (b = Math.floor(n / Math.pow(10, 1)) * Math.pow(10, 1));
|
}
|
return l ? (-20 <= a1 ? +b.toFixed(a1 < 0 ? -a1 + 1 : 0) : b) : b;
|
}
|
var interval = 0;
|
if ((max - min) % splitNumber != 0) {
|
interval = getMaxMinNumber((max - min) / splitNumber, 1);
|
max = parseFloat((parseFloat((interval * splitNumber).toFixed(12)) + min).toFixed(12)); //解决小数精度一般问题,极端问题并不能解决。
|
min = min;
|
} else {
|
interval = (max - min) / splitNumber;
|
min = min;
|
max = max;
|
}
|
return { max: max, min: min, interval: interval };
|
}
|
|
/**
|
* 保留几位小数
|
* @param {*} val 要保留小数的值
|
* @param {*} n 保留的小数位数
|
* @returns
|
*/
|
export function getToFixed(val, n) {
|
let temp = parseFloat(val);
|
n = n ? n : 0;
|
if (typeof temp == NaN) {
|
console.warn('传入的为非数字类型');
|
return NaN;
|
}
|
temp = parseFloat(temp.toFixed(n));
|
return temp;
|
}
|
|
/**
|
* 根据扬程算流量
|
* @param {*} curve 贝塞尔曲线
|
* @param {*} y 扬程
|
* @returns '{x: 0,y: 0,}'
|
*/
|
export function getSectPointFlowbyH(curve, y) {
|
if (curve == null) return null;
|
var iPtCount = curve.length;
|
if (y > curve[0].Point0.Y) {
|
return null;
|
}
|
if (y < curve[iPtCount - 1].Point3.Y) {
|
return null;
|
}
|
|
for (var i = 0; i < iPtCount; i++) {
|
if (y > curve[i].Point3.Y && y < curve[i].Point0.Y) {
|
var ptBizer = curve[i];
|
//
|
try {
|
var minDis = Math.abs(ptBizer.Point3.Y - ptBizer.Point0.Y);
|
var sectY = 0;
|
var sectX = 0;
|
//console.log(minDis)
|
for (var uu = 0; uu <= 1; uu = uu + 0.01) {
|
var y0 = ptBizer.Point0.Y * uu * uu * uu;
|
var y1 = 3 * ptBizer.Point1.Y * uu * uu * (1 - uu);
|
var y2 = 3 * ptBizer.Point2.Y * uu * (1 - uu) * (1 - uu);
|
var y3 = ptBizer.Point3.Y * (1 - uu) * (1 - uu) * (1 - uu);
|
|
var curveY = y0 + y1 + y2 + y3;
|
//console.log(curveY)
|
if (Math.abs(curveY - y) < minDis) {
|
var y0 = ptBizer.Point0.Y * uu * uu * uu;
|
var y1 = 3 * ptBizer.Point1.Y * uu * uu * (1 - uu);
|
var y2 = 3 * ptBizer.Point2.Y * uu * (1 - uu) * (1 - uu);
|
var y3 = ptBizer.Point3.Y * (1 - uu) * (1 - uu) * (1 - uu);
|
|
var x0 = ptBizer.Point0.X * uu * uu * uu;
|
var x1 = 3 * ptBizer.Point1.X * uu * uu * (1 - uu);
|
var x2 = 3 * ptBizer.Point2.X * uu * (1 - uu) * (1 - uu);
|
var x3 = ptBizer.Point3.X * (1 - uu) * (1 - uu) * (1 - uu);
|
|
minDis = Math.abs(curveY - y);
|
sectX = x0 + x1 + x2 + x3;
|
sectY = curveY;
|
}
|
}
|
return {
|
x: sectX,
|
y: sectY,
|
};
|
} catch (ex) {
|
alert(ex.message);
|
}
|
}
|
}
|
}
|
|
/**
|
* 根据流量算扬程
|
* @param {*} curve 贝塞尔曲线
|
* @param {*} x 流量
|
* @returns '{x: 0,y: 0,}'
|
*/
|
export function getSectPointHbyFlow(curve, x) {
|
if (curve == null) return null;
|
var iPtCount = curve.length;
|
if (x < curve[0].Point0.X) {
|
return null;
|
}
|
if (x > curve[iPtCount - 1].Point3.X) {
|
return null;
|
}
|
|
for (var i = 0; i < iPtCount; i++) {
|
if (x > curve[i].Point0.X && x < curve[i].Point3.X) {
|
var ptBizer = curve[i];
|
//
|
try {
|
//alert(i);
|
var minDis = Math.abs(ptBizer.Point3.X - ptBizer.Point0.X);
|
//alert(x + " " + curve[i].Point0.X + " " + curve[i].Point3.X);
|
var sectY = 0;
|
var sectX = 0;
|
for (var uu = 0; uu <= 1; uu = uu + 0.01) {
|
var x0 = ptBizer.Point0.X * uu * uu * uu;
|
var x1 = 3 * ptBizer.Point1.X * uu * uu * (1 - uu);
|
var x2 = 3 * ptBizer.Point2.X * uu * (1 - uu) * (1 - uu);
|
var x3 = ptBizer.Point3.X * (1 - uu) * (1 - uu) * (1 - uu);
|
|
var curveX = x0 + x1 + x2 + x3;
|
if (Math.abs(curveX - x) < minDis) {
|
var y0 = ptBizer.Point0.Y * uu * uu * uu;
|
var y1 = 3 * ptBizer.Point1.Y * uu * uu * (1 - uu);
|
var y2 = 3 * ptBizer.Point2.Y * uu * (1 - uu) * (1 - uu);
|
var y3 = ptBizer.Point3.Y * (1 - uu) * (1 - uu) * (1 - uu);
|
minDis = Math.abs(curveX - x);
|
sectY = y0 + y1 + y2 + y3;
|
sectX = curveX;
|
}
|
}
|
return {
|
x: sectX,
|
y: sectY,
|
};
|
} catch (ex) {
|
alert(ex.message);
|
}
|
}
|
}
|
}
|
|
/**
|
* 转成Bezier曲线模型
|
* @param {*} pixelPoints
|
* @returns
|
*/
|
export function transBezierCurveModel(pixelPoints) {
|
if (pixelPoints == null || pixelPoints.length < 4) return null;
|
//console.log(pixelPoints);
|
var iPointCout = pixelPoints.length;
|
var a = 0.09;
|
var b = 0.09;
|
var controlPoint = [];
|
|
for (var i = 0; i < iPointCout - 1; i++) {
|
var bezier = {};
|
bezier.Point0 = { X: pixelPoints[i][0], Y: pixelPoints[i][1] };
|
|
if (i == 0) {
|
var x1 = pixelPoints[i][0] + a * (pixelPoints[i + 1][0] - pixelPoints[i][0]);
|
var y1 = pixelPoints[i][1] + a * (pixelPoints[i + 1][1] - pixelPoints[i][1]);
|
bezier.Point1 = {
|
X: x1,
|
Y: y1,
|
};
|
} else {
|
var x1 = pixelPoints[i][0] + a * (pixelPoints[i + 1][0] - pixelPoints[i - 1][0]);
|
var y1 = pixelPoints[i][1] + a * (pixelPoints[i + 1][1] - pixelPoints[i - 1][1]);
|
bezier.Point1 = {
|
X: x1,
|
Y: y1,
|
};
|
}
|
|
if (i == iPointCout - 2) {
|
var x2 = pixelPoints[i + 1][0] - b * (pixelPoints[i + 1][0] - pixelPoints[i][0]);
|
var y2 = pixelPoints[i + 1][1] - b * (pixelPoints[i + 1][1] - pixelPoints[i][1]);
|
bezier.Point2 = {
|
X: x2,
|
Y: y2,
|
};
|
} else {
|
var x2 = pixelPoints[i + 1][0] - b * (pixelPoints[i + 2][0] - pixelPoints[i][0]);
|
var y2 = pixelPoints[i + 1][1] - b * (pixelPoints[i + 2][1] - pixelPoints[i][1]);
|
bezier.Point2 = {
|
X: x2,
|
Y: y2,
|
};
|
}
|
bezier.Point3 = { X: pixelPoints[i + 1][0], Y: pixelPoints[i + 1][1] };
|
//bezier.Point3 = pixelPoints[i + 1];
|
controlPoint.push(bezier);
|
}
|
//console.log(controlPoint);
|
return controlPoint;
|
}
|
|
/**
|
* 格式化值,根据值的大小选择保留几位小数
|
* @param {*} value
|
* @returns
|
*/
|
export function numberFormat4RecordValue(value) {
|
if (value == null || value == undefined) return 0;
|
value = parseFloat(value);
|
if (value > 100) return parseFloat(value.toFixed(1));
|
else if (value > 10) return parseFloat(value.toFixed(2));
|
else return parseFloat(value.toFixed(4));
|
}
|
export function numberFormat(value) {
|
if (value == null || value == undefined) return 0;
|
var v = value.toString();
|
var result = v;
|
var decimalIndex = v.indexOf('.');
|
if (decimalIndex != -1) {
|
result = v.substring(decimalIndex + 1, v.length);
|
if (result.length > 5) {
|
v = parseFloat(value).toFixed('5');
|
}
|
if (result.substr(result.length - 4, 4) == '0000') {
|
v = parseFloat(value).toFixed(result.length - 4);
|
} else if (result.substr(result.length - 3, 3) == '000') {
|
v = parseFloat(value).toFixed(result.length - 3);
|
} else if (result.substr(result.length - 2, 2) == '00') {
|
v = parseFloat(value).toFixed(result.length - 2);
|
} else if (result.substr(result.length - 1, 1) == '0') {
|
v = parseFloat(value).toFixed(result.length - 1);
|
}
|
}
|
return v;
|
}
|
/**
|
* 数组求和
|
* @param {Array} arr
|
* @returns sum
|
*/
|
export function sumInArray(arr) {
|
return arr.reduce((pre, cur) => {
|
return pre + cur;
|
});
|
}
|
|
/**
|
* 计算数组最大值
|
* @param {*} arr
|
* @returns max
|
*/
|
export function maxInArray(arr) {
|
return Math.max.apply(null, arr);
|
}
|
|
/**
|
* 计算数组 最小值
|
* @param {*} arr
|
* @returns min
|
*/
|
export function minInArray(arr) {
|
return Math.min.apply(null, arr);
|
}
|
|
/**
|
* 深拷贝
|
* @param {*} data
|
* @returns data
|
*/
|
export const deepCopy = (data) => {
|
return JSON.parse(JSON.stringify(data));
|
};
|
|
/**
|
* list数据转成 tree使用格式
|
* @param {*} data list结构数组 父子关系是ParentIds数组
|
* @returns tree
|
*/
|
export const treeCorprationDataFormat = (data) => {
|
if (!Array.isArray(data)) {
|
return data;
|
}
|
let tree = [];
|
const listToTree = (list, tree, parentId, length) => {
|
list.forEach((org) => {
|
org.value = org.ID;
|
// 判断是否为父级菜单
|
if (length == 0) {
|
if (org.ParentIds.length == 0) {
|
let child = org;
|
child.Children = [];
|
// 迭代 list, 找到当前菜单相符合的所有子菜单
|
listToTree(list, child.Children, org.ID, org.ParentIds.length + 1);
|
// 删掉不存在 children 值的属性
|
if (child.Children.length <= 0) {
|
delete child.Children;
|
}
|
// 加入到树中
|
tree.push(child);
|
}
|
} else {
|
if (org.ParentIds.length == length && org.ParentIds.indexOf(parentId) != -1) {
|
let child = org;
|
child.Children = [];
|
// 迭代 list, 找到当前菜单相符合的所有子菜单
|
listToTree(list, child.Children, org.ID, org.ParentIds.length + 1);
|
// 删掉不存在 children 值的属性
|
if (child.Children.length <= 0) {
|
delete child.Children;
|
}
|
// 加入到树中
|
tree.push(child);
|
}
|
}
|
});
|
};
|
listToTree(data, tree, 0, 0);
|
return tree;
|
};
|
|
/**
|
* 在版本管理,用于将左侧故障树中的 item 项汇入 Children 中,
|
* 方便树形数据展示
|
*/
|
export const formatTreeList = (responseTreeData) => {
|
return responseTreeData.map((node) => {
|
let formatItems = [];
|
if (node.Items) {
|
formatItems = node.Items.map((item) => {
|
item.wysType = 'fault';
|
item.isFaultTree = true;
|
return item;
|
});
|
}
|
// 如果有 Children 属性,确定不是故障
|
if (node.Children) {
|
node.Children = [...formatTreeList([...node.Children]), ...formatItems];
|
// 无 Items 属性,确定一定是故障,而不是故障组
|
} else if (!node.Items) {
|
node.wysType = 'fault';
|
node.isFaultTree = true;
|
}
|
return node;
|
});
|
};
|
|
/**
|
* list数据转成 treeTable使用格式 用于客户管理页面表格展示
|
* @param {*} data list结构数组 父子关系是ParentIds数组
|
* @returns tree
|
*/
|
export const listFormatTreeTableCorpration = (data, pid, l) => {
|
if (!Array.isArray(data)) {
|
return data;
|
}
|
let tree = [];
|
const listToTree = (list, tree, parentId, length) => {
|
list.forEach((org) => {
|
// 判断是否为父级菜单
|
org.value = org.ID;
|
if (org.ParentIds.length == length && org.ParentIds.indexOf(parentId) != -1) {
|
let child = org;
|
child.children = [];
|
// 迭代 list, 找到当前菜单相符合的所有子菜单
|
listToTree(list, child.children, org.ID, org.ParentIds.length + 1);
|
// 删掉不存在 children 值的属性
|
if (child.children.length <= 0) {
|
delete child.children;
|
}
|
// 加入到树中
|
tree.push(child);
|
}
|
});
|
};
|
|
listToTree(data, tree, pid, l);
|
return tree;
|
};
|
|
/**
|
* list数据转成 tree使用格式 用于左侧树结构显示登录客户及子客户
|
* @param {*} data list结构数组 父子关系是ParentIds数组
|
* @returns tree
|
*/
|
export const listFormatTreeCorpration = (data, pid, l) => {
|
if (!Array.isArray(data)) {
|
return data;
|
}
|
let tree = [];
|
const listToTree = (list, tree, parentId, length) => {
|
list.forEach((org) => {
|
org.value = org.ID;
|
// 判断是否为父级菜单
|
if (org.ParentIds.length == length && org.ID == parentId) {
|
let child = org;
|
child.Children = [];
|
// 迭代 list, 找到当前菜单相符合的所有子菜单
|
listToTree(list, child.Children, org.ID, org.ParentIds.length + 1);
|
// 删掉不存在 Children 值的属性
|
if (child.Children.length <= 0) {
|
delete child.Children;
|
}
|
// 加入到树中
|
tree.push(child);
|
} else if (org.ParentIds.length == length && org.ParentIds.indexOf(parentId) != -1) {
|
let child = org;
|
child.Children = [];
|
// 迭代 list, 找到当前菜单相符合的所有子菜单
|
listToTree(list, child.Children, org.ID, org.ParentIds.length + 1);
|
// 删掉不存在 Children 值的属性
|
if (child.Children.length <= 0) {
|
delete child.Children;
|
}
|
// 加入到树中
|
tree.push(child);
|
}
|
});
|
};
|
|
listToTree(data, tree, pid, l);
|
return tree;
|
};
|
|
/**
|
* 根据id获取树id 用于获取默认选中高亮
|
* @param {*} list 原始数组
|
* @param {*} ID 选中id
|
* @returns obj 原始数组中item
|
*/
|
export const getTreeIdById = (list, ID) => {
|
let obj = [];
|
if (list.length === 0) {
|
return obj;
|
}
|
const getDtreeId = (obj, list, ID) => {
|
if (ID) {
|
for (var i = 0; i < list.length; i++) {
|
var item = list[i];
|
if (!item.Children) {
|
item.Children = [];
|
}
|
if (item.ID == ID) {
|
obj.push(item);
|
// break;
|
}
|
if (item.Children.length != 0) {
|
getDtreeId(obj, item.Children, ID);
|
}
|
}
|
} else {
|
if (!list[0].Children) {
|
list[0].Children = [];
|
}
|
if (list[0].Children.length == 0) {
|
obj.push(list[0]);
|
}
|
if (list[0].Children.length != 0) {
|
getDtreeId(obj, list[0].Children, ID);
|
}
|
}
|
};
|
getDtreeId(obj, list, ID);
|
return obj;
|
};
|
|
export const formatTreeDataToElementPlusTreeSelect = (list, idstr, childrenstr) => {
|
const addValue = (list, idstr, childrenstr) => {
|
list.forEach((x) => {
|
x.value = x[idstr];
|
if (x[childrenstr] && x[childrenstr].length > 0) {
|
addValue(x[childrenstr], idstr, childrenstr);
|
}
|
});
|
};
|
if (list && list.length > 0) {
|
addValue(list, idstr, childrenstr);
|
}
|
};
|
|
export const $ = (name) => document.querySelector(name);
|
|
export const getContainerSize = (dom) => ({ width: dom.getBoundingClientRect().width, height: dom.getBoundingClientRect().height });
|