diff --git a/src/api/mall/promotion/kefu/conversation/index.ts b/src/api/mall/promotion/kefu/conversation/index.ts index 1b8d53895413f631f0104a131fc057e06e87f24e..eb6eb9c9e976ebfc1c89fa55afa821f2009a324a 100644 --- a/src/api/mall/promotion/kefu/conversation/index.ts +++ b/src/api/mall/promotion/kefu/conversation/index.ts @@ -21,6 +21,10 @@ export const KeFuConversationApi = { getConversationList: async () => { return await request.get({ url: '/promotion/kefu-conversation/list' }) }, + // 获得客服会话 + getConversation: async (id: number) => { + return await request.get({ url: `/promotion/kefu-conversation/get?id=` + id }) + }, // 客服会话置顶 updateConversationPinned: async (data: any) => { return await request.put({ @@ -30,6 +34,6 @@ export const KeFuConversationApi = { }, // 删除客服会话 deleteConversation: async (id: number) => { - return await request.delete({ url: `/promotion/kefu-conversation/delete?id=${id}`}) + return await request.delete({ url: `/promotion/kefu-conversation/delete?id=${id}` }) } } diff --git a/src/api/mall/promotion/kefu/message/index.ts b/src/api/mall/promotion/kefu/message/index.ts index a12167fabda53e8752c231c616685ae112d8ad65..4c3bed88782bef7cfe96652ba8d3676be83e4eda 100644 --- a/src/api/mall/promotion/kefu/message/index.ts +++ b/src/api/mall/promotion/kefu/message/index.ts @@ -29,8 +29,8 @@ export const KeFuMessageApi = { url: '/promotion/kefu-message/update-read-status?conversationId=' + conversationId }) }, - // 获得消息分页数据 - getKeFuMessagePage: async (params: any) => { - return await request.get({ url: '/promotion/kefu-message/page', params }) + // 获得消息列表(流式加载) + getKeFuMessageList: async (params: any) => { + return await request.get({ url: '/promotion/kefu-message/list', params }) } } diff --git a/src/store/modules/mall/kefu.ts b/src/store/modules/mall/kefu.ts new file mode 100644 index 0000000000000000000000000000000000000000..2aecee0d56d4a44da8c47a3f05d34bfc78ae5a7f --- /dev/null +++ b/src/store/modules/mall/kefu.ts @@ -0,0 +1,81 @@ +import { store } from '@/store' +import { defineStore } from 'pinia' +import { KeFuConversationApi, KeFuConversationRespVO } from '@/api/mall/promotion/kefu/conversation' +import { KeFuMessageRespVO } from '@/api/mall/promotion/kefu/message' +import { isEmpty } from '@/utils/is' + +interface MallKefuInfoVO { + conversationList: KeFuConversationRespVO[] // 会话列表 + conversationMessageList: Map // 会话消息 +} + +export const useMallKefuStore = defineStore('mall-kefu', { + state: (): MallKefuInfoVO => ({ + conversationList: [], + conversationMessageList: new Map() // key 会话,value 会话消息列表 + }), + getters: { + getConversationList(): KeFuConversationRespVO[] { + return this.conversationList + }, + getConversationMessageList(): (conversationId: number) => KeFuMessageRespVO[] | undefined { + return (conversationId: number) => this.conversationMessageList.get(conversationId) + } + }, + actions: { + // ======================= 会话消息相关 ======================= + /** 缓存历史消息 */ + saveMessageList(conversationId: number, messageList: KeFuMessageRespVO[]) { + this.conversationMessageList.set(conversationId, messageList) + }, + + // ======================= 会话相关 ======================= + /** 加载会话缓存列表 */ + async setConversationList() { + this.conversationList = await KeFuConversationApi.getConversationList() + this.conversationSort() + }, + /** 更新会话缓存已读 */ + async updateConversationStatus(conversationId: number) { + if (isEmpty(this.conversationList)) { + return + } + const conversation = this.conversationList.find((item) => item.id === conversationId) + conversation && (conversation.adminUnreadMessageCount = 0) + }, + /** 更新会话缓存 */ + async updateConversation(conversationId: number) { + if (isEmpty(this.conversationList)) { + return + } + + const conversation = await KeFuConversationApi.getConversation(conversationId) + this.deleteConversation(conversationId) + conversation && this.conversationList.push(conversation) + this.conversationSort() + }, + /** 删除会话缓存 */ + deleteConversation(conversationId: number) { + const index = this.conversationList.findIndex((item) => item.id === conversationId) + // 存在则删除 + if (index > -1) { + this.conversationList.splice(index, 1) + } + }, + conversationSort() { + // 按置顶属性和最后消息时间排序 + this.conversationList.sort((a, b) => { + // 按照置顶排序,置顶的会在前面 + if (a.adminPinned !== b.adminPinned) { + return a.adminPinned ? -1 : 1 + } + // 按照最后消息时间排序,最近的会在前面 + return (b.lastMessageTime as unknown as number) - (a.lastMessageTime as unknown as number) + }) + } + } +}) + +export const useMallKefuStoreWithOut = () => { + return useMallKefuStore(store) +} diff --git a/src/views/mall/promotion/components/SpuSelect.vue b/src/views/mall/promotion/components/SpuSelect.vue index fd7dffe015c578ba521cc4646adc09e8e5578d3e..648a86356591e4ecd64ce6d399bed4d5146054fd 100644 --- a/src/views/mall/promotion/components/SpuSelect.vue +++ b/src/views/mall/promotion/components/SpuSelect.vue @@ -115,7 +115,7 @@ import { getPropertyList, PropertyAndValues, SkuList } from '@/views/mall/produc import { ElTable } from 'element-plus' import { dateFormatter } from '@/utils/formatTime' import { createImageViewer } from '@/components/ImageViewer' -import { formatToFraction } from '@/utils' +import { floatToFixed2, formatToFraction } from '@/utils' import { defaultProps, handleTree } from '@/utils/tree' import * as ProductCategoryApi from '@/api/mall/product/category' @@ -228,6 +228,13 @@ const expandChange = async (row: ProductSpuApi.Spu, expandedRows?: ProductSpuApi } // 获取 SPU 详情 const res = (await ProductSpuApi.getSpu(row.id as number)) as ProductSpuApi.Spu + res.skus?.forEach((item) => { + item.price = floatToFixed2(item.price) + item.marketPrice = floatToFixed2(item.marketPrice) + item.costPrice = floatToFixed2(item.costPrice) + item.firstBrokeragePrice = floatToFixed2(item.firstBrokeragePrice) + item.secondBrokeragePrice = floatToFixed2(item.secondBrokeragePrice) + }) propertyList.value = getPropertyList(res) spuData.value = res isExpand.value = true diff --git a/src/views/mall/promotion/kefu/components/KeFuConversationList.vue b/src/views/mall/promotion/kefu/components/KeFuConversationList.vue index 6e0112312da5f7a73c20dcd7c6ad89d9cf003aee..075edc33e2c23f973be183fd4b436f66fd69e138 100644 --- a/src/views/mall/promotion/kefu/components/KeFuConversationList.vue +++ b/src/views/mall/promotion/kefu/components/KeFuConversationList.vue @@ -1,10 +1,13 @@ diff --git a/src/views/mall/promotion/kefu/components/history/MemberBrowsingHistory.vue b/src/views/mall/promotion/kefu/components/history/MemberBrowsingHistory.vue deleted file mode 100644 index 52c1095b53f9af8932fce44b281798b0d9095394..0000000000000000000000000000000000000000 --- a/src/views/mall/promotion/kefu/components/history/MemberBrowsingHistory.vue +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - diff --git a/src/views/mall/promotion/kefu/components/index.ts b/src/views/mall/promotion/kefu/components/index.ts index 585d0da7a89e9be7b757c9313060c8cb16cc9106..0f60a6e4be6dc639bea6e129d06f73379cbbc77b 100644 --- a/src/views/mall/promotion/kefu/components/index.ts +++ b/src/views/mall/promotion/kefu/components/index.ts @@ -1,5 +1,5 @@ import KeFuConversationList from './KeFuConversationList.vue' import KeFuMessageList from './KeFuMessageList.vue' -import MemberBrowsingHistory from './history/MemberBrowsingHistory.vue' +import MemberInfo from './member/MemberInfo.vue' -export { KeFuConversationList, KeFuMessageList, MemberBrowsingHistory } +export { KeFuConversationList, KeFuMessageList, MemberInfo } diff --git a/src/views/mall/promotion/kefu/components/member/MemberInfo.vue b/src/views/mall/promotion/kefu/components/member/MemberInfo.vue new file mode 100644 index 0000000000000000000000000000000000000000..849992b32faa410178783b47ecba7df7ab09dcf9 --- /dev/null +++ b/src/views/mall/promotion/kefu/components/member/MemberInfo.vue @@ -0,0 +1,252 @@ + + + + + + diff --git a/src/views/mall/promotion/kefu/components/history/OrderBrowsingHistory.vue b/src/views/mall/promotion/kefu/components/member/OrderBrowsingHistory.vue similarity index 100% rename from src/views/mall/promotion/kefu/components/history/OrderBrowsingHistory.vue rename to src/views/mall/promotion/kefu/components/member/OrderBrowsingHistory.vue diff --git a/src/views/mall/promotion/kefu/components/history/ProductBrowsingHistory.vue b/src/views/mall/promotion/kefu/components/member/ProductBrowsingHistory.vue similarity index 95% rename from src/views/mall/promotion/kefu/components/history/ProductBrowsingHistory.vue rename to src/views/mall/promotion/kefu/components/member/ProductBrowsingHistory.vue index 8bc4aeaf56fa4ce98a906e9cb10a9a8299ea0160..a9b38561217b1db95f651fe0574ef3cdea76a720 100644 --- a/src/views/mall/promotion/kefu/components/history/ProductBrowsingHistory.vue +++ b/src/views/mall/promotion/kefu/components/member/ProductBrowsingHistory.vue @@ -1,15 +1,14 @@ diff --git a/src/views/mall/promotion/kefu/components/message/OrderItem.vue b/src/views/mall/promotion/kefu/components/message/OrderItem.vue index c50d7c5d321ed5f3f4742cec58dfb5494dc815e1..9385f10bc30a29781531c2ebf704f82cc514d3fa 100644 --- a/src/views/mall/promotion/kefu/components/message/OrderItem.vue +++ b/src/views/mall/promotion/kefu/components/message/OrderItem.vue @@ -14,11 +14,11 @@
@@ -112,14 +112,14 @@ function formatOrderStatus(order: any) { border-radius: 10px; padding: 10px; border: 1px var(--el-border-color) solid; - background-color: var(--app-content-bg-color); + background-color: #fff; // 透明色,暗黑模式下也能体现 .order-card-header { height: 28px; + font-weight: bold; .order-no { - font-size: 12px; - font-weight: 500; + font-size: 13px; span { &:hover { @@ -128,27 +128,29 @@ function formatOrderStatus(order: any) { } } } + + .order-state { + font-size: 13px; + } } .pay-box { padding-top: 10px; + font-weight: bold; .discounts-title { font-size: 16px; line-height: normal; - color: #999999; } .discounts-money { font-size: 16px; line-height: normal; - color: #999; font-family: OPPOSANS; } .pay-color { font-size: 13px; - color: var(--left-menu-text-color); } } } diff --git a/src/views/mall/promotion/kefu/components/message/ProductItem.vue b/src/views/mall/promotion/kefu/components/message/ProductItem.vue index 4e59365b9d095f0f222d9e3c5f6b291696e9b682..bc6cd979897040c086cbeb9aebbb1fa3f25cd8ae 100644 --- a/src/views/mall/promotion/kefu/components/message/ProductItem.vue +++ b/src/views/mall/promotion/kefu/components/message/ProductItem.vue @@ -1,51 +1,27 @@ - -