agri-app/utils/agri.js

344 lines
9.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/**
* 通用js方法封装处理
* Copyright (c) 2019 agri
*/
// 日期格式化
export function parseTime(time, pattern) {
if (arguments.length === 0 || !time) {
return null
}
const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
let date
if (typeof time === 'object') {
date = time
} else {
if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
time = parseInt(time)
} else if (typeof time === 'string') {
time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm), '')
}
if ((typeof time === 'number') && (time.toString().length === 10)) {
time = time * 1000
}
date = new Date(time)
}
const formatObj = {
y: date.getFullYear(),
m: date.getMonth() + 1,
d: date.getDate(),
h: date.getHours(),
i: date.getMinutes(),
s: date.getSeconds(),
a: date.getDay()
}
const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
let value = formatObj[key]
// Note: getDay() returns 0 on Sunday
if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] }
if (result.length > 0 && value < 10) {
value = '0' + value
}
return value || 0
})
return time_str
}
// 获取今天的 LocalDateTime 格式yyyy-MM-dd HH:mm:ss
function getTodayLocalDateTime() {
const now = new Date();
// 年
const year = now.getFullYear();
// 月0 开始,+1 后补零
const month = String(now.getMonth() + 1).padStart(2, '0');
// 日:补零
const day = String(now.getDate()).padStart(2, '0');
// 时补零24小时制
const hours = String(now.getHours()).padStart(2, '0');
// 分:补零
const minutes = String(now.getMinutes()).padStart(2, '0');
// 秒:补零
const seconds = String(now.getSeconds()).padStart(2, '0');
// 拼接成 LocalDateTime 格式
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
// 表单重置
export function resetForm(refName) {
if (this.$refs[refName]) {
this.$refs[refName].resetFields()
}
}
// 添加日期范围
export function addDateRange(params, dateRange, propName) {
let search = params
search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {}
dateRange = Array.isArray(dateRange) ? dateRange : []
if (typeof (propName) === 'undefined') {
search.params['beginTime'] = dateRange[0]
search.params['endTime'] = dateRange[1]
} else {
search.params['begin' + propName] = dateRange[0]
search.params['end' + propName] = dateRange[1]
}
return search
}
// 回显数据字典
export function selectDictLabel(datas, value) {
if (value === undefined) {
return ""
}
var actions = []
Object.keys(datas).some((key) => {
if (datas[key].value == ('' + value)) {
actions.push(datas[key].label)
return true
}
})
if (actions.length === 0) {
actions.push(value)
}
return actions.join('')
}
// 回显数据字典(字符串、数组)
export function selectDictLabels(datas, value, separator) {
if (value === undefined || value.length ===0) {
return ""
}
if (Array.isArray(value)) {
value = value.join(",")
}
var actions = []
var currentSeparator = undefined === separator ? "," : separator
var temp = value.split(currentSeparator)
Object.keys(value.split(currentSeparator)).some((val) => {
var match = false
Object.keys(datas).some((key) => {
if (datas[key].value == ('' + temp[val])) {
actions.push(datas[key].label + currentSeparator)
match = true
}
})
if (!match) {
actions.push(temp[val] + currentSeparator)
}
})
return actions.join('').substring(0, actions.join('').length - 1)
}
// 字符串格式化(%s )
export function sprintf(str) {
var args = arguments, flag = true, i = 1
str = str.replace(/%s/g, function () {
var arg = args[i++]
if (typeof arg === 'undefined') {
flag = false
return ''
}
return arg
})
return flag ? str : ''
}
// 转换字符串undefined,null等转化为""
export function parseStrEmpty(str) {
if (!str || str == "undefined" || str == "null") {
return ""
}
return str
}
// 数据合并
export function mergeRecursive(source, target) {
for (var p in target) {
try {
if (target[p].constructor == Object) {
source[p] = mergeRecursive(source[p], target[p])
} else {
source[p] = target[p]
}
} catch (e) {
source[p] = target[p]
}
}
return source
}
/**
* 构造树型结构数据
* @param {*} data 数据源
* @param {*} id id字段 默认 'id'
* @param {*} parentId 父节点字段 默认 'parentId'
* @param {*} children 孩子节点字段 默认 'children'
*/
export function handleTree(data, id, parentId, children) {
let config = {
id: id || 'id',
parentId: parentId || 'parentId',
childrenList: children || 'children'
}
var childrenListMap = {}
var tree = []
for (let d of data) {
let id = d[config.id]
childrenListMap[id] = d
if (!d[config.childrenList]) {
d[config.childrenList] = []
}
}
for (let d of data) {
let parentId = d[config.parentId]
let parentObj = childrenListMap[parentId]
if (!parentObj) {
tree.push(d)
} else {
parentObj[config.childrenList].push(d)
}
}
return tree
}
/**
* 参数处理
* @param {*} params 参数
*/
export function tansParams(params) {
let result = ''
for (const propName of Object.keys(params)) {
const value = params[propName]
var part = encodeURIComponent(propName) + "="
if (value !== null && value !== "" && typeof (value) !== "undefined") {
if (typeof value === 'object') {
for (const key of Object.keys(value)) {
if (value[key] !== null && value[key] !== "" && typeof (value[key]) !== 'undefined') {
let params = propName + '[' + key + ']'
var subPart = encodeURIComponent(params) + "="
result += subPart + encodeURIComponent(value[key]) + "&"
}
}
} else {
result += part + encodeURIComponent(value) + "&"
}
}
}
return result
}
// 返回项目路径
export function getNormalPath(p) {
if (p.length === 0 || !p || p == 'undefined') {
return p
}
let res = p.replace('//', '/')
if (res[res.length - 1] === '/') {
return res.slice(0, res.length - 1)
}
return res
}
// 验证是否为blob格式
export function blobValidate(data) {
return data.type !== 'application/json'
}
// 生成纯数字、无小数点、低重复率的ID
// 1. 改造generateUniqueId返回字符串类型关键
export function generateUniqueId() {
const timestamp = Date.now();
const random = Math.floor(Math.random() * 10000).toString().padStart(4, '0');
return (timestamp + random).toString(); // 转成字符串,避免数字精度丢失
}
const toMin = (t) => {
const [h, m] = t.split(':').map(Number);
return h * 60 + (m || 0);
};
// ===================== 对外导出的函数(按需导出) =====================
/**
* 函数1判断时间列表是否冲突
* @param {Array} list - 包含startTime/endTime的时间配置列表
* @returns {Object} 冲突检测结果
*/
export function checkTimeConflict(list) {
if (!Array.isArray(list)) return { isConflict: false };
const valid = list.filter(i => i.startTime && i.endTime);
for (let i = 0; i < valid.length; i++) {
const [aS, aE] = [toMin(valid[i].startTime), toMin(valid[i].endTime)];
for (let j = i + 1; j < valid.length; j++) {
const [bS, bE] = [toMin(valid[j].startTime), toMin(valid[j].endTime)];
if (!(aE <= bS || bE <= aS)) return { isConflict: true, conflict: [valid[i], valid[j]] };
}
}
return { isConflict: false };
}
/**
* 判断两个时间的间隔是否大于 N 天
* @param {Date|String} time1 第一个时间
* @param {Date|String} time2 第二个时间
* @param {Number} days 天数
* @returns {Boolean} true=间隔大于N天false=不大于
*/
export function isIntervalMoreThanNDays(time1, time2, days) {
var dayDiff = getExactDiffDays(time1,time2)
return dayDiff > days;
}
/**
* 计算两个时间的相差天数(精确到时分秒,返回小数)
* @param {Date|String} time1 第一个时间(可含时分秒)
* @param {Date|String} time2 第二个时间(可含时分秒)
* @returns {Number} 相差的天数正数保留4位小数
*/
export function getExactDiffDays(time1, time2) {
// 转换为Date对象并校验合法性
const d1 = new Date(time1);
const d2 = new Date(time2);
if (isNaN(d1.getTime()) || isNaN(d2.getTime())) {
throw new Error("时间格式不合法,请检查!");
}
// 1. 计算毫秒差(绝对值,避免顺序问题)
const timeDiffMs = Math.abs(d1.getTime() - d2.getTime());
// 2. 转换为天数1天 = 86400000 毫秒)
const oneDayMs = 24 * 60 * 60 * 1000;
const diffDays = timeDiffMs / oneDayMs;
// 保留4位小数避免精度冗余
return Number(diffDays.toFixed(4));
}
// // 测试示例
// const start = "2026-03-01";
// const end = "2026-03-12";
// console.log(isIntervalMoreThanNDays(start, end, 10)); // true间隔11天大于10天
// console.log(isIntervalMoreThanNDays(start, end, 11)); // false刚好11天不大于
// ===================== 测试用例 =====================
/*
const rollerList = [
{ imei: '123', roller: 'jm1', startTime: '08:00', endTime: '12:00' },
{ imei: '123', roller: 'jm1', startTime: '10:00', endTime: '14:00' },
{ imei: '123', roller: 'jm1', startTime: '15:00', endTime: '18:00' }
];
// 调用(一行搞定)
const { isConflict, conflict } = checkTimeConflict(rollerList);
console.log(isConflict ? `冲突:${JSON.stringify(conflict)}` : '无冲突');*/