Files
MALL_MP_WX/utils/tool.js
dt_2916866708 f756390529 第一次提交
2024-02-28 17:26:46 +08:00

720 lines
20 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import utils from '@/utils/encode';
import login from '../api/login.js';
import station from '@/api/station.js';
import QQMapWX from './qqmap-wx-jssdk.min.js';
import oilIdentityApi from '@/api/login.js'
class Anticorrosive {
//需要的基本数据定义
reqData = null
data = null;
configure = null;
pageKeys = ['outputField', 'field', 'type', 'defaultValue'];
constructor(data, configure) {
// 初始化数据 => 校验数据
this.data = data;
this.configure = configure;
return this.chenk();
}
// 递归 生成数据结构
generate(data, configure) {
// 通过传入的源数据生成相应的数据结构
let reqData = data instanceof Array ? [] : {};
//递归配置参数直到数据类型为基本类型 创建相应的数据(深拷贝)
for (const fields of configure) {
this.pageKeys.forEach(item => {
let fieldsKeys = Object.keys(fields);
if (!fieldsKeys.includes(item)) throw new Error(`必填字段 :${item} 不能为空`);
})
let field = data[fields.field] === undefined ? fields.defaultValue ? fields.defaultValue : null : data[
fields.field]; //如果为undefined直接为null
let isChildField = fields?.childField ? true : false; //判断是否有子配置项
let isType = fields.type === typeof field; //判断数据类型是否匹配
// console.log(field,fields.type,typeof field,'isType')
//检测是field类型 基本类型/引用类型
if (field instanceof Function) { //引用类型且为Function
console.warn("Function类型无法配置");
reqData[fields.outputField] = field
} else if (field instanceof Set) { //引用类型且为Set
console.warn("Set类型无法配置");
reqData[fields.outputField] = field
} else if (field instanceof Map) { //引用类型且为Map
console.warn("Map类型无法配置");
reqData[fields.outputField] = field
} else if (field instanceof Array) { //引用类型且为数组 递归
if (!isType) console.warn(`数据源与数据类型不匹配:${fields.field}`);
reqData[fields.outputField] = [];
reqData[fields.outputField] = isChildField ? field.map(element => this.generate(element, fields
.childField)) : field;
} else if (field instanceof Object) { //引用类型 递归
if (!isType) console.warn(`数据源与数据类型不匹配:${fields.field}`);
reqData[fields.outputField] = isChildField ? this.generate(field, fields.childField) : field;
} else {
// null 和基本类型
reqData[fields.outputField] = this.voluation(field, fields);
}
}
return reqData
}
// 数据校验
chenk() {
let testingType = true;
if (this.data == undefined || this.data.constructor == Function || this.data.constructor == Set || this.data
.constructor == Map || !(this.data instanceof Object)) {
testingType = false
}
if (this.configure == undefined || this.configure.constructor == Function || this.configure.constructor ==
Set || this.configure.constructor == Map || !(this.configure instanceof Object)) {
testingType = false
}
if (testingType) {
// 校验通过 => 生成数据
return this.generate(this.data, this.configure)
} else {
return this.data
}
}
voluation(data, configure) {
if (!(typeof configure.defaultValue === configure.type)) throw new Error(
`定义的数据类型与默认值数据类型不匹配:${configure.field}`);
let value = null;
let isData = data === null;
if (isData) return configure.defaultValue; //如果data为null直接返回默认值
switch (configure.type) {
case 'number':
value = isNaN(Number(data)) ? configure.defaultValue : Number(data);
break;
case 'string':
value = String(data)
break;
case 'boolean':
value = Boolean(data)
break;
}
if (configure?.customHandler) { //是否有自定义处理程序
let customHandlerValue = configure.customHandler(value);
value = customHandlerValue !== undefined ? customHandlerValue : value
}
return value
}
}
export default {
Anticorrosive,
getPhone(e){
return new Promise((re,rj)=>{
const data1 = {
...e.detail,
sessionKey: uni.getStorageSync('sessionKey'),
unionId: uni.getStorageSync('unionid'),
openId: uni.getStorageSync('openid'),
appId: 'wxed3e2914d6aa4d52'
};
oilIdentityApi.ackPhone(data1).then(resj => {
re(resj.data)
});
})
},
async WXlogin(e) {
return new Promise((re, rj) => {
uni.login({
provider: 'weixin',
success: async (loginRes) => {
const code = loginRes.code
oilIdentityApi.sendCode(loginRes.code).then(res => {
if (res.code === 20000) {
uni.setStorageSync('sessionKey', res.data.sessionKey);
uni.setStorageSync('openid', res.data.openId);
uni.setStorageSync('unionid', res.data.unionId);
const data1 = {
...e.detail,
sessionKey: uni.getStorageSync('sessionKey'),
unionId: uni.getStorageSync('unionid'),
openId: uni.getStorageSync('openid'),
appId: 'wxed3e2914d6aa4d52'
}
oilIdentityApi.getPhone(data1).then(resj => {
re(resj.data.phoneNumber)
});
} else if (res.code == 1002) {
uni.showModal({
title: '微信登录失败提醒',
content: `${res.msg}如有疑问,请联系客服处理`
})
}
}).catch(err => {
uni.showToast({
title: '登陆失败',
icon: 'none'
})
})
},
fail: err => {},
})
})
},
difTags(res) {
res.data.forEach((item, index) => {
item['tags'] = ['maxCurrent', 'createSource'].map((tag, tagIndex) => {
let result = {}
switch (tag) {
case 'maxCurrent':
result = {
label: `最大${item[tag]}A`,
color: '#6EA29BCC'
}
break;
case 'createSource':
let source = this.difSource(item[tag]);
result = {
...source
}
break;
}
return result
});
if (index == 0) item['tags'].unshift({
label: '距离最近',
color: '#36658DFF'
})
})
},
difSource(e) {
switch (e) {
case 'XXCD':
return {
label: '星星充电',
color: '#E48011CC'
}
case 'QT':
return {
label: '其他',
color: '#121836CC'
}
case 'KD':
return {
label: '快电',
color: '#FF5F0FCC'
}
case 'TLD':
return {
label: '特来电',
color: '#7AA0F4CC'
}
case 'YKC':
return {
label: '云快充',
color: '#00A7EBCC'
}
case 'ZGGD':
return {
label: '中国国电',
color: '#27AB3BCC'
}
}
},
userLocationChenk(){
return new Promise((re,rj)=>{
wx.getSetting({
success(res) {
if (typeof(res.authSetting['scope.userLocation']) != 'undefined' && !res.authSetting[
'scope.userLocation']) {
// 用户没有授权
uni.showModal({
title: '提示',
content: '您暂无授权定位权限,将无法使用附近电站站功能,是否去开启授权',
success(res) {
if (res.confirm) {
wx.openSetting({
success(res) {
if (res.authSetting['scope.userLocation']) {
re()
// 授权成功,重新定位
} else {
// 没有允许定位权限
wx.showToast({
title: '您拒绝了定位权限,将无法使用附近电站站功能',
icon: 'none'
});
rj('拒绝了定位权限')
}
},
fail() {
rj('openSetting调用失败')
}
})
}else{
rj('取消授权')
}
}
})
}else{
re()
}
},
fail(err){
rj(err)
}
})
})
},
ReverseAddress(latitude,longitude){
const qqmapsdk = new QQMapWX({
key: 'NYEBZ-YURY3-XTU3N-YBR54-PKW6E-ROB2F'
});
return new Promise((re,rj)=>{
qqmapsdk.reverseGeocoder({
location: {
latitude:latitude,
longitude: longitude
},
success(addressRes){
re(addressRes)
},
fail(err){
rj(err)
}
})
})
},
getLocation() {
return new Promise((re, rj) => {
uni.getLocation({
type: 'wgs84',
geocode: true,
success: function(res) {
const qqmapsdk = new QQMapWX({
key: 'NYEBZ-YURY3-XTU3N-YBR54-PKW6E-ROB2F'
});
qqmapsdk.reverseGeocoder({
location: {
latitude: res.latitude,
longitude: res.longitude
},
success(addressRes){
var address = addressRes.result.formatted_addresses.recommend;
let location = {
...res,
address
}
uni.setStorageSync('location',location );
re(location)
},
fail(err){
rj(err)
}
})
},
fail(err) {
rj(err)
}
})
})
},
routingParameterGeneration(parameter){
if(parameter==null||parameter==undefined) return;
const parameterType = typeof parameter;
if( parameterType== 'string'){
let obj = {};
let splitParameter = parameter.split('?');
if(splitParameter.length<=1){
console.warn("暂无路径参数");
return
}
splitParameter[1].split('&').forEach(item=>{
if(item.indexOf('=')!==-1){
let splitItem = item.split('=')
obj[splitItem[0]] = splitItem[1]
}else{
console.warn("error");
console.log(item)
}
})
return obj
}else if(parameterType == 'object'){
let stringParameter = '?'
let parameterEntries = Object.entries(parameter);
parameterEntries.forEach((key,index)=>{
let itemString = `${key[0]}=${key[1]}${ parameterEntries.length-1==index?'':'&' }`;
stringParameter += itemString
})
return stringParameter
}
},
scanCode() {
return new Promise((re, rj) => {
uni.scanCode({
onlyFromCamera: true,
success: (res) => {
re(res)
},
fail(err) {
rj(err)
}
});
})
},
loginOut() {
return new Promise((re, rj) => {
login.logoutAuthSystem('MALL_COMS_MINI').then(res => {
if (res.code == 20000) {
re(res)
} else {
rj(res)
}
}).catch(err => {
rj(err)
})
})
},
getCode(data) {
return new Promise((re, rj) => {
login.sendSmsForEleccomDriverMini(data).then(res => {
if (res.code == 20000) {
re(res)
} else {
rj(res)
}
}).catch(err => {
rj(err)
})
})
},
bindLoginByPhoneOilOmsWebMini(data) {
return new Promise((re, rj) => {
login.bindLoginByPhoneOilOmsWebMini({
...data,
sessionKey: uni.getStorageSync('sessionKey'),
unionId: uni.getStorageSync('unionid'),
openId: uni.getStorageSync('openid'),
}).then(res => {
if (res.code == 20000) {
re(res)
} else {
rj(res.code)
}
}).catch(err => {
rj(err)
})
})
},
sendCode(code) {
return new Promise((re, rj) => {
login.sendCode(code).then(res => {
uni.setStorageSync('openid', res.data.openId);
uni.setStorageSync('unionid', res.data.unionId);
uni.setStorageSync('sessionKey', res.data.sessionKey)
re(res)
}).catch(err => {
rj(err)
})
})
},
autoLogin(codeData) {
return new Promise((re, rj) => {
login.loginOilOmsWebMini(codeData).then(res => {
if (res.code == 20000) {
re(res)
} else {
rj(res.code)
}
}).catch(err => {
rj(err)
})
})
},
weixinLogin() {
return new Promise((re, rj) => {
uni.login({
provider: 'weixin',
success: (loginRes) => {
re(loginRes)
},
fail: err => {
rj(err)
},
})
})
},
async getCards() {
await station.getAccountList().then(res => {
if (res.code == 20000) {
res.data.forEach(item => {
item['isEye'] = false
})
uni.setStorageSync('cards', res.data);
}
})
},
async loginSuccess(res) {
let resData = res.data
if (resData.authTokenDTO.loginFlag) {
uni.setStorageSync('Authorization', resData.authTokenDTO.accessToken)
uni.setStorageSync('accountStatus', resData.isCompanyAccount)
let user = resData.authTokenDTO.loginUser
uni.setStorageSync('user', user);
// await this.getCards();
setTimeout(() => {
uni.showToast({
title: res.msg,
icon: 'none',
complete: (err) => {}
})
}, 500);
uni.switchTab({
url: '/pages/home/index',
})
// uni.reLaunch({
// url: '/pages/index/index',
// fail() {
// console.log('跳转失败')
// }
// })
}
},
//调起上传图片
chooseImage(clickfn) {
const JSESSIONID = utils.uuid()
let chooseImageUrl = ''
uni.chooseImage({
success: (chooseImageRes) => {
uni.showLoading({
title: '加载中'
})
const tempFilePaths = chooseImageRes.tempFilePaths;
uni.uploadFile({
url: 'https://www.xingoil.com/adminapi/oil-oss/obejct/uploadFile',
filePath: tempFilePaths[0],
name: 'file',
formData: {
ossKey: 'xingyou',
pathKey: 'publicxingyou',
encrypt: 'PUBLIC',
},
header: {
"Content-Type": "multipart/form-data",
"Authorization": uni.getStorageSync('Authorization'),
'dataSources': 'MP',
"imei": uni.getStorageSync('unionid'),
"openId": uni.getStorageSync('openid'),
'JSESSIONID': JSESSIONID,
'token': utils.md5Salt(JSESSIONID)
},
success: (uploadFileRes) => {
uni.hideLoading()
chooseImageUrl = JSON.parse(uploadFileRes.data).data.publicUrl
clickfn(chooseImageUrl)
},
fail: () => {
uni.hideLoading()
}
});
},
fail: () => {
uni.hideLoading()
}
});
},
getnum(num, size = 2) {
if (String(num).indexOf('.') == -1 || String(num).split('.')[1].length < 2) return Number(num).toFixed(size);
var s = num.toString();
var result = s.substring(0, s.indexOf(".") + 1 + size);
return result
},
//数据转为两位小数
numberSetting(obj, key, nm = 2) {
if (arguments.length < 2) throw new Error('请检查函数配置参数,最少传递两个必填参数');
if (!Array.isArray(key)) throw new Error('参数2必须为Array');
// if (obj.constructor.toString().indexOf('Object') == -1) throw new Error('参数1必须为Object');
if (Array.isArray(obj)) {
obj.forEach((item, index) => {
if (Array.isArray(item)) {
this.numberSetting(item, key, nm)
}
let keyArray = Object.keys(item)
keyArray.forEach(i => {
if (key.includes(i)) {
item[i] = isNaN(Number(item[i])) ? 0.00 : Number(item[i]).toFixed(nm)
}
})
})
} else {
Object.keys(obj).forEach(keys => {
if (key.includes(keys)) {
// if (isNaN(Number(obj[keys]))) throw new Error(keys + '值不是数字')
// obj[keys] = Number(obj[keys]).toFixed(nm);
obj[keys] = isNaN(Number(obj[keys])) ? 0.00 : Number(obj[keys]).toFixed(nm)
}
})
}
},
/*
校验数据规范
data:校验源数据,
options:校验配置,
correct:是否修正
*/
checkData(data, options, correct = false) {
// 校验对象
let checkData = {
typeFn(data, type) {
return typeof data == type
},
correctFn(item) {
console.log('校验失败', item)
//查看是否修正
if (correct) {
//修正
switch (item.type) {
case 'number':
data[item.field] = data[item.field] == null ? item.defaultValue : data[item.field] ===
'' || isNaN(Number(data[item.field])) ? item.defaultValue : Number(data[item.field])
break;
case 'string':
data[item.field] = data[item.field] == null ? item.defaultValue : String(data[item
.field])
break;
case 'null':
data[item.field] = null
break;
}
} else {
//无需直接退出
wx.exitMiniProgram({
success: function() {
console.log('拜拜')
}
})
// throw new Error('错误!!!');
}
},
}
//参数校验
if (arguments.length < 2) throw new Error('请检查函数配置参数,最少传递两个必填参数');
if (!Array.isArray(options)) throw new Error('参数2必须为Array');
//获取对象的key
let dataKeys = Object.keys(data);
//开始通过 options 校验
options.forEach(item => {
//判断是否有该字段
if (typeof data[item.field] !== 'undefined') {
//校验数据类型
if (!checkData.typeFn(data[item.field], item.type)) {
//类型校验失败
checkData.correctFn(item);
}
} else {
console.log(`%c ${item.field} ← 错误值,请检查源数据中该字段`, 'font-size:50px;color:red');
checkData.correctFn(item);
}
})
},
//表单校验
checkFn(obj, whiteList, configure = {}) {
//校验状态 con
let con = {
result: true,
field: '',
WrongText: '',
errCheckField: ''
}
//校验参数
if (arguments.length < 1) throw new Error('请检查函数配置参数,最少传递1个必填参数');
if (obj.constructor.toString().indexOf('Object') == -1) throw new Error('参数1必须为Object');
if (whiteList && !Array.isArray(whiteList)) throw new Error('参数2必须为Array');
let configurationTable = Object.keys(configure)
// console.log(configurationTable, obj, '需要校验的字段数组')
// 循环需要校验的对象
Object.keys(obj).forEach(keys => {
// console.log(keys, '当前循环的校验对象')
//如果循环的当前字段在白名单内跳过
// console.log(whiteList, '白名单')
if (whiteList.includes(keys)) return
//校验状态改变跳过
// console.log(con.result, '校验状态')
if (!con.result) return
if (configurationTable.includes(keys)) {
//当前需要匹配的字段 obj[keys] configure[keys]
//循环配置参数 拿到校验配置
// console.log('key:', keys, '源对象:', obj[keys], '校验配置', configure[keys], '匹配到的需要校验的数据')
Object.keys(configure[keys]).forEach(pages => {
if (!con.result) return
// console.log('字段:', keys, '开始校验', pages, )
// configure[keys][pages]
switch (pages) {
case 'type':
con.result = typeof obj[keys] == configure[keys][pages]
if (!con.result) {
con.field = keys
con.WrongText = configure[keys].WrongText ? configure[keys].WrongText :
'字段:' + con.field + '校验出错'
con.errCheckField = pages
}
break;
case 'length':
con.result = obj[keys].toString().length == configure[keys][pages]
if (!con.result) {
con.field = keys
con.WrongText = configure[keys].WrongText ? configure[keys].WrongText :
'字段:' + con.field + '校验出错'
con.errCheckField = pages
}
break;
case 'minLength':
con.result = obj[keys].toString().length >= configure[keys][pages]
if (!con.result) {
con.field = keys
con.WrongText = configure[keys].WrongText ? configure[keys].WrongText :
'字段:' + con.field + '校验出错'
con.errCheckField = pages
}
break;
case 'maxLength':
con.result = obj[keys].toString().length <= configure[keys][pages]
if (!con.result) {
con.field = keys
con.WrongText = configure[keys].WrongText ? configure[keys].WrongText :
'字段:' + con.field + '校验出错'
con.errCheckField = pages
}
break;
case 'custom':
con.result = configure[keys][pages].test(obj[keys])
if (!con.result) {
con.field = keys
con.WrongText = configure[keys].WrongText ? configure[keys].WrongText :
'字段:' + con.field + '校验出错'
con.errCheckField = pages
}
// console.log('自定义类型校验', configure[keys][pages], '值', obj[keys])
break;
case 'tacitly':
con.result = Boolean(obj[keys])
if (!con.result) {
con.field = keys
con.WrongText = configure[keys].WrongText ? configure[keys].WrongText :
'字段:' + con.field + ',' + pages + '校验出错'
con.errCheckField = pages
}
// console.log('自定义类型校验', configure[keys][pages], '值', obj[keys])
break;
default:
// console.log(pages, '其他')
break;
}
})
}
});
// console.log(con, '校验结果')
return con
}
}