refactor(ckbox): 重构客服列表和联系人管理逻辑

- 将ctrlUserList重命名为kfUserList并优化相关接口
- 新增异步更新客服列表、联系人列表和会话列表的方法
- 重构联系人分组逻辑,支持按标签分组
- 优化会话列表排序规则,按最后更新时间降序排列
- 移除无用代码并简化组件逻辑
This commit is contained in:
超级老白兔
2025-08-28 15:18:18 +08:00
parent 3c1337b213
commit 640daf2431
10 changed files with 226 additions and 182 deletions

View File

@@ -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未知/未设置12符合微信性别字段定义
* 原始数据中为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;

View File

@@ -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);