This commit is contained in:
wtq
2025-11-13 14:42:30 +08:00
commit 7d879ff3bc
349 changed files with 54558 additions and 0 deletions

209
src/pages/message/index.ts Normal file
View File

@@ -0,0 +1,209 @@
import toast from '@/utils/toast'
import { onPullDownRefresh, onShow } from '@dcloudio/uni-app'
import { computed, ref } from 'vue'
import { store } from "@/store"
import { Decrypt, timeFormatDHM } from '@/utils/tools'
import message from '@/api/https/message'
import order from '@/api/https/order'
import useGlobalFunc from "@/composables/useGlobalFunc"
// import { msgInfo } from '@/api/mockData/index'
/*************************************************
* IM消息
*/
const messageFn = function () {
// vuex
const { getMtStoreIMStatus } = useGlobalFunc()
// 用户列表
const userListData = ref<Array<AnyObject>>([])
/*************************************************
* 获取用户列表
*/
onShow(() => {
if (isFirstLogin.value) return
userListData.value = []
getMTUserList()
})
const isFirstLogin = computed(() => {
// 是否没有登陆的状态
return store.state.serveInfo.isFirstLogin
})
/**
* 整理参数信息,避免请求出错
*/
async function dataParams() {
let arr:any = []
let brr = store.getters['storeInfo/platformInfo']
if(brr && brr.length>0){
let mtVendorIDInfo = brr.find((item:AnyObject) => item.vendorID === 1)
let ebVendorIDInfo = brr.find((item:AnyObject) => item.vendorID === 3)
if(mtVendorIDInfo){
arr.push({
vendorStoreID: mtVendorIDInfo.vendorStoreID,
vendorID: "1",
appID: mtVendorIDInfo.vendorOrgCode
})
}
if(ebVendorIDInfo){
arr.push({
vendorStoreID: ebVendorIDInfo.vendorStoreID,
vendorID: "3",
appID: ebVendorIDInfo.vendorOrgCode
})
}
}
return arr
}
// 获取美团IM
async function getMTUserList(time?:number) {
let arr = await dataParams()
if(!(arr && arr.length>0)) return
let data = {
payLoad:JSON.stringify(arr)
}
let venderIDInfo = arr.find((item:AnyObject) => item.vendorID === '1')
let ebStore = arr.find((item:AnyObject) => item.vendorID === '3')
let res = await message.get_IM_user_list(data)
// res = msgInfo.userList // 模拟数据
// console.log('获取用户列表', res)
if (res.code == 0) {
if (JSON.stringify(res.data) === '{}') return
let platformID = venderIDInfo.appID // 美团账号
let newArr: any = []
// let fmtUserList = res.data[`${venderIDInfo.appID}:${venderIDInfo.vendorStoreID}:1`] || [] // 美团
let fmtUserList = venderIDInfo ? res.data[`${venderIDInfo.appID}:${venderIDInfo.vendorStoreID}:1`] || [] : [] // 美团
let febUserList = ebStore && JSON.stringify(ebStore) !== '{}' ? res.data[`${ebStore.appID}:${ebStore.vendorStoreID}:3`] || [] : [] // 饿百
let reverseList = fmtUserList && fmtUserList.length > 0 ? fmtUserList.reverse() : []
let reverseListEb = febUserList && febUserList.length > 0 ? febUserList.reverse() : []
reverseList.map((element: any) => {
let resData = JSON.parse(element)
// 判断是否需要显示列表
if (Decrypt(resData.latestMsg, platformID).indexOf('[自动回复]') == -1) {
let latestMsgHandler = ''
try {
JSON.parse(Decrypt(resData.latestMsg, platformID))
latestMsgHandler = typeof JSON.parse(Decrypt(resData.latestMsg, platformID)) === 'number' ? Decrypt(resData.latestMsg, platformID) : '【订单】'
} catch (error) {
let msg = Decrypt(resData.latestMsg, platformID)
if (msg == '') latestMsgHandler = '【商品】'
else {
if (!(msg.includes('https') || msg.includes('http'))) latestMsgHandler = msg
else latestMsgHandler = msg.indexOf('.amr') == -1 ? '【图片】' : '【语音】'
}
}
// if (resData.userID != 0) {
// 只展示6个小时以内的消息
let userList = {
...resData,
latestMsg: latestMsgHandler,
latestTime: timeFormatDHM(+new Date(resData.latestTime * 1000)),
orderInfo: {},
orderDesc: ''
}
newArr.push(userList)
// 获取订单信息
// if (userList.orderID) getOrderInfo(userList.orderID, index)
if (userList.orderID) getOrderInfo(userList.orderID, newArr.length - 1)
// }
}
})
// 饿百
reverseListEb.map((element: any, index: number) => {
let resData = JSON.parse(element)
let latestMsgHandler = JSON.parse(resData.latestMsg).text ? JSON.parse(resData.latestMsg).text : JSON.parse(resData.latestMsg).duration ? '【语音】' : '【图片】'
// let isAddUserLiset = JSON.parse(resData.latestMsg).data && JSON.parse(JSON.parse(resData.latestMsg).data).title.includes('本次服务已经完成,会话暂停') ? false : true
if (JSON.parse(resData.latestMsg).elements && JSON.parse(resData.latestMsg).elements.length > 0) {
let findItem = JSON.parse(resData.latestMsg).elements.filter((item: { elementType: number }) => item.elementType === 1)
latestMsgHandler = findItem && findItem.length > 0 ? JSON.parse(findItem[0].elementContent).text.replace('@商家', '') : latestMsgHandler
}
// 饿百参考文档https://open-retail.ele.me/#/apidoc/me.ele.retail:im.message.send-3?aopApiCategory=IM_all&type=api_menu resData.userID != 0 && isAddUserLiset
if ((new Date().getTime() - resData.latestTime * 1000) <= (3600 * 1000 * 12 * 1) ) {
let userList = {
...resData,
latestMsg: latestMsgHandler,
latestTime: timeFormatDHM(+new Date(resData.latestTime * 1000)),
orderInfo: {},
orderDesc: ''
}
newArr.push(userList)
// 获取订单信息
// if (userList.orderID) getOrderInfo(userList.orderID, index)
if (userList.orderID) getOrderInfo(userList.orderID, newArr.length - 1 )
}
})
userListData.value = newArr
} else {
toast('获取信息异常')
userListData.value.length == 0
}
}
/**
* 获取订单信息
*/
async function getOrderInfo(orderId: string, index: number) {
let res = await order.get_orders({ vendorOrderID: orderId })
if (res.code === '0') {
userListData.value[index].orderInfo = res.data.data[0]
userListData.value[index].orderDesc = ` #${res.data.data[0].orderSeq}`
}
}
/**
* 下拉刷新
*/
let onPullDownRefreshTimer: any = null
onPullDownRefresh(() => {
clearTimeout(onPullDownRefreshTimer)
onPullDownRefreshTimer = setTimeout(async () => {
getMtStoreIMStatus() // 刷新美团门店IM单聊状态
// 获取用户列表
getMTUserList()
clearTimeout(onPullDownRefreshTimer)
}, 500)
})
/*************************************************
* 进入聊天页面
*/
function charItem(item: AnyObject) {
item.latestMsg = ""
uni.navigateTo({
url: `/subPages/messageChild/msgChat/msgChat?data=${JSON.stringify(item)}`,
})
}
/*************************************************
* 进入设置页面
*/
function jumpToSetUp() {
uni.navigateTo({
url: `/subPages/merchantChild/setUp/setUp`,
})
}
return {
charItem, // 进入聊天页面
userListData, // 用户列表
jumpToSetUp, // 跳到设置页面
store
}
}
export default messageFn

View File

@@ -0,0 +1,76 @@
<template>
<!-- 美团授权已过期 -->
<!-- <jx-empty v-if="imOnlineStatus === -1" title="美团授权已过期" /> -->
<!-- IM状态 -->
<view v-if="store.getters['storeInfo/imStatus']" style="position:absolute;bottom:0;width:100%">
<view class="notice" @tap="jumpToSetUp">
<text>{{store.getters['storeInfo/imStatus']}}IM单聊状态未设置</text>
<jx-icon icon="gengduo" color="red"></jx-icon>
</view>
</view>
<!-- v-else -->
<!-- <template > -->
<!-- 用户列表 -->
<template v-if="userListData.length > 0">
<uni-list :border="false">
<view class="chat-border" v-for="item in userListData" :key="item.userID">
<uni-list-chat
:clickable="true"
@click="charItem(item)"
:avatar-circle="true"
:title="
item.vendorID == 1
? `【美团${item.orderDesc}】${item.userID === '0' ? '群发消息' : item.userID}`
: `【饿了么】${item.userID}`
"
:avatar="
item.vendorID == 1
? 'https://image.jxc4.com/image/75654ab606494a0efdb0cf7d7ad060d9.png'
: 'https://image.jxc4.com/image/6c2f1dfd95890df8ef5e27bde15c4e7f.png'
"
:note="item.latestMsg"
:time="item.latestTime"
badge-positon="left"
:badge-text="item.NewMessageNum"
/>
</view>
</uni-list>
</template>
<jx-empty v-else title="暂无消息" />
<!-- </template> -->
<!-- 公共组件 -->
<jx-login-empty title="马上登录,查看消息" />
<jx-loading />
</template>
<script lang="ts" setup >
import messageFn from './index'
const {
charItem, // 聊天详情
userListData, // 用户列表
jumpToSetUp, // 跳到设置页面
store
} = messageFn()
</script>
<style lang="scss" scoped>
.chat-border:nth-child(1) {
border-top: 2rpx solid rgb(230, 230, 230);
}
.chat-border {
border-bottom: 2rpx solid rgb(230, 230, 230);
}
.notice {
display: flex;
justify-content: space-between;
box-sizing: border-box;
width: 100%;
padding: 20rpx;
background-color: #fef5f6;
color: #e91d37;
font-size: 28rpx;
}
</style>