955 lines
26 KiB
JavaScript
955 lines
26 KiB
JavaScript
// 引入导出Excel表格依赖
|
||
import * as FileSaver from "file-saver"
|
||
import * as XLSX from "xlsx"
|
||
import { getItem } from "@/utils/storage"
|
||
import { getApi, postApi } from "@/api/tobAcco_api.js"
|
||
import store from "@/store"
|
||
import { ElLoading } from "element-plus"
|
||
|
||
// 获取图片访问路径
|
||
export const getImgUrl = iconName => {
|
||
if (process.env.NODE_ENV === "development") {
|
||
return "http://192.168.1.6:8888/" + iconName
|
||
} else if (process.env.NODE_ENV === "production") {
|
||
return window.location.origin + "/files/" + iconName//云平台
|
||
}
|
||
}
|
||
|
||
//是否是字符串类型
|
||
export function isString(value) {
|
||
return typeof value === "string"
|
||
}
|
||
|
||
//生成uuid
|
||
export function generateUUID() {
|
||
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) {
|
||
var r = (Math.random() * 16) | 0,
|
||
v = c === "x" ? r : (r & 0x3) | 0x8
|
||
return v.toString(16)
|
||
})
|
||
}
|
||
|
||
// 下载模板,携带token
|
||
export function downloadTemplate(type, fileName) {
|
||
fileName = fileName ? fileName : "模板"
|
||
let url = `/mosty-api/mosty-jcgl/common/exportExcelTemplate?type=${type}`
|
||
let token = getItem("token")
|
||
const headers = new Headers()
|
||
headers.append("Authorization", token) // 设置token
|
||
// 发起 Fetch 请求
|
||
fetch(url, {
|
||
method: "GET",
|
||
headers: headers
|
||
})
|
||
.then(res => res.blob())
|
||
.then(blob => {
|
||
let a = document.createElement("a")
|
||
a.download = fileName + ".xlsx"
|
||
a.href = window.URL.createObjectURL(blob)
|
||
a.style.display = "none"
|
||
document.body.appendChild(a)
|
||
a.click()
|
||
a.remove()
|
||
})
|
||
.catch(error => console.error("下载失败:", error))
|
||
}
|
||
|
||
// 下载模板,携带token
|
||
export function downloadewm(url, fileName) {
|
||
const loading = ElLoading.service({
|
||
lock: true,
|
||
text: "下载中...",
|
||
background: "rgba(0, 0, 0, 0.7)"
|
||
})
|
||
fileName = fileName ? fileName : ""
|
||
let token = getItem("token")
|
||
const headers = new Headers()
|
||
headers.append("Authorization", token) // 设置token
|
||
// 发起 Fetch 请求
|
||
fetch(url, {
|
||
method: "GET",
|
||
headers: headers
|
||
})
|
||
.then(res => res.blob())
|
||
.then(blob => {
|
||
let a = document.createElement("a")
|
||
a.download = fileName + ".zip"
|
||
a.href = window.URL.createObjectURL(blob)
|
||
a.style.display = "none"
|
||
document.body.appendChild(a)
|
||
a.click()
|
||
a.remove()
|
||
loading.close()
|
||
})
|
||
.catch(error => {
|
||
loading.close()
|
||
console.error("下载失败:", error)
|
||
}
|
||
)
|
||
}
|
||
|
||
// 下载二维码
|
||
export function qrcodeImg(id, type, ...name) {
|
||
let url = `/mosty-api/mosty-jcgl/common/createQrCode?objid=${id}&type=${type}`
|
||
if (name.length > 0) {
|
||
for (let i = 0; i < name.length; i++) {
|
||
const el = name[i]
|
||
url = url + `&texts=${el}`
|
||
}
|
||
}
|
||
return url
|
||
}
|
||
|
||
//下载培训二维码
|
||
export function qrcodepxImg(id, type, name, ...texts) {
|
||
let url = `/mosty-api/mosty-jcgl/common/createQrCodeNoStyle?objid=${id}&objname=${name}&type=${type}`
|
||
if (texts.length > 0) {
|
||
for (let i = 0; i < texts.length; i++) {
|
||
const el = texts[i]
|
||
url = url + `&texts=${el}`
|
||
}
|
||
}
|
||
return url
|
||
}
|
||
|
||
/**
|
||
* 数据去重 相同数据值累加
|
||
* @param {Object} array 数据
|
||
*/
|
||
export function setArray(array) {
|
||
let newArr = []
|
||
array.forEach(item => {
|
||
const res = newArr.findIndex(ol => {
|
||
//组织机构代码相同 并且报警类别相同
|
||
return item.ssbmdm == ol.ssbmdm && item.bjlb == ol.bjlb
|
||
})
|
||
if (res !== -1) {
|
||
newArr[res].sl = newArr[res].sl + item.sl
|
||
} else {
|
||
newArr.push(item)
|
||
}
|
||
})
|
||
|
||
return newArr
|
||
}
|
||
|
||
/**
|
||
* 合并数据
|
||
* @param {Object} array 数据
|
||
*/
|
||
export function hbArray(array, item1, item2, item3) {
|
||
let newArr = []
|
||
array.forEach(item => {
|
||
const res = newArr.findIndex(ol => {
|
||
//组织机构代码相同 并且报警类别相同
|
||
return item.product == ol.product
|
||
})
|
||
if (res !== -1) {
|
||
newArr[res][item1] = newArr[res][item1] + item[item1]
|
||
newArr[res][item2] = newArr[res][item2] + item[item2]
|
||
newArr[res][item3] = newArr[res][item3] + item[item3]
|
||
} else {
|
||
newArr.push(item)
|
||
}
|
||
})
|
||
|
||
return newArr
|
||
}
|
||
|
||
/**
|
||
*时间格式
|
||
* @export
|
||
* @param {*} [obj={}] type:时间类型 time:时间
|
||
* @return {*} 返回的时间
|
||
*/
|
||
export function dateFormat(obj = {}) {
|
||
let { type, time } = obj
|
||
let date
|
||
if (time) {
|
||
date = new Date(time)
|
||
} else {
|
||
date = new Date()
|
||
}
|
||
let year = date.getFullYear()
|
||
let month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1
|
||
let hours = date.getHours() < 10 ? "0" + date.getHours() : date.getHours()
|
||
let minutes = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes()
|
||
let seconds = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds()
|
||
let day
|
||
|
||
if (type == "front_one_day") {
|
||
//前一天日期
|
||
day = date.getDate() - 1
|
||
day = day < 10 ? "0" + day : day
|
||
return `${year}-${month}-${day}`
|
||
} else if (type == "month") {
|
||
// month = month < 10 ? "0" + month : month;
|
||
//返回年月
|
||
return `${year}-${month}`
|
||
} else if (type == "one") {
|
||
//返回当年一月
|
||
month = date.getMonth() - date.getMonth() + 1
|
||
month = month < 10 ? "0" + month : month
|
||
return `${year}-${month}`
|
||
} else if (type == "all") {
|
||
//格式化日期时间
|
||
day = date.getDate() < 10 ? "0" + date.getDate() : date.getDate()
|
||
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
|
||
} else if (type == "queen_two_hour") {
|
||
//后两小时
|
||
let date1 = new Date(date.getTime() + 2 * 60 * 60 * 1000)
|
||
return setTimeTormat(date1)
|
||
} else if (type == "year") {
|
||
//返回年份
|
||
return year
|
||
} else if (type == "sfm") {
|
||
//返回年份
|
||
let hours = date.getHours() < 10 ? "0" + date.getHours() : date.getHours()
|
||
let minutes = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes()
|
||
let seconds = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds()
|
||
return `${hours}:${minutes}:${seconds}`
|
||
} else if (type == "day") {
|
||
day = date.getDate() < 10 ? "0" + date.getDate() : date.getDate()
|
||
// month = month < 10 ? "0" + month : month;
|
||
//返回年月日
|
||
return `${year}-${month}-${day}`
|
||
} else if (type == "ones") {
|
||
//返回当年一月
|
||
month = date.getMonth() - date.getMonth() + 1
|
||
month = month < 10 ? "0" + month : month
|
||
day = date.getDate() < 10 ? "0" + date.getDate() : date.getDate()
|
||
return `${year}-${month}-${day}`
|
||
} else if (type == "lastmonth") {
|
||
// 计算上一个月的年份和月份
|
||
date.setMonth(date.getMonth() - 1)
|
||
let months = date.getMonth() + 1
|
||
if (months < 10) {
|
||
months = "0" + (date.getMonth() + 1)
|
||
}
|
||
return `${date.getFullYear()}-${months}`
|
||
} else if (type == "firstday") {
|
||
// 获取当年第一天
|
||
return `${year}-01-01`
|
||
} else {
|
||
//当天日期
|
||
day = date.getDate() < 10 ? "0" + date.getDate() : date.getDate()
|
||
return `${year}-${month}-${day}`
|
||
}
|
||
}
|
||
|
||
|
||
// 累加或者累减保持精度
|
||
/**
|
||
*
|
||
* @param {*String} type 默认add加
|
||
* @param {*Number} part 保留几位小数 4
|
||
* @param {...any} args 需要加减的参数
|
||
* @param {Number} total 初始值
|
||
* @returns
|
||
*/
|
||
export function numAdd(type = "add", part = 4, total = 0, ...args) {
|
||
let count = Number(total)
|
||
for (let i = 0; i < args.length; i++) {
|
||
if (isNaN(args[i])) {
|
||
continue
|
||
} else {
|
||
args[i] = Number(args[i])
|
||
count = type == "add" ? (count += args[i]) : (count -= args[i])
|
||
}
|
||
}
|
||
return part != -1 ? Number(count.toPrecision(20)).toFixed(part) : Number(count.toPrecision(20))
|
||
}
|
||
|
||
//设置时间
|
||
function setTimeTormat(date) {
|
||
let year1 = date.getFullYear()
|
||
let month1 = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1
|
||
let day1 = date.getDate() < 10 ? "0" + date.getDate() : date.getDate()
|
||
let hours = date.getHours() < 10 ? "0" + date.getHours() : date.getHours()
|
||
let minutes = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes()
|
||
let seconds = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds()
|
||
return `${year1}-${month1}-${day1} ${hours}:${minutes}:${seconds}`
|
||
}
|
||
|
||
/**
|
||
* 查询当天日期
|
||
*/
|
||
export function getNowDate() {
|
||
const timeOne = new Date()
|
||
const year = timeOne.getFullYear()
|
||
let month = timeOne.getMonth() + 1
|
||
let day = timeOne.getDate()
|
||
month = month < 10 ? "0" + month : month
|
||
day = day < 10 ? "0" + day : day
|
||
const NOW_MONTHS_AGO = `${year}.${month}.${day}`
|
||
return NOW_MONTHS_AGO
|
||
}
|
||
|
||
// 获取当前系统的时间
|
||
export function formatTime(data, flag) {
|
||
const date = data ? new Date(data) : new Date()
|
||
const y = date.getFullYear()
|
||
let m = date.getMonth() + 1
|
||
m = m < 10 ? "0" + m : m
|
||
let d = date.getDate()
|
||
d = d < 10 ? "0" + d : d
|
||
let h = date.getHours()
|
||
h = h < 10 ? "0" + h : h
|
||
let minute = date.getMinutes()
|
||
minute = minute < 10 ? "0" + minute : minute
|
||
let second = date.getSeconds()
|
||
second = second < 10 ? "0" + second : second
|
||
if (flag == "ymd") {
|
||
return y + "-" + m + "-" + d
|
||
} else if (flag == "ym") {
|
||
return y + "-" + m
|
||
} else {
|
||
return h + ":" + minute + ":" + second
|
||
}
|
||
}
|
||
|
||
//选择出生日期
|
||
export function getDefaultDate() {
|
||
const now = new Date()
|
||
const oneYearAgo = new Date(now.getFullYear() - 18, now.getMonth(), now.getDate())
|
||
return oneYearAgo.toISOString().substring(0, 10)
|
||
}
|
||
|
||
//禁止选择18年后的日期
|
||
export function disabledDate(time) {
|
||
const date = new Date(time)
|
||
const year = date.getFullYear()
|
||
return year > new Date().getFullYear() - 18
|
||
}
|
||
|
||
//禁止选择当前系统之前的时间以及当前系统日期
|
||
export function disablednowDate(time) {
|
||
return time.getTime() + 24 * 60 * 60 * 1000 > Date.now()
|
||
}
|
||
|
||
export function disablednowDate1(time) {
|
||
return time.getTime() > Date.now()
|
||
}
|
||
|
||
//禁止选择当前系统之后的时间
|
||
export function disablednowDates(time) {
|
||
return time.getTime() + 24 * 60 * 60 * 1000 < Date.now()
|
||
}
|
||
|
||
//禁止选择当前系统之后的月份
|
||
export function disablednowmonth(time) {
|
||
return time.getTime() < Date.now()
|
||
}
|
||
|
||
|
||
//数字超长处理
|
||
export function handleNum(num) {
|
||
var data = 0
|
||
if (num) {
|
||
try {
|
||
if (num * 1 > 100000) {
|
||
data = (num / 10000).toFixed(0) + "万"
|
||
} else {
|
||
data = (num * 1).toFixed(0)
|
||
}
|
||
} catch (error) {
|
||
data = 0
|
||
}
|
||
}
|
||
|
||
return data
|
||
}
|
||
|
||
/**
|
||
* 文件是否是图片
|
||
* @param {*} val
|
||
*/
|
||
export function IS_PNG(val) {
|
||
return (
|
||
["bmp", "jpg", "png", "tif", "gif", "pcx", "tga", "exif", "fpx", "svg", "psd", "cdr", "pcd", "dxf", "ufo", "eps", "ai", "raw", "wmf", "webp", "avif", "apng"].indexOf(
|
||
val.toLowerCase()
|
||
) !== -1
|
||
)
|
||
}
|
||
|
||
/**
|
||
* 文件是否是音频
|
||
* @param {*} val
|
||
*/
|
||
export function IS_MP3(val) {
|
||
return ["mp3", "wav", "wma", "mp2", "flac", "midi", "ra", "ape", "aac", "cda", "mov"].indexOf(val.toLowerCase()) !== -1
|
||
}
|
||
|
||
/**
|
||
* 文件是否是视频
|
||
* @param {*} val
|
||
*/
|
||
export function IS_MP4(val) {
|
||
return ["avi", "wmv", "mpeg", "mp4", "m4v", "mov", "asf", "fiv", "f4v", "mvb", "rm", "3gp", "vob"].indexOf(val.toLowerCase()) !== -1
|
||
}
|
||
|
||
/**
|
||
*对象数组排序
|
||
* @export
|
||
* @param {*} attr 排序的字段
|
||
* @param {*} rev true 升序 false 降序
|
||
*/
|
||
export function compare(attr, rev) {
|
||
if (rev == undefined) {
|
||
rev = 1
|
||
} else {
|
||
rev = rev ? 1 : -1
|
||
}
|
||
return (a, b) => {
|
||
a = a[attr]
|
||
b = b[attr]
|
||
if (a > b) {
|
||
return rev * -1
|
||
}
|
||
if (a < b) {
|
||
return rev * 1
|
||
}
|
||
return 0
|
||
}
|
||
}
|
||
|
||
//附件下载
|
||
export function createAndClickLink(downloadUrl, fileName) {
|
||
return new Promise((resolve, reject) => {
|
||
const xhr = new window.XMLHttpRequest()
|
||
xhr.open("GET", downloadUrl, true)
|
||
xhr.responseType = "blob"
|
||
|
||
xhr.onload = () => {
|
||
const url = window.URL.createObjectURL(xhr.response)
|
||
const a = document.createElement("a")
|
||
a.href = url
|
||
a.download = fileName
|
||
// 使用 setTimeout 延迟点击操作
|
||
setTimeout(() => {
|
||
a.click()
|
||
window.URL.revokeObjectURL(url) // 释放资源
|
||
resolve() // 解决 Promise
|
||
}, 0)
|
||
}
|
||
|
||
xhr.onerror = () => {
|
||
reject(new Error("文件下载失败"))
|
||
}
|
||
|
||
xhr.send()
|
||
})
|
||
}
|
||
|
||
/**
|
||
*导出表格
|
||
* @export
|
||
* @param {object} title 表头
|
||
* @param {Array} data 数据
|
||
* @param {*} XLSX 插件实例化对象
|
||
* @param {*} fileName 文件名称
|
||
*/
|
||
export function exportXlsx(title, tableData, XLSX, fileName) {
|
||
const list = tableData.map(item => {
|
||
const obj = {}
|
||
for (const k in item) {
|
||
if (title[k]) {
|
||
obj[title[k]] = item[k]
|
||
}
|
||
}
|
||
return obj
|
||
})
|
||
//创建表个数据
|
||
const data = XLSX.utils.json_to_sheet(list)
|
||
const wb = XLSX.utils.book_new()
|
||
XLSX.utils.book_append_sheet(wb, data, "data")
|
||
XLSX.writeFile(wb, fileName + ".xlsx")
|
||
}
|
||
|
||
//节流
|
||
|
||
export function _throttle(func, delay) {
|
||
let timer = null
|
||
let startTime = Date.now()
|
||
return () => {
|
||
let curTime = Date.now()
|
||
let remaining = delay - (curTime - startTime)
|
||
let context = this
|
||
let args = arguments
|
||
clearTimeout(timer)
|
||
if (remaining <= 0) {
|
||
func.apply(context, args)
|
||
startTime = Date.now()
|
||
} else {
|
||
timer = setTimeout(func, remaining)
|
||
}
|
||
}
|
||
}
|
||
|
||
//echarts自适应
|
||
export function chartAdaptation(chart) {
|
||
const DELAY = 500 // 延迟时间
|
||
let fnn = _throttle(() => {
|
||
setTimeout(() => {
|
||
chart.resize()
|
||
}, 300)
|
||
}, DELAY)
|
||
window.addEventListener("resize", fnn)
|
||
}
|
||
|
||
//深拷贝
|
||
export function deepClone(obj, cache = new WeakMap()) {
|
||
if (typeof obj !== "object") return obj // 普通类型,直接返回
|
||
if (obj === null) return obj
|
||
if (cache.get(obj)) return cache.get(obj) // 防止循环引用,程序进入死循环
|
||
if (obj instanceof Date) return new Date(obj)
|
||
if (obj instanceof RegExp) return new RegExp(obj)
|
||
|
||
// 找到所属原型上的constructor,所属原型上的constructor指向当前对象的构造函数
|
||
let cloneObj = new obj.constructor()
|
||
cache.set(obj, cloneObj) // 缓存拷贝的对象,用于处理循环引用的情况
|
||
for (let key in obj) {
|
||
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
||
cloneObj[key] = deepClone(obj[key], cache) // 递归拷贝
|
||
}
|
||
}
|
||
return cloneObj
|
||
}
|
||
|
||
//导出为Excel表格 exportExcel
|
||
export function exportExcel(tabname) {
|
||
//从表生成工作簿对象
|
||
var wb = XLSX.utils.table_to_book(document.querySelector("#out-table"))
|
||
//获取二进制字符串作为输出
|
||
var wbout = XLSX.write(wb, {
|
||
bookType: "xlsx",
|
||
bookSST: true,
|
||
type: "array"
|
||
})
|
||
try {
|
||
FileSaver.saveAs(
|
||
//Blob 对象表示一个不可变、原始数据的类文件对象。
|
||
//Blob 表示的不一定是JavaScript原生格式的数据。
|
||
//File 接口基于Blob,继承了 blob 的功能并将其扩展使其支持用户系统上的文件。
|
||
//返回一个新创建的 Blob 对象,其内容由参数中给定的数组串联组成。
|
||
new Blob([wbout], { type: "application/octet-stream" }),
|
||
//设置导出文件名称
|
||
`${tabname ? tabname : "index"}.xlsx`
|
||
)
|
||
} catch (e) {
|
||
if (typeof console !== "undefined") {
|
||
}
|
||
}
|
||
return wbout
|
||
}
|
||
|
||
//表格合计
|
||
export function getSummaries(param) {
|
||
const { columns, data } = param
|
||
const sums = []
|
||
columns.forEach((column, index) => {
|
||
if (index === 0) {
|
||
sums[index] = "合计"
|
||
return
|
||
}
|
||
const values = data.map(item => Number(item[column.property]))
|
||
if (!values.every(value => isNaN(value))) {
|
||
sums[index] = values.reduce((prev, curr) => {
|
||
const value = Number(curr)
|
||
if (!isNaN(value)) {
|
||
return numAdd("add", -1, prev, curr)
|
||
} else {
|
||
return prev
|
||
}
|
||
}, 0)
|
||
} else {
|
||
sums[index] = "N/A"
|
||
}
|
||
})
|
||
return sums
|
||
}
|
||
|
||
//合并数组方法
|
||
export function mergeArray(arr1, arr2) {
|
||
const newArray = []
|
||
let length1 = arr1.length
|
||
let length2 = arr2.length
|
||
for (let i = 0; i < length1; i++) {
|
||
for (let j = 0; j < length2; j++) {
|
||
if (i == j) {
|
||
let mergeItem = Object.assign(arr1[i], arr2[j])
|
||
newArray.push(mergeItem)
|
||
break
|
||
}
|
||
}
|
||
}
|
||
return newArray
|
||
}
|
||
|
||
/* 1 . 手机校验 */
|
||
export const validatePhone = rule => {
|
||
return (rule, value, callback) => {
|
||
if (!value) {
|
||
} else {
|
||
const reg = /^1[3|4|5|7|8][0-9]\d{8}$/
|
||
if (reg.test(value)) {
|
||
callback()
|
||
} else {
|
||
return callback(new Error("请输入正确的手机号"))
|
||
}
|
||
}
|
||
}
|
||
}
|
||
//身份证校验
|
||
export const validateIdentity = () => {
|
||
return (rule, value, callback) => {
|
||
if (!value) {
|
||
// return callback(new Error('身份证号不能为空'));
|
||
} else if (!/(^\d{15}$)|(^\d{17}(\d|X|x)$)/.test(value)) {
|
||
callback(new Error("输入的身份证长度或格式错误"))
|
||
}
|
||
|
||
//身份证城市
|
||
var aCity = {
|
||
11: "北京",
|
||
12: "天津",
|
||
13: "河北",
|
||
14: "山西",
|
||
15: "内蒙古",
|
||
21: "辽宁",
|
||
22: "吉林",
|
||
23: "黑龙江",
|
||
31: "上海",
|
||
32: "江苏",
|
||
33: "浙江",
|
||
34: "安徽",
|
||
35: "福建",
|
||
36: "江西",
|
||
37: "山东",
|
||
41: "河南",
|
||
42: "湖北",
|
||
43: "湖南",
|
||
44: "广东",
|
||
45: "广西",
|
||
46: "海南",
|
||
50: "重庆",
|
||
51: "四川",
|
||
52: "贵州",
|
||
53: "云南",
|
||
54: "西藏",
|
||
61: "陕西",
|
||
62: "甘肃",
|
||
63: "青海",
|
||
64: "宁夏",
|
||
65: "新疆",
|
||
71: "台湾",
|
||
81: "香港",
|
||
82: "澳门",
|
||
91: "国外"
|
||
}
|
||
if (!aCity[parseInt(value.substr(0, 2))]) {
|
||
callback(new Error("身份证地区非法"))
|
||
}
|
||
// 出生日期验证
|
||
var sBirthday = (value.substr(6, 4) + "-" + Number(value.substr(10, 2)) + "-" + Number(value.substr(12, 2))).replace(/-/g, "/"),
|
||
d = new Date(sBirthday)
|
||
if (sBirthday !== d.getFullYear() + "/" + (d.getMonth() + 1) + "/" + d.getDate()) {
|
||
callback(new Error("身份证上的出生日期非法"))
|
||
}
|
||
|
||
// 身份证号码校验
|
||
var sum = 0,
|
||
weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2],
|
||
codes = "10X98765432"
|
||
for (var i = 0; i < value.length - 1; i++) {
|
||
sum += value[i] * weights[i]
|
||
}
|
||
var last = codes[sum % 11] //计算出来的最后一位身份证号码
|
||
if (value[value.length - 1] !== last) {
|
||
callback(new Error("输入的身份证号非法"))
|
||
}
|
||
callback()
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 根据身份证计算出生日期
|
||
* @param {*} idCard
|
||
* @returns
|
||
*/
|
||
export function getBirthdayFromIdCard(idCard) {
|
||
var birthday = ""
|
||
if (idCard != null && idCard != "") {
|
||
if (idCard.length == 15) {
|
||
birthday = "19" + idCard.substr(6, 6)
|
||
} else if (idCard.length == 18) {
|
||
birthday = idCard.substr(6, 8)
|
||
}
|
||
|
||
birthday = birthday.replace(/(.{4})(.{2})/, "$1-$2-")
|
||
}
|
||
return birthday
|
||
}
|
||
|
||
/**
|
||
* 倒计时
|
||
* @param {*} time 目标时间
|
||
* @returns
|
||
*/
|
||
export function countDown(time) {
|
||
// 设置目标时间,这里以毫秒为单位。例如,设置为当前时间后的1小时
|
||
let countDownDate = time ? new Date(time).getTime() : new Date().getTime() // 1小时后的时间
|
||
// 获取当前时间
|
||
let now = new Date().getTime()
|
||
// 计算距离时间
|
||
let distance = countDownDate - now
|
||
// 倒计时时间计算
|
||
let num,
|
||
obj = { overtime: false, timeValue: "" }
|
||
if (distance > 0) {
|
||
num = distance
|
||
} else {
|
||
// 如果倒计时结束
|
||
num = Math.floor(Math.abs(distance))
|
||
obj.overtime = true
|
||
}
|
||
let days = Math.floor(num / (1000 * 60 * 60 * 24))
|
||
let hours = Math.floor((num % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60))
|
||
let minutes = Math.floor((num % (1000 * 60 * 60)) / (1000 * 60))
|
||
let seconds = Math.floor((num % (1000 * 60)) / 1000)
|
||
obj.timeValue = days + "天 " + hours + "时 " + minutes + "分 " + seconds + "秒 "
|
||
return obj
|
||
}
|
||
|
||
export function weekValidate(date) {
|
||
let val = (new Date(date)).getDay()
|
||
switch (val) {
|
||
case 0:
|
||
return "星期日"
|
||
case 1:
|
||
return "星期一"
|
||
case 2:
|
||
return "星期二"
|
||
case 3:
|
||
return "星期三"
|
||
case 4:
|
||
return "星期四"
|
||
case 5:
|
||
return "星期五"
|
||
case 6:
|
||
return "星期六"
|
||
}
|
||
}
|
||
|
||
// 转换时间格式
|
||
export function timeValidate(date, type) {
|
||
const time = date ? new Date(date) : new Date()
|
||
const yyyy = time.getFullYear()
|
||
const MM = (time.getMonth() + 1).toString().padStart(2, 0)
|
||
const dd = time.getDate().toString().padStart(2, "0")
|
||
const hh = time.getHours().toString().padStart(2, "0")
|
||
const mm = time.getMinutes().toString().padStart(2, "0")
|
||
const ss = time.getSeconds().toString().padStart(2, "0")
|
||
if (type == "ymd") {
|
||
return `${yyyy}-${MM}-${dd}`
|
||
}
|
||
if (type == "md") {
|
||
return `${MM}.${dd}`
|
||
}
|
||
return `${yyyy}-${MM}-${dd} ${hh}:${mm}:${ss}`
|
||
}
|
||
|
||
/**根据字典获取值
|
||
* @param {Array} dicArr 字典数组
|
||
* @param {String} val 值
|
||
*/
|
||
export function getValByDic(val, dicArr) {
|
||
|
||
val = typeof val === "string" ? val : ""
|
||
/** 是否多个数值 */
|
||
const isMult = val.indexOf(",") > -1
|
||
if (val === undefined) return ""
|
||
dicArr = Array.isArray(dicArr) ? dicArr : []
|
||
/** 字典对象 */
|
||
let dicObj = {}
|
||
for (let i = 0; i < dicArr.length; i++) {
|
||
const item = dicArr[i]
|
||
dicObj[item.value] = item.label
|
||
}
|
||
if (isMult) {
|
||
let valArr = val.split(",")
|
||
return valArr.map(dm => dicObj[dm]).join(",")
|
||
} else {
|
||
return dicObj[val] || val || "" // 查询不到返回原值
|
||
}
|
||
|
||
}
|
||
|
||
/** 按钮权限 */
|
||
export function getAuth() {
|
||
return new Promise((resolve, reject) => {
|
||
// 先强制为 true TODO: 方便所有人有权限
|
||
resolve(true)
|
||
// 后面以后用
|
||
// getApi({}, '/mosty-jcgl/securitychild/isAqyPower').then(res => {
|
||
// store.dispatch('user/setAuth', res)
|
||
// resolve(res)
|
||
// })
|
||
})
|
||
}
|
||
|
||
/**
|
||
* 限制小数位数
|
||
* @param { Number,String} 值
|
||
* @param {Number} num 小数位数
|
||
*/
|
||
export function numberLimit(val, num = 2) {
|
||
if (val === 0) return "0"
|
||
if (!val) return ""
|
||
if (typeof val === "number") val = String(val)
|
||
if (typeof val !== "string") return ""
|
||
switch (num) {
|
||
case 1:
|
||
return val.match(/\d+\.?\d{0,1}/)?.[0] || ""
|
||
break
|
||
case 2:
|
||
return val.match(/\d+\.?\d{0,2}/)?.[0] || ""
|
||
break
|
||
case 3:
|
||
return val.match(/\d+\.?\d{0,3}/)?.[0] || ""
|
||
break
|
||
case 4:
|
||
return val.match(/\d+\.?\d{0,4}/)?.[0] || ""
|
||
break
|
||
}
|
||
return ""
|
||
}
|
||
|
||
/**
|
||
* 将数字转换为中文数字表示形式 如11: 十一
|
||
*
|
||
* @param {number} num - 要转换的数字。
|
||
* @returns {string} - 转换后的中文数字字符串。
|
||
*/
|
||
export function toChineseNumber(num) {
|
||
// 四位四位的进行分割
|
||
const parts = num
|
||
.toString()
|
||
.replace(/(?=(\d{4})+$)/g, ",")
|
||
.split(",")
|
||
.filter(Boolean)
|
||
|
||
const map = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"]
|
||
const units = ["", "十", "百", "千"]
|
||
|
||
// 把连续的零给去掉 合并为1个零 当零在末尾的时候去掉
|
||
function _handleZero(str) {
|
||
return str.replace(/零+/g, "零").replace(/零$/, "")
|
||
}
|
||
|
||
function _transform(n) {
|
||
let result = ""
|
||
for (let i = 0; i < n.length; i++) {
|
||
const c = map[n[i]]
|
||
let u = units[n.length - i - 1]
|
||
if (c === "零") {
|
||
u = ""
|
||
}
|
||
result += c + u
|
||
}
|
||
result = _handleZero(result)
|
||
return result
|
||
}
|
||
|
||
const bigUnits = ["", "万", "亿"]
|
||
let result = ""
|
||
for (let i = 0; i < parts.length; i++) {
|
||
const p = parts[i]
|
||
const c = _transform(p)
|
||
const u = bigUnits[parts.length - i - 1]
|
||
if (c === "") {
|
||
result += "零"
|
||
continue
|
||
}
|
||
result += c + u
|
||
}
|
||
result = _handleZero(result)
|
||
if (result === "一十一") return "十一"
|
||
if (result === "一十二") return "十二"
|
||
if (result === "一十三") return "十三"
|
||
if (result === "一十四") return "十四"
|
||
if (result === "一十五") return "十五"
|
||
if (result === "一十六") return "十六"
|
||
if (result === "一十七") return "十七"
|
||
if (result === "一十八") return "十八"
|
||
if (result === "一十九") return "十九"
|
||
return result
|
||
}
|
||
|
||
/**
|
||
* 从一个列表中过滤目标数组
|
||
* @param originalData
|
||
* @param filteredData
|
||
*/
|
||
export const arrayFiltering = (originalData, filteredData) => {
|
||
let data = originalData
|
||
for (let i = 0; i < data.length; i++) {
|
||
for (let j = 0; j < filteredData.length; j++) {
|
||
if (filteredData[j] in data[i]) {
|
||
if (typeof data[i][filteredData[j]] !== "number" && typeof data[i][filteredData[j]] !== "boolean") {
|
||
if (data[i][filteredData[j]] !== null && (typeof data[i][filteredData[j]] === "string" || data[i][filteredData[j]] instanceof Array) && data[i][filteredData[j]].length) {
|
||
if (j === filteredData.length - 1) {
|
||
data[i]["sign"] = true
|
||
}
|
||
}else {
|
||
data[i]["sign"] = false
|
||
break
|
||
}
|
||
}
|
||
} else {
|
||
data[i]["sign"] = false
|
||
break
|
||
}
|
||
}
|
||
}
|
||
return data
|
||
}
|
||
|
||
/**
|
||
* 检查原始对象中是否包含合规的数据
|
||
* @param primaryObject
|
||
* @param filterArray
|
||
*/
|
||
export const singleObjectCheck = (primaryObject, filterArray) => {
|
||
for (let i = 0; i < filterArray.length; i++) {
|
||
if (filterArray[i] in primaryObject) {
|
||
if (typeof primaryObject[filterArray[i]] !== "number" && typeof primaryObject[filterArray[i]] !== "boolean" && typeof primaryObject[filterArray[i]] !== "undefined") {
|
||
if (primaryObject[filterArray[i]] !== null && (typeof primaryObject[filterArray[i]] === "string" || primaryObject[filterArray[i]] instanceof Array) && primaryObject[filterArray[i]].length) {
|
||
if (i === filterArray.length - 1) {
|
||
primaryObject["sign"] = true
|
||
}
|
||
}else {
|
||
primaryObject["sign"] = false
|
||
break
|
||
}
|
||
}else {
|
||
primaryObject["sign"] = true
|
||
}
|
||
} else {
|
||
primaryObject["sign"] = false
|
||
break
|
||
}
|
||
}
|
||
return primaryObject
|
||
}
|
||
|
||
/**
|
||
* 判断两个数组是否有交集
|
||
* @param arr1
|
||
* @param arr2
|
||
* @returns {boolean}
|
||
*/
|
||
export const haveIntersection = (arr1, arr2) => {
|
||
return arr1.filter(item => arr2.includes(item)).length > 0;
|
||
}
|