665 lines
24 KiB
TypeScript
665 lines
24 KiB
TypeScript
import merchant from "@/api/https/merchant";
|
||
import { setStorage, jx_default_storage_plugin, getStorage, cleatStorage } from "@/utils/storage";
|
||
import toast from "@/utils/toast";
|
||
import { timeFormatD } from "@/utils/tools";
|
||
import { store as newStore, store } from '@/store'
|
||
import configCms from "@/utils/configCms";
|
||
import Bluetooth from '@/utils/bluetoothPrinter/bluetooth'
|
||
import util from '@/utils/bluetoothPrinter/util'
|
||
import login from "@/api/https/login";
|
||
import { computed } from "vue";
|
||
import { emojiAnanlyze } from '@/utils/emoji'
|
||
|
||
/*************************************************
|
||
* 全局通用方法
|
||
* @param data 事实订单数据
|
||
*/
|
||
function useGlobalFunc() {
|
||
const bluetooth = new Bluetooth()
|
||
const playVoid = uni.createInnerAudioContext() // 创建音频实例
|
||
|
||
|
||
/*************************************************
|
||
* 退出登录
|
||
*/
|
||
function logOutFn() {
|
||
cleatStorage('token')
|
||
cleatStorage('userID')
|
||
cleatStorage('userType')
|
||
cleatStorage('storeID')
|
||
cleatStorage('storeName')
|
||
cleatStorage('userID2')
|
||
cleatStorage('mobile')
|
||
}
|
||
|
||
|
||
/*************************************************
|
||
* 获取实时订单数据
|
||
* @time 2023年2月1日 11点17分
|
||
* @param {data} 请求data数据
|
||
* @return {res} code:响应状态 data:响应数据 desc:错误信息
|
||
*/
|
||
async function globGetToDay(data: AnyObject) {
|
||
let orderNumber = await merchant.get_store_order_sale_info(data);
|
||
if (orderNumber.code == 0) {
|
||
return orderNumber.data
|
||
} else {
|
||
toast("实时订单数据异常", 2);
|
||
}
|
||
}
|
||
|
||
/*************************************************
|
||
* 查看详情图片
|
||
* @time 2023-02-01 11:18:09
|
||
* @param {}-
|
||
* @return {*}
|
||
*/
|
||
async function previewImage(url: string | Array<string>,index?:number) {
|
||
new Promise((resolve, reject) => {
|
||
uni.previewImage({
|
||
current: index ? index : typeof url === 'string' ? url : url[0],
|
||
urls: Array.isArray(url) ? url : [url],
|
||
longPressActions: {
|
||
itemList: ['保存图片'],
|
||
success(res) {
|
||
uni.showModal({
|
||
title: '相册权限使用说明',
|
||
content: '便于您保存图片与运营进行交流等场景中写入相册文件内容',
|
||
complete: (result) => {
|
||
if (result.confirm) {
|
||
uni.saveImageToPhotosAlbum({
|
||
filePath: Array.isArray(url) ? url[res.index] : url,
|
||
complete(r) {
|
||
if (r.errMsg === 'saveImageToPhotosAlbum:ok') {
|
||
toast('保存成功')
|
||
} else {
|
||
toast('保存失败')
|
||
}
|
||
}
|
||
})
|
||
}
|
||
}
|
||
})
|
||
}
|
||
},
|
||
success: (res: any) => {
|
||
resolve(res)
|
||
},
|
||
fail: (err: any) => {
|
||
toast(err)
|
||
reject(err)
|
||
}
|
||
})
|
||
})
|
||
}
|
||
|
||
|
||
/*************************************************
|
||
* 存储用户信息
|
||
* @param {object} [data] 用户信息数据
|
||
*/
|
||
let serveInfoTimer: any = null
|
||
async function setUserInfo(data: AnyObject) {
|
||
setStorage("token", data.token);
|
||
setStorage("userID", data.userID);
|
||
setStorage("userID2", data.userID2);
|
||
setStorage("mobile", data.mobile);
|
||
jx_default_storage_plugin()
|
||
// 防止ios app 出现认证信息还没有缓存就已经跳转请求了
|
||
|
||
let storeRes = await login.get_my_store_list({ version: '1.3.5' })
|
||
let dataList = storeRes.data || []
|
||
if (dataList.length == 0) {
|
||
return uni.jxAlert({
|
||
title: '提示',
|
||
content: '该账号未绑定门店,请联系运营绑定,加盟联系电话18048531223'
|
||
})
|
||
}
|
||
if (dataList.length == 1) {
|
||
let data = dataList[0]
|
||
setStorage("storeID", data.id);
|
||
setStorage('storeName', data.name)
|
||
uni.switchTab({ url: '/pages/merchant/index' })
|
||
return
|
||
}
|
||
|
||
clearTimeout(serveInfoTimer)
|
||
serveInfoTimer = setTimeout(() => {
|
||
uni.navigateTo({
|
||
url: "/subPages/switchStore/switchStore",
|
||
animationType: 'slide-in-top',
|
||
animationDuration: 500
|
||
})
|
||
}, 0)
|
||
}
|
||
|
||
|
||
/*************************************************
|
||
* app 微信登录
|
||
* @bangding {Function} 绑定
|
||
* @seccess {Function} 登录成功
|
||
*/
|
||
type appWxLoginType = {
|
||
bangding?: Function
|
||
success?: Function
|
||
}
|
||
function appWxLogin(options: appWxLoginType) {
|
||
if (plus.runtime.isApplicationExist({ pname: 'com.tencent.mm', action: 'weixin://' })) { // 判断用户是否安装了微信
|
||
// 微信开放平台的应用标识
|
||
// 预登录
|
||
let weixinService: AnyObject
|
||
plus.oauth.getServices((services) => {
|
||
if (services && services.length) {
|
||
for (var i = 0, len = services.length; i < len; i++) {
|
||
if (services[i].id === 'weixin') {
|
||
weixinService = services[i]
|
||
break
|
||
}
|
||
}
|
||
// 如果没有获取到微信服务,则退出授权
|
||
if (!weixinService) {
|
||
return uni.jxAlert({
|
||
title: '登录失败',
|
||
content: '请先下载微信',
|
||
})
|
||
}
|
||
|
||
// 进行微信授权,拿到 code
|
||
weixinService.authorize(async (event: AnyObject) => {
|
||
//此处获取code的关键
|
||
let data = {
|
||
authType: "weixinapp",
|
||
authSecret: event.code,
|
||
}
|
||
// event.code 发给后端验证,验证成功后处理业务
|
||
let res = await login.applets_login(data)
|
||
console.log('ZSW-res', res);
|
||
if (res.code == 0) {
|
||
// 第一次登录绑定手机号码
|
||
if (res.data.tokenType == 2) {
|
||
options.bangding && options.bangding(res.data.token)
|
||
}
|
||
|
||
// 登录成功
|
||
if (res.data.tokenType != 2) {
|
||
options.success && options.success(res.data)
|
||
}
|
||
} else {
|
||
if ((res.desc).indexOf('row') == -1) {
|
||
uni.jxAlert({
|
||
title: '提示',
|
||
content: `登录失败:${res.desc || res.data}`
|
||
})
|
||
} else {
|
||
uni.jxAlert({
|
||
title: '提示',
|
||
content: `登录失败:对不起该账号未绑定门店,请联系官方客服进行绑定!`
|
||
})
|
||
}
|
||
|
||
}
|
||
})
|
||
} else {
|
||
uni.jxAlert({
|
||
title: '提示',
|
||
content: '本机不支持微信登录',
|
||
})
|
||
}
|
||
})
|
||
} else {
|
||
uni.jxAlert({
|
||
title: '提示',
|
||
content: '请先下载微信',
|
||
})
|
||
}
|
||
}
|
||
|
||
|
||
/*************************************************
|
||
* 全局判断是否有新信息,有信息就在tabar显示
|
||
*/
|
||
async function newMessage() {
|
||
let data = {
|
||
storeIDs: JSON.stringify([+getStorage('storeID')]),
|
||
fromReadCount: 0,
|
||
toReadCount: 0,
|
||
offset: 0,
|
||
pageSize: -1,
|
||
fromTime:
|
||
timeFormatD(+new Date() - 7 * 24 * 60 * 60 * 1000) + ' 00:00:00',
|
||
toTime: timeFormatD(+new Date()) + ' 23:59:59',
|
||
}
|
||
let msgRes = await merchant.Get_store_message_statuses(data)
|
||
if (msgRes.code == 0) {
|
||
let num = msgRes.data.totalCount
|
||
|
||
// 没有信息,移除
|
||
if (num == 0) {
|
||
store.commit('storeInfo/setIsNewMessage', false)
|
||
uni.removeTabBarBadge({ index: 3 })
|
||
} else {
|
||
store.commit('storeInfo/setIsNewMessage', true)
|
||
// 有信息显示
|
||
uni.setTabBarBadge({
|
||
index: 3,
|
||
text: num > 100 ? '99+' : '' + num,
|
||
})
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
/**************************************************************
|
||
* 复制订单信息内容
|
||
* @param {String} data 需要复制的内容
|
||
* @param {String} [text] 复制成功提示内容(非必填)
|
||
* @param {string} [errorT] 复制失败提示内容(非必填)
|
||
*/
|
||
function copyInfo(data: string, text = '复制成功', errorT = '复制失败') {
|
||
uni.setClipboardData({
|
||
data: data,
|
||
success() {
|
||
toast(text)
|
||
},
|
||
fail() {
|
||
toast(errorT)
|
||
}
|
||
})
|
||
}
|
||
|
||
|
||
/************************************************************
|
||
* 拨打电话
|
||
* @param {string} phoneNumber 将要拨号的手机号
|
||
* @param {String} [text] 拨号成功提示内容(非必填)
|
||
* @param {string} [errorT] 拨号失败提示内容(非必填)
|
||
*/
|
||
function phoneCall(phoneNumber: string, text = '拨号完成', errorT = '取消拨号') {
|
||
uni.jxConfirm({
|
||
title: '拨打电话权限说明',
|
||
content: '便于您快速地跳到拨号界面与运营进行交流',
|
||
success() {
|
||
uni.makePhoneCall({
|
||
phoneNumber: phoneNumber,
|
||
success() {
|
||
console.log(text)
|
||
},
|
||
fail() {
|
||
toast(errorT)
|
||
}
|
||
})
|
||
}
|
||
})
|
||
|
||
}
|
||
|
||
|
||
/*************************************************
|
||
* 打开微信小程序
|
||
* @param {string} [url] 跳转地址
|
||
* @param {string} [id] 小程序原始ID
|
||
*/
|
||
function openWeixin(url: string, id = 'gh_e9161397303e') {
|
||
if (plus.runtime.isApplicationExist({ pname: 'com.tencent.mm', action: 'weixin://' })) { // 判断用户是否安装了微信
|
||
// 跳转到微信小程序进行物料申请
|
||
plus.share.getServices(function (res) {
|
||
var sweixin = null;
|
||
for (var i = 0; i < res.length; i++) {
|
||
var t: AnyObject = res[i];
|
||
if (t.id == 'weixin') {
|
||
sweixin = t;
|
||
}
|
||
}
|
||
if (sweixin) {
|
||
sweixin.launchMiniProgram({
|
||
id: id, //这里写你的小程序原始id(以gh开头)
|
||
type: 0, //这里是不同的环境( 0-正式版; 1-测试版; 2-体验版。 默认值为0。)
|
||
path: url, //这里是指 定页的路径,如需传参直接字符串拼接(首页可以省略)
|
||
});
|
||
}
|
||
}, function (res) {
|
||
uni.jxAlert({
|
||
title: '提示',
|
||
content: '打开小程序失败',
|
||
})
|
||
});
|
||
} else {
|
||
uni.jxAlert({
|
||
title: '温馨提示',
|
||
content: '请先下载微信',
|
||
})
|
||
}
|
||
}
|
||
|
||
|
||
/*************************************************
|
||
* 判断门店是否在营业中
|
||
* @param {any} [newTime] 需要判断的时间
|
||
*/
|
||
function isTrades(newTime: any): boolean {
|
||
let storeInfo = newStore.state.storeInfo.allStoreInfo
|
||
let businessTime: Array<any> = []
|
||
businessTime[0] = storeInfo.openTime1
|
||
businessTime[1] = storeInfo.closeTime1
|
||
businessTime[2] = storeInfo.openTime2
|
||
businessTime[3] = storeInfo.closeTime2
|
||
|
||
// 获取当前时间进行比较
|
||
let honer = newTime.getHours()
|
||
let minutes = newTime.getMinutes() < 10 ? '0' + newTime.getMinutes() : newTime.getMinutes()
|
||
let time: number = +(String(honer) + String(minutes))
|
||
if (
|
||
(time >= businessTime[0] && time <= businessTime[1]) || (time >= businessTime[2] && time <= businessTime[3])
|
||
) {
|
||
return true // 未休息
|
||
} else {
|
||
return false // 休息中
|
||
}
|
||
}
|
||
|
||
|
||
/*************************************************
|
||
* 获取当前app是否选哟更新
|
||
* @return {Boolean} isUpdate 是否需要进行更行
|
||
*/
|
||
async function watchVersion(fn: Function) {
|
||
let res = await merchant.get_app_varsion({ appId: configCms.appId })
|
||
let systemInfo = uni.getSystemInfoSync()
|
||
let version = ''
|
||
let versions:AnyObject = {}
|
||
if(systemInfo.platform === 'android'){
|
||
versions = JSON.parse(res.data[0].value).update
|
||
version = versions.version
|
||
}else{
|
||
version = JSON.parse(res.data[0].value).other.appName.split(',')[1]
|
||
}
|
||
let versionInfo = compareVersions(version,systemInfo.appVersion)
|
||
if (versionInfo) {
|
||
fn && fn(true, versions)
|
||
} else {
|
||
fn && fn(false, versions)
|
||
}
|
||
}
|
||
|
||
function compareVersions(v1: string, v2: string) {
|
||
var regEx = /(\.0)+[^\.]*$/
|
||
var v1parts = v1.replace(regEx, '').split('.')
|
||
var v2parts = v2.replace(regEx, '').split('.')
|
||
for (var i = 0; i < v1parts.length; ++i) {
|
||
if (v2parts.length == i) {
|
||
return true
|
||
}
|
||
if (v1parts[i] == v2parts[i]) {
|
||
continue
|
||
} else if (v1parts[i] > v2parts[i]) {
|
||
return true
|
||
} else {
|
||
return false
|
||
}
|
||
}
|
||
if (v1parts.length != v2parts.length) {
|
||
return false
|
||
}
|
||
return false
|
||
}
|
||
|
||
|
||
/*************************************************
|
||
* 格式化今日订单数据
|
||
*/
|
||
function wholeCalcPrice(calcData: AnyObject) {
|
||
if (calcData.isPointStore) {
|
||
if (calcData.isNotQuote || calcData.isZero) {
|
||
return calcData.actualPayPrice
|
||
? (calcData.actualPayPrice / 100).toFixed(2)
|
||
: 0;
|
||
} else {
|
||
if (calcData.isUpperfif) {
|
||
return calcData.earningPrice
|
||
? (calcData.earningPrice / 100).toFixed(2)
|
||
: 0;
|
||
} else {
|
||
return "请按平台查看";
|
||
}
|
||
}
|
||
} else {
|
||
if (calcData.isUpperfif || calcData.isZero) {
|
||
return calcData.earningPrice
|
||
? (calcData.earningPrice / 100).toFixed(2)
|
||
: 0;
|
||
} else {
|
||
return "请按平台查看";
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
/*************************************************
|
||
* 格式化今日订单数据
|
||
*/
|
||
function singleCalcPrice(calcData: AnyObject) {
|
||
if (calcData.vendorPayPercentage != 0) {
|
||
if (calcData.vendorPayPercentage < 50) {
|
||
return (calcData.actualPayPrice / 100).toFixed(2)
|
||
} else {
|
||
return (calcData.earningPrice / 100).toFixed(2)
|
||
}
|
||
} else {
|
||
if (calcData.isPointStore) {
|
||
return (calcData.actualPayPrice / 100).toFixed(2)
|
||
} else {
|
||
return (calcData.earningPrice / 100).toFixed(2)
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
/*************************************************
|
||
* 查询打印机状态并连接
|
||
*/
|
||
function setPrinterStatus() {
|
||
// 获取打印机信息
|
||
let data: any = getStorage('commitBTDevCharact')
|
||
setInterval(() => {
|
||
let isPlay = store.state.storeInfo.isConnectPrinter
|
||
// 判断打印机是否在线
|
||
util.notifyBLEState(data.deviceId, data.serviceId, data.uuid)
|
||
.then(async (res) => {
|
||
if (res != 12) {
|
||
console.log('连接失败')
|
||
await bluetooth.reconnect()
|
||
if (!isPlay) return
|
||
playVoidFn()
|
||
store.commit('storeInfo/setIsConnectPrinter', false)
|
||
} else {
|
||
console.log('连接正常')
|
||
store.commit('storeInfo/setIsConnectPrinter', true)
|
||
}
|
||
}).catch(async () => {
|
||
console.log('连接失败')
|
||
await bluetooth.reconnect()
|
||
if (!isPlay) return
|
||
playVoidFn()
|
||
store.commit('storeInfo/setIsConnectPrinter', false)
|
||
})
|
||
}, 1000 * 20)
|
||
}
|
||
// 播放音频
|
||
function playVoidFn() {
|
||
playVoid.src = '/static/audio/close_printer.mp3'
|
||
playVoid.stop()
|
||
playVoid.play()
|
||
}
|
||
|
||
// ******************** 判断是否有淘鲜达 *****************************
|
||
//#region
|
||
const storeMaps = computed(() => {
|
||
return store.state.storeInfo.allStoreInfo
|
||
})
|
||
// function isTxd() {
|
||
// let state = false
|
||
// storeMaps.value.StoreMaps.forEach((item: AnyObject) => {
|
||
// if (item.vendorID == 16) {
|
||
// state = true
|
||
// }
|
||
// })
|
||
// return state
|
||
// }
|
||
//#endregion
|
||
|
||
/**
|
||
* 查询美团/饿百的IM状态
|
||
*/
|
||
const getMtStoreIMStatus = async () => {
|
||
let mtStore = isExistPlatformID(1)
|
||
let ebStore = isExistPlatformID(3)
|
||
let data = []
|
||
if (mtStore && mtStore.length > 0) {
|
||
data.push({
|
||
vendorID: 1,
|
||
vendorOrgCode: mtStore[0].vendorOrgCode + '',
|
||
vendorStoreID: mtStore[0].vendorStoreID + ''
|
||
})
|
||
}
|
||
|
||
if (ebStore && ebStore.length > 0) data.push({
|
||
vendorID: 3,
|
||
vendorOrgCode: ebStore[0].vendorOrgCode + '',
|
||
vendorStoreID: ebStore[0].vendorStoreID + ''
|
||
})
|
||
if (data.length === 0) return
|
||
let res = await merchant.get_mt_store_im_status({ data: JSON.stringify(data) })
|
||
let arr: any = []
|
||
if (res.code === '0') {
|
||
|
||
res.data.forEach((item: AnyObject) => {
|
||
if (item.errMsg && item.errMsg) arr.push({
|
||
...item,
|
||
vendorID: +item.errMsg.substring(0, 1)
|
||
})
|
||
else arr.push({ ...item })
|
||
})
|
||
}
|
||
store.commit('storeInfo/setImOnlineStatus', arr)
|
||
}
|
||
|
||
/**
|
||
* 是否存在某个平台
|
||
*/
|
||
function isExistPlatformID(platformID: number) {
|
||
return storeMaps.value.StoreMaps.filter((item: AnyObject) => item.vendorID == platformID)
|
||
}
|
||
|
||
|
||
/**
|
||
* 是否含有聊天表情
|
||
*/
|
||
function isCloudEmoji(emoji: string) {
|
||
let emojiArr = emoji.match(/\[(.+?)\]/g)
|
||
return emojiArr && emojiArr.length > 0 ? true : false
|
||
}
|
||
|
||
interface emojiType {
|
||
type: string,
|
||
text: string,
|
||
emoji: string
|
||
}
|
||
|
||
/**
|
||
* 解析emoji数据
|
||
*/
|
||
function analyEmoji(emoji: string) {
|
||
if (!isCloudEmoji(emoji)) {
|
||
return [
|
||
{
|
||
type: 'text',
|
||
text: emoji,
|
||
emoji: ''
|
||
}
|
||
]
|
||
}
|
||
|
||
// emoji = '[大哭][大哭][大哭][大哭][心碎][心碎][心碎]11111顶顶顶顶呃零零零零[流泪]iiiihdhggydgjfg kevbuygbhjbnb'
|
||
|
||
let arr: emojiType[] = []
|
||
|
||
let emojiArr: string[] = emoji.match(/\[(.+?)\]/g) || []
|
||
if (emojiArr && emojiArr.length > 0) {
|
||
emojiArr.map((item, index) => {
|
||
let emojiImg = emojiAnanlyze(item) // 返回的emoji解析数据
|
||
if (emojiImg === item) emojiImg = 'unknown:' + emoji // 未知表情
|
||
let indexOf = emoji.indexOf(item) // item在聊天emoji中的位置
|
||
|
||
if (indexOf === 0) {
|
||
// emoji
|
||
arr.push({
|
||
type: 'emoji',
|
||
text: '',
|
||
emoji: emojiImg
|
||
})
|
||
|
||
// emoji之后的文字
|
||
let afterSymbol = emoji.substring(indexOf + item.length, indexOf + item.length + 1)
|
||
if (afterSymbol !== '[' && afterSymbol.length > 0 && index === emojiArr.length - 1) {
|
||
arr.push({
|
||
type: 'text',
|
||
text: emoji.substring(indexOf + item.length),
|
||
emoji: ''
|
||
})
|
||
}
|
||
} else {
|
||
// emoji之前的文字
|
||
arr.push({
|
||
type: 'text',
|
||
text: emoji.substring(0, indexOf),
|
||
emoji: ''
|
||
})
|
||
|
||
// emoji
|
||
arr.push({
|
||
type: 'emoji',
|
||
text: '',
|
||
emoji: emojiImg
|
||
})
|
||
|
||
// emoji之后的文字
|
||
let afterSymbol = emoji.substring(indexOf + item.length, indexOf + item.length + 1)
|
||
if (afterSymbol !== '[' && afterSymbol.length > 0 && index === emojiArr.length - 1) {
|
||
arr.push({
|
||
type: 'text',
|
||
text: emoji.substring(indexOf + item.length),
|
||
emoji: ''
|
||
})
|
||
}
|
||
}
|
||
emoji = emoji.replace(emoji.substring(0, indexOf + item.length), '') // 清除已处理完的数据
|
||
})
|
||
}
|
||
return arr || []
|
||
}
|
||
|
||
return {
|
||
logOutFn, // 全局公用方法
|
||
globGetToDay, // 获取实时订单数据
|
||
previewImage, // 查看详情图
|
||
setUserInfo, // 储存用户信息
|
||
appWxLogin, // app 微信登录
|
||
openWeixin, // 打开微信小程序
|
||
watchVersion, // 检查是否有新版本
|
||
newMessage, // 展示新信息
|
||
copyInfo, // 复制信息
|
||
phoneCall, // 拨打电话
|
||
isTrades, // 判断是否是在营业时间
|
||
wholeCalcPrice, // 格式化今日订单数据
|
||
singleCalcPrice, // 格式化今日订单数据
|
||
setPrinterStatus, // 查询打印机状态并连接
|
||
// isTxd, // 判断是否有淘鲜达
|
||
getMtStoreIMStatus, // 获取美团IM单聊状态
|
||
isExistPlatformID, // 是否含有平台门店
|
||
analyEmoji, // 解析emoji表情
|
||
isCloudEmoji // 是否含有emoji
|
||
}
|
||
}
|
||
|
||
|
||
export default useGlobalFunc |