refactor(ckbox): 重构客服列表和联系人管理逻辑
- 将ctrlUserList重命名为kfUserList并优化相关接口 - 新增异步更新客服列表、联系人列表和会话列表的方法 - 重构联系人分组逻辑,支持按标签分组 - 优化会话列表排序规则,按最后更新时间降序排列 - 移除无用代码并简化组件逻辑
This commit is contained in:
@@ -1,61 +1,27 @@
|
||||
import { ContractData } from "../../pages/pc/ckbox/data";
|
||||
|
||||
//终端用户数据接口
|
||||
export interface CkChatCtrlUserData {
|
||||
/** 用户唯一标识ID */
|
||||
export interface KfUserListData {
|
||||
id: number;
|
||||
/** 租户ID(多租户系统中用于区分租户) */
|
||||
tenantId: number;
|
||||
/** 微信ID(用户微信账号唯一标识) */
|
||||
wechatId: string;
|
||||
/** 用户昵称 */
|
||||
nickname: string;
|
||||
/** 用户别名/备注名(自定义标识) */
|
||||
alias: string;
|
||||
/** 头像图片URL(阿里云OSS存储地址) */
|
||||
avatar: string;
|
||||
/**
|
||||
* 性别标识(0:未知/未设置,1:男,2:女,符合微信性别字段定义)
|
||||
* 原始数据中为0,此处标注可能的枚举值以便后续扩展
|
||||
*/
|
||||
gender: 0 | 1 | 2;
|
||||
/** 地区信息(原始数据为空字符串,未填写) */
|
||||
gender: number;
|
||||
region: string;
|
||||
/** 个性签名(原始数据为空字符串,未填写) */
|
||||
signature: string;
|
||||
/** 绑定的QQ号(0表示未绑定) */
|
||||
bindQQ: string;
|
||||
/** 绑定的邮箱(原始数据为空字符串,未绑定) */
|
||||
bindEmail: string;
|
||||
/** 绑定的手机号(原始数据为空字符串,未绑定) */
|
||||
bindMobile: string;
|
||||
/**
|
||||
* 用户创建时间(注册时间)
|
||||
* 格式:ISO 8601标准时间字符串(YYYY-MM-DDTHH:mm:ss.fffffff)
|
||||
*/
|
||||
createTime: string;
|
||||
/** 当前登录设备ID(关联用户使用的设备唯一标识) */
|
||||
currentDeviceId: number;
|
||||
/** 是否删除(逻辑删除标识,false:未删除,true:已删除) */
|
||||
isDeleted: boolean;
|
||||
/**
|
||||
* 删除时间(逻辑删除时记录,未删除时为默认初始时间"0001-01-01T00:00:00")
|
||||
* 格式:ISO 8601标准时间字符串
|
||||
*/
|
||||
deleteTime: string;
|
||||
/** 用户所属群组ID(用于群组分类管理) */
|
||||
groupId: number;
|
||||
/** 系统内对用户的备注信息(补充标识) */
|
||||
memo: string;
|
||||
/** 用户当前使用的微信版本号 */
|
||||
wechatVersion: string;
|
||||
/**
|
||||
* 用户标签列表(用于分类、筛选,涵盖:业务类型、互动记录、身份标识等维度)
|
||||
* 例如:"团队"(身份)、"未成交"(业务状态)、"抖音"(渠道)等
|
||||
*/
|
||||
labels: string[];
|
||||
/**
|
||||
* 最后更新时间(用户信息最近修改时间)
|
||||
* 格式:ISO 8601标准时间字符串
|
||||
*/
|
||||
lastUpdateTime: string;
|
||||
[key: string]: any;
|
||||
}
|
||||
@@ -102,6 +68,20 @@ export interface CkUserInfo {
|
||||
export interface CkChatState {
|
||||
userInfo: CkUserInfo | null;
|
||||
isLoggedIn: boolean;
|
||||
contractList: ContractData[];
|
||||
chatSessions: any[];
|
||||
kfUserList: KfUserListData[];
|
||||
getkfUserList: () => KfUserListData[];
|
||||
asyncKfUserList: (data: KfUserListData[]) => void;
|
||||
asyncContractList: (data: ContractData[]) => void;
|
||||
asyncChatSessions: (data: any[]) => void;
|
||||
deleteCtrlUser: (userId: number) => void;
|
||||
updateCtrlUser: (user: KfUserListData) => void;
|
||||
clearkfUserList: () => void;
|
||||
getChatSessions: () => any[];
|
||||
addChatSession: (session: any) => void;
|
||||
updateChatSession: (session: any) => void;
|
||||
deleteChatSession: (sessionId: string) => void;
|
||||
setUserInfo: (userInfo: CkUserInfo) => void;
|
||||
clearUserInfo: () => void;
|
||||
updateAccount: (account: Partial<CkAccount>) => void;
|
||||
|
||||
@@ -5,40 +5,50 @@ import {
|
||||
CkUserInfo,
|
||||
CkAccount,
|
||||
CkTenant,
|
||||
CkChatCtrlUserData,
|
||||
KfUserListData,
|
||||
} from "./ckchat.data";
|
||||
import { ContractData, GroupData } from "@/pages/pc/ckbox/data";
|
||||
export const useCkChatStore = createPersistStore<CkChatState>(
|
||||
set => ({
|
||||
userInfo: null,
|
||||
isLoggedIn: false,
|
||||
chatSessions: [],
|
||||
ctrlUserList: [],
|
||||
// 控制终端用户列表
|
||||
getCtrlUserList: () => {
|
||||
const state = useCkChatStore.getState();
|
||||
return state.ctrlUserList;
|
||||
contractList: [], //联系人列表
|
||||
chatSessions: [], //聊天会话
|
||||
kfUserList: [], //客服列表
|
||||
// 异步设置会话列表
|
||||
asyncChatSessions: data => {
|
||||
set({ chatSessions: data });
|
||||
},
|
||||
// 添加控制终端用户
|
||||
addCtrlUser: (user: CkChatCtrlUserData) => {
|
||||
set(state => ({
|
||||
ctrlUserList: [...state.ctrlUserList, user],
|
||||
}));
|
||||
// 异步设置联系人列表
|
||||
asyncContractList: data => {
|
||||
set({ contractList: data });
|
||||
},
|
||||
// 控制终端用户列表
|
||||
getkfUserList: () => {
|
||||
const state = useCkChatStore.getState();
|
||||
return state.kfUserList;
|
||||
},
|
||||
asyncKfUserList: data => {
|
||||
set({ kfUserList: data });
|
||||
},
|
||||
// 删除控制终端用户
|
||||
deleteCtrlUser: (userId: number) => {
|
||||
set(state => ({
|
||||
ctrlUserList: state.ctrlUserList.filter(item => item.id !== userId),
|
||||
kfUserList: state.kfUserList.filter(item => item.id !== userId),
|
||||
}));
|
||||
},
|
||||
// 更新控制终端用户
|
||||
updateCtrlUser: (user: CkChatCtrlUserData) => {
|
||||
updateCtrlUser: (user: KfUserListData) => {
|
||||
set(state => ({
|
||||
ctrlUserList: state.ctrlUserList.map(item =>
|
||||
kfUserList: state.kfUserList.map(item =>
|
||||
item.id === user.id ? user : item,
|
||||
),
|
||||
}));
|
||||
},
|
||||
// 清空控制终端用户列表
|
||||
clearkfUserList: () => {
|
||||
set({ kfUserList: [] });
|
||||
},
|
||||
// 获取聊天会话
|
||||
getChatSessions: () => {
|
||||
const state = useCkChatStore.getState();
|
||||
@@ -159,10 +169,16 @@ export const updateChatSession = (session: ContractData | GroupData) =>
|
||||
useCkChatStore.getState().updateChatSession(session);
|
||||
export const deleteChatSession = (sessionId: string) =>
|
||||
useCkChatStore.getState().deleteChatSession(sessionId);
|
||||
export const getCtrlUserList = () => useCkChatStore.getState().ctrlUserList;
|
||||
export const addCtrlUser = (user: CkChatCtrlUserData) =>
|
||||
export const getkfUserList = () => useCkChatStore.getState().kfUserList;
|
||||
export const addCtrlUser = (user: KfUserListData) =>
|
||||
useCkChatStore.getState().addCtrlUser(user);
|
||||
export const deleteCtrlUser = (userId: number) =>
|
||||
useCkChatStore.getState().deleteCtrlUser(userId);
|
||||
export const updateCtrlUser = (user: CkChatCtrlUserData) =>
|
||||
export const updateCtrlUser = (user: KfUserListData) =>
|
||||
useCkChatStore.getState().updateCtrlUser(user);
|
||||
export const asyncKfUserList = (data: KfUserListData[]) =>
|
||||
useCkChatStore.getState().asyncKfUserList(data);
|
||||
export const asyncContractList = (data: ContractData[]) =>
|
||||
useCkChatStore.getState().asyncContractList(data);
|
||||
export const asyncChatSessions = (data: ContractData[]) =>
|
||||
useCkChatStore.getState().asyncChatSessions(data);
|
||||
|
||||
Reference in New Issue
Block a user