first commit

This commit is contained in:
wtq
2025-11-13 10:16:36 +08:00
commit cbdb6758a0
394 changed files with 57767 additions and 0 deletions

View File

@@ -0,0 +1,665 @@
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