H5-ThreeDoorder/static/js/mixin/mixin.js

760 lines
22 KiB
JavaScript
Raw Permalink 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 {
payH5API,
alipayH5API
} from '@/request/index/index.js';
import {
WXpayAPI,
WXpayDYPAPI
} from '@/request/restaurant/index.js';
import {
WXpayH5API
} from '@/request/recharge/index.js';
import {
mapMutations,
} from 'vuex';
// 客服链接
import {
RXSERVICE
} from '@/static/js/serviceurl.js';
// 公共mixins
export default {
computed: {},
// 方法
methods: {
...mapMutations(['GetState']),
// 七牛云地址拼接
qnyurl(src, address = 'v2') {
// 瑞幸咖啡图片链接
return `https://img.agrimedia.cn/chwl/${address}/${src}`;
// switch (address) {
// case 'rx':
// // 瑞幸咖啡图片链接
// return `https://img.agrimedia.cn/chwl/rx/${src}`;
// case 'xbk':
// // 瑞幸咖啡图片链接
// return `https://img.agrimedia.cn/chwl/xbk/${src}`;
// case 'mdl':
// // 麦当劳图片链接
// return `https://img.agrimedia.cn/chwl/mdl/${src}`;
// case 'fuel':
// // 加油图片连接地址
// return `https://img.agrimedia.cn/chwl/fuel/${src}`;
// case 'dyp':
// // 电影票图片连接地址
// return `https://img.agrimedia.cn/chwl/dyp/${src}`;
// default:
// // 默认返回链接
// return `https://img.agrimedia.cn/chwl/v2/${src}`;
// }
// // 注意七牛云上传地址
// return `https://img.agrimedia.cn/chwl/v2/${src}`
},
// 保留小数点
RetainDecimalPoint(num = 0, iscarry = true) {
// 保留小数点后几位
let r = 2;
// 因为该函数分为用户手动输入和后台传入方式
// 当用户手动输入的价格则不需要除以100
// 后台传入的价格是以分传入,所以需要除以一百
if (iscarry) {
num = num / 100;
}
// 转换之后的num
let s = '' + num;
// 检测传入参数是否为带小数点参数
if (s.indexOf('.') != -1) {
// 传入参数小数点不足所指定位数则补位
// 获取小数点位置
let index = s.indexOf('.');
// 拿到小数点之后有几位
let t = s.substring(index + 1, s.length);
// 如果小数点之后位数小于指定位数则补齐
if (t['length'] < r) {
for (let i = 0; i < r - t['length']; i++) {
s += '0';
}
} else {
return s.substring(0, index + 3);
}
return s;
} else {
// 是否正数
let number = /(^[1-9]\d*$)/;
// 是否为正数
if (number.test(num)) {
// 定义数组
let a = [];
// 结果
let n = '';
// 将初始值循环至数组
for (let key = 0; key < s['length']; key++) {
a.push(s[key]);
};
// 取最终值
for (let i = 0; i < a.length; i++) {
n += a[i];
if (i >= a.length - 1) {
n += '.'
for (let i = 0; i < r; i++) {
n += '0';
}
}
};
return n
} else {
return s
}
}
},
// 保留小数点2.0
// 前一个方法局限性太低,但又因为很多地方使用所以再开一个方法
/**
* @param {String} num需要处理的数据(不管是数字还是字符串最终都会先被处理成字符串)
* @param {Boolean} iscarry是否需要对数据经行除以一百此处属性用于传入的数据是价格且为【分】单位
* @param {Number} toFixed是否需要对数据经行小数点保留处理保留的位数
* 注意:若使用了try catch,则将不会显示错误信息
*/
RetainDecimalPoints({
num = 0,
iscarry = true,
toFixed = 2
}) {
console.log(num.__proto__.constructor.name, 'numnum')
if (num.__proto__.constructor.name !== 'string' && typeof num !== 'string') {
throw '所传参数不是字符串';
return;
}
// 保留小数点后几位
toFixed = Number(toFixed)
// 因为该函数分为用户手动输入和后台传入方式
// 当用户手动输入的价格则不需要除以100
// 后台传入的价格是以分传入,所以需要除以一百
if (iscarry) {
num = '' + (num / 100);
};
// 检测传入参数是否为带小数点参数
let index = num.indexOf('.');
// 传入数据携带小数点
if (index != -1) {
// 返回数据是否需要携带小数点
if (toFixed > 0) {
// 拿到现有数据小数点之后存在几位
let _l = num.substring(index + 1, num.length);
// 如果当前数据小数点之后现存位数大于给定返回位数则截取
if (_l['length'] > toFixed) {
num = num.substring(0, (index + 1) + toFixed);
} else {
// 如果当前数据小数点之后现存位数小于给定返回位数则循环补位
for (let _i = 0; _i < toFixed - _l['length']; _i++) {
num += '0';
}
}
} else {
num = num.substring(0, index);
}
} else {
// 是否正数
let number = /(^[1-9]\d*$)/;
// 是否为正数
if (number.test(num)) {
// 定义数组
let a = [];
// 结果
let n = '';
// 将初始数值赋值至数组
a = num.split("");
// 取最终值
for (let i = 0; i < a.length; i++) {
n += a[i];
if (i >= a.length - 1) {
n += '.';
for (let i = 0; i < toFixed; i++) {
n += '0';
}
}
};
num = n;
}
};
return num;
},
// 佣金格式化
_commission(num) {
return this.RetainDecimalPoints({
num: String(num),
iscarry: false,
toFixed: 4
})
},
_fixed(num) {
return num.toFixed(2)
},
// 金额格式化(iscarrytrue)
_amount(num) {
return this.RetainDecimalPoints({
num: String(num),
iscarry: true,
toFixed: 2
})
},
// 金额格式化(iscarryfalse)
__amount(num) {
return this.RetainDecimalPoints({
num: String(num),
iscarry: false,
toFixed: 2
})
},
_deduction_prop_(deduction_price, price, key) {
// console.log(deduction_price,price,'接收');
// 补贴价格(补贴了多少钱)
const Subsidyprice = this.RetainDecimalPoints({
num: String(price * (deduction_price / 100)),
iscarry: false,
toFixed: 0
});
console.log(Subsidyprice, '补贴了多少');
// console.log(Subsidyprice,this.RetainDecimalPoints({num:Subsidyprice,iscarry:true,toFixed:2}),'Subsidyprice');
// 补贴后的价格
const AfterSubsidy = this.RetainDecimalPoints({
num: String(price - Subsidyprice),
iscarry: true,
toFixed: 2
});
console.log(AfterSubsidy, '补贴后的价格');
// console.log(AfterSubsidy,'AfterSubsidy');
const _D = {
Subsidyprice: this.RetainDecimalPoints({
num: String(Subsidyprice),
iscarry: true,
toFixed: 2
}),
AfterSubsidy
}
if (key) return _D[key];
return _D;
},
// 解决小数点精度丢失问题
calc(num1, num2, calcStr) {
var str1, // 转换为字符串的数字
str2,
ws1 = 0, // ws1ws2 用来存储传入的num的小数点后的数字的位数
ws2 = 0, // 赋默认值,解决当整数和小数运算时倍数计算错误导致的结果误差
bigger, // bigger和smaller用于加除法找出小的那个数字给后面补0解决位数不对从而造成的计算错误的问题乘法需要将结果除两个数字的倍数之和
smaller, // 例如加减除法中1.001 + 2.03 如果不给2.03进行补0最后会变成1001+203数字错位导致结果错误乘法中1.12*1.1会放大为112*11所以结果需要除以1000才会是正确的结果112*11/1000=1.232
zeroCount, // 需要补充0的个数
isExistDot1, // 传入的数字是否存在小数点
isExistDot2,
sum,
beishu = 1;
// 将数字转换为字符串
str1 = num1.toString();
str2 = num2.toString();
// 是否存在小数点(判断需要计算的数字是不是包含小数)
isExistDot1 = str1.indexOf('.') != -1 ? true : false;
isExistDot2 = str2.indexOf('.') != -1 ? true : false;
// 取小数点后面的位数
if (isExistDot1) {
ws1 = str1.split('.')[1].length;
}
if (isExistDot2) {
ws2 = str2.split('.')[1].length;
}
// 如ws1 和 ws2 无默认值如果num1 或 num2 不是小数的话则 ws1 或 ws2 的值将为 undefined
// bigger 和 smaller 的值会和预期不符
bigger = ws1 > ws2 ? ws1 : ws2;
smaller = ws1 < ws2 ? ws1 : ws2;
switch (calcStr) {
// 加减法找出小的那个数字给后面补0解决位数不对从而造成的计算错误的问题
// 例如1.001 + 2.03 如果不给2.03进行补0最后会变成1001+203数字错位导致结果错误
case "+":
case "-":
case "/":
zeroCount = bigger - smaller;
for (var i = 0; i < zeroCount; i++) {
if (ws1 == smaller) {
str1 += "0";
} else {
str2 += "0";
}
}
break;
case "*":
// 乘法需要将结果除两个数字的倍数之和
bigger = bigger + smaller;
break;
default:
return "暂不支持的计算类型,现已支持的有加法、减法、乘法、除法";
break;
}
// 去除数字中的小数点
str1 = str1.replace('.', '');
str2 = str2.replace('.', '');
// 计算倍数例如1.001小数点后有三位,则需要乘 1000 变成 1001变成整数后精度丢失问题则不会存在
for (var i = 0; i < bigger; i++) {
beishu *= 10; // 等价于beishu = beishu * 10;
}
num1 = parseInt(str1);
num2 = parseInt(str2);
// 进行最终计算并除相应倍数
switch (calcStr) {
case "+":
sum = (num1 + num2) / beishu;
break;
case "-":
sum = (num1 - num2) / beishu;
break;
case "*":
sum = (num1 * num2) / beishu;
break;
case "/":
sum = num1 / num2;
/* 除数与被除数同时放大一定倍数,不影响结果,
所以对数字进行放大对应倍数并进行补0操作后不用另对倍数做处理 */
break;
default:
return "暂不支持的计算类型,现已支持的有加法、减法、乘法、除法";
}
return sum;
},
// 返回页面
leftClick(page, url) {
if (page) {
uni.redirectTo({
url
});
} else {
uni.navigateBack({
delta: 1
});
}
},
// H5客服连接
location() {
const isWechat = getApp()['globalData']['parameters']?.isWechat;
console.log('是否小程序环境', getApp()['globalData']['parameters']);
if (isWechat) {
wx.miniProgram.navigateTo({
url: `/pages/wxpay/openCustomerServiceChat?url=${RXSERVICE}`
});
return;
};
location.href = `https://work.weixin.qq.com/kfid/kfc2f4d0cb26562ffe1`;
},
// 用于无前缀图片拼接
ImgSplicing(name) {
return `https://img.agrimedia.cn/chwl/H5card/${name}`;
},
// 点击店铺导航
openLocation() {
uni.showToast({
title: '定位功能正在维护',
icon: 'none'
})
},
// 支付
payment(data) {
uni.showLoading({
title: '加载中'
});
/**
* @param {String} order_sn订单号
* @param {Number} type订单类型
* @param {String} redirect_url回调地址
* @param {Object} money微信支付时需要的参数(该参数只在微信环境进入H5时才会存在)
* @payment方法的回调地址是查询完订单状态之后要进入的页面
*/
let {
order_sn,
type,
redirect_url = '',
} = data;
console.log(order_sn, type, redirect_url, '支付方法参数1');
// 微信跳转H5下单支付时需要先获取支付参数然后跳转微信小程序支付
if (getApp()['globalData']['parameters']?.isWechat) {
console.log("呼呼1")
this._H5WXPAY(data).then(res => {
uni.hideLoading();
console.log(res['data'], '微信支付参数');
const miniPayRequest = {
timeStamp: encodeURIComponent(res['data']['result']['timestamp']),
nonceStr: encodeURIComponent(res['data']['result']['nonceStr']),
package: encodeURIComponent(res['data']['result']['package']),
signType: encodeURIComponent(res['data']['result']['signType']),
paySign: encodeURIComponent(res['data']['result']['paySign']),
order_sn: res['data']['out_trade_no'],
type,
business: 'H5Environment',
// 微信结算付款页面需要return_url字段
return_url: redirect_url
};
console.log(encodeURIComponent(JSON.stringify(miniPayRequest)), '编码');
// return
wx.miniProgram.navigateTo({
url: `/pages/wxpay/wxpay?data=${encodeURIComponent(JSON.stringify(miniPayRequest))}&isencodeURL=true`
});
})
// // 电影票支付与点餐支付接口不同此处做出区分
// if(type == 4){
// WXpayDYPAPI({
// orderNo:order_sn,
// })
// }else{
// WXpayAPI({
// out_order_num:order_sn,
// money
// }).then(res => {
// uni.hideLoading();
// console.log(res['data'],'微信支付参数');
// const miniPayRequest = {
// timeStamp: encodeURIComponent(res['data']['result']['timestamp']),
// nonceStr: encodeURIComponent(res['data']['result']['nonceStr']),
// package: encodeURIComponent(res['data']['result']['package']),
// signType: encodeURIComponent(res['data']['result']['signType']),
// paySign: encodeURIComponent(res['data']['result']['paySign']),
// order_sn:res['data']['out_trade_no'],
// type,
// business:'restaurant',
// // 微信结算付款页面需要return_url字段
// return_url:redirect_url
// };
// console.log(encodeURIComponent(JSON.stringify(miniPayRequest)),'编码');
// wx.miniProgram.navigateTo({
// url: `/pages/wxpay/wxpay?data=${encodeURIComponent(JSON.stringify(miniPayRequest))}&isencodeURL=true`
// });
// })
// }
} else {
console.log("呼呼2")
// 测试
// location.href = `/pages/pay/index?order_sn=${order_sn}&type=${type}&redirect_url=${redirect_url}`;
// return
// 反之直接获取支付链接
// 回调地址添加标识。用于点击返回上一页
// redirect_url = `${redirect_url}`;
WXpayH5API({
order_sn,
type,
redirect_url: `${getApp()['globalData']['urlfileName']}/pages/pay/index?order_sn=${order_sn}&type=${type}&redirect_url=${redirect_url}`
}).then(res => {
console.log(
`${getApp()['globalData']['urlfileName']}/pages/pay/index?order_sn=${order_sn}&type=${type}&redirect_url=${redirect_url}`
)
console.log(res['data']['redirect_url'], '支付方法地址');
// location.href = ;
window.location.replace(res['data']['redirect_url'])
})
}
},
// H5在小程序环境下支付时每个接口不同所以封装为统一方法
_H5WXPAY(PayPara) {
// 点餐微信支付接口
if (PayPara['type'] == 3) {
let {
order_sn: out_order_num,
money
} = PayPara;
return WXpayAPI({
out_order_num,
money
});
};
// 电影票微信支付接口
if (PayPara['type'] == 4) {
let {
order_sn: orderNo
} = PayPara;
return WXpayDYPAPI({
orderNo
});
}
//vip充值
if (PayPara['type'] == 7) {
let {
order_sn,
type,
redirect_url
} = PayPara;
return WXpayH5API({
order_sn,
type,
redirect_url
});
}
},
/**
* @支付回调统一管理方法
* @查询订单状态完成之后的回调地址redirect_url
*/
pay_statepage(parameters, redirect_url) {
// console.log(order_sn,'pay_statepage方法参数');
let url = '';
url += redirect_url;
console.log(url, '判断跳转链接');
/**
* @拼接参数
*/
console.log('拼接参数')
if (typeof parameters !== 'undefined') {
for (let key in parameters) {
if (url.indexOf('?') == -1) {
url += `?${key}=${parameters[key]}`;
continue;
};
url += `&${key}=${parameters[key]}`
}
};
console.log(url, '地址');
if (redirect_url) {
// location.href = url;
uni.redirectTo({
url
})
}
// uni.redirectTo({
// url
// });
},
// 获取除去指定元素之外的高度
// bottomlb 底部留白距离
initScrollView({
el,
bottomlb = 0
} = data) {
let self = this;
return new Promise((resolve, reject) => {
uni.getSystemInfo({
success: (res) => {
if (typeof el === 'string') {
uni.createSelectorQuery().in(self).select(`.${el}`)
.boundingClientRect(
data => {
console.log(data, self['NAVHEIGHT'], bottomlb, '元素高度');
// 有时候无法获取到订单顶部的切换类型元素高度,所以当获取不到时在此处直接赋值
if (data['height'] == 0 && el == 'OrderToggleType') {
bottomlb = 45;
}
// 注意这里获得的高度宽度都是px需要转换rpx
// 可使用窗口高度将px转换rpx
resolve(((res.windowHeight - (data['height'] + self[
'NAVHEIGHT'] + bottomlb)) * (750 / res[
'windowWidth'])))
}).exec()
} else if (typeof el === 'object') {
let hs = [];
for (let i = 0; i < el['length']; i++) {
uni.createSelectorQuery().in(self).select(`.${el[i]}`)
.boundingClientRect(
data => {
hs.push(data['height'])
console.log(hs, '高度');
}).exec()
};
// // 宏任务执行完毕之后执行微任务
// setTimeout(() => {
// console.log(this.sum(hs), '求和');
// resolve(((res.windowHeight - this.sum(hs)) * (750 /
// res['windowWidth'])))
// }, 0)
}
}
})
// setTimeout(() => {
// uni.getSystemInfo({
// success: (res) => {
// // 因为支付宝平台不支持createSelectorQuery
// // #ifdef MP-WEIXIN
// uni.createSelectorQuery().in(self).select(".tabbars")
// .boundingClientRect(
// data => {
// console.log(data, '高度');
// // 注意这里获得的高度宽度都是px需要转换rpx
// // 可使用窗口高度将px转换rpx
// self.scrollHeight = ((res.windowHeight) * (750 /
// res['windowWidth']));
// resolve();
// }).exec()
// // #endif
// // 支付宝通过组件中获取到的元素信息经行计算
// // #ifdef MP-ALIPAY
// // -
// self.scrollHeight = ((res.windowHeight - self['$refs'][
// 'tabbars'
// ]['tabbarsHeight']) * (750 / res
// .windowWidth));
// resolve();
// // #endif
// }
// })
// }, 500)
});
},
// 深拷贝
deepClone(source) {
if (!source || typeof source !== 'object') {
throw new Error('error arguments', 'shallowClone');
}
var targetObj = source.constructor === Array ? [] : {};
for (var keys in source) {
if (source.hasOwnProperty(keys)) {
if (source[keys] && typeof source[keys] === 'object') {
targetObj[keys] = source[keys].constructor === Array ? [] : {};
targetObj[keys] = deepClone(source[keys]);
} else {
targetObj[keys] = source[keys];
}
}
}
return targetObj;
},
// 复制到粘贴版
Copy(e) {
uni.setClipboardData({
data: e,
success: function() {
uni.showToast({
title: '复制成功',
icon: 'none'
})
}
})
},
//
/**
* @选择地址之后返回用户位置信息
*/
GetUserchooseLocation() {
return new Promise((resolve, reject) => {
uni.chooseLocation({
success: function(res) {
getCityName2(res['latitude'], res['longitude']).then(e => {
console.log(e, 'eeeeeeeeeee');
let {
result: {
address,
ad_info: {
province,
city,
district,
location,
city_code,
name
},
formatted_addresses: {
recommend
}
}
} = e;
resolve({
province,
city,
district,
location,
city_code,
name,
recommend,
address
});
}).catch(e => {
reject(e);
})
}
});
})
},
// H5打开地图
handleOpen() {
},
//元转分
regYuanToFen(yuan, digit) {
var m = 0,
s1 = yuan.toString(),
s2 = digit.toString();
try {
m += s1.split(".")[1].length
} catch (e) {}
try {
m += s2.split(".")[1].length
} catch (e) {}
return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
},
//获取url参数
getUrlParams(url) {
try {
// 通过 ? 分割获取后面的参数字符串
let urlStr = url.split('?')[1]
// 创建空对象存储参数
let obj = {};
// 再通过 & 将每一个参数单独分割出来
let paramsArr = urlStr.split('&')
for (let i = 0, len = paramsArr.length; i < len; i++) {
// 再通过 = 将每一个参数分割为 key:value 的形式
let arr = paramsArr[i].split('=')
obj[arr[0]] = arr[1];
}
return obj
} catch {
return false
}
},
},
filters: {
OrderState(v) {
switch (v) {
case 0:
return '待支付';
case 1:
return '待发货';
case 2:
return '待收货';
case 3:
return '已退款';
case 4:
return '已取消';
case 5:
return '完成';
}
}
}
}