diff --git a/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/ProfileCard/components/ProfileModules/api.ts b/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/ProfileCard/components/ProfileModules/api.ts index 2f2ea0dc..4db240cd 100644 --- a/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/ProfileCard/components/ProfileModules/api.ts +++ b/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/ProfileCard/components/ProfileModules/api.ts @@ -2,6 +2,7 @@ import request from "@/api/request"; // 更新好友信息 export interface UpdateFriendInfoParams { id: number; + conRemark: string; phone: string; company: string; name: string; @@ -15,18 +16,6 @@ export function updateFriendInfo(params: UpdateFriendInfoParams): Promise { return request("/v1/kefu/wechatFriend/updateInfo", params, "POST"); } -// 更新本地数据库中的好友信息 -export interface UpdateLocalDBParams { - wechatFriendId: number; - extendFields: string; - updateConversation?: boolean; // 是否同时更新会话列表 -} - -export function updateLocalDBFriendInfo( - params: UpdateLocalDBParams, -): Promise { - return request("/v1/kefu/wechatFriend/updateLocalDB", params, "POST"); -} // 获取好友信息 export interface GetFriendInfoParams { id: number; diff --git a/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/ProfileCard/components/ProfileModules/components/detailValue.tsx b/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/ProfileCard/components/ProfileModules/components/detailValue.tsx index a986f5cb..65b1ef27 100644 --- a/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/ProfileCard/components/ProfileModules/components/detailValue.tsx +++ b/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/ProfileCard/components/ProfileModules/components/detailValue.tsx @@ -2,7 +2,6 @@ import React, { useCallback, useState, useEffect, useRef } from "react"; import { Input, message } from "antd"; import { Button } from "antd-mobile"; import { EditOutlined } from "@ant-design/icons"; -import { updateFriendInfo, UpdateFriendInfoParams } from "../api"; import styles from "../Person.module.scss"; @@ -31,7 +30,6 @@ export interface DetailValueProps { values: Record, changedKeys: string[], ) => void; - isGroup?: boolean; } const DetailValue: React.FC = ({ @@ -44,7 +42,6 @@ const DetailValue: React.FC = ({ renderFooter, saveHandler, onSaveSuccess, - isGroup = false, }) => { const [messageApi, contextHolder] = message.useMessage(); const [editingFields, setEditingFields] = useState>( @@ -158,37 +155,12 @@ const DetailValue: React.FC = ({ } try { - if (isGroup) { - // 群组信息使用传入的saveHandler - if (saveHandler) { - await saveHandler(fieldValues, changedKeys); - } else { - onSubmit?.(fieldValues, changedKeys); - } + // 统一由外部传入的 saveHandler 或 onSubmit 处理保存逻辑, + // DetailValue 只负责收集数据和触发保存,避免与业务层重复。 + if (saveHandler) { + await saveHandler(fieldValues, changedKeys); } else { - // 个人资料信息处理 - if (changedKeys.includes("conRemark")) { - // 微信备注是特例,使用WebSocket更新 - if (saveHandler) { - await saveHandler(fieldValues, changedKeys); - } else { - onSubmit?.(fieldValues, changedKeys); - } - } else { - // 其他个人资料信息使用updateFriendInfo API - const params: UpdateFriendInfoParams = { - id: Number(value.id) || 0, - phone: fieldValues.phone || "", - company: fieldValues.company || "", - name: fieldValues.name || "", - position: fieldValues.position || "", - email: fieldValues.email || "", - address: fieldValues.address || "", - qq: fieldValues.qq || "", - remark: fieldValues.remark || "", - }; - await updateFriendInfo(params); - } + onSubmit?.(fieldValues, changedKeys); } // 更新原始值 @@ -216,8 +188,6 @@ const DetailValue: React.FC = ({ changedKeys, fields, messageApi, - isGroup, - value.id, ]); const isEditing = Object.values(editingFields).some(Boolean); diff --git a/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/ProfileCard/components/ProfileModules/index.tsx b/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/ProfileCard/components/ProfileModules/index.tsx index 951b5bcc..0ac21322 100644 --- a/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/ProfileCard/components/ProfileModules/index.tsx +++ b/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/ProfileCard/components/ProfileModules/index.tsx @@ -21,19 +21,18 @@ import { } from "@ant-design/icons"; import { ContractData, weChatGroup } from "@/pages/pc/ckbox/data"; import { useCustomerStore } from "@/store/module/weChat/customer"; +import { useMessageStore } from "@weChatStore/message"; +import { useUserStore } from "@storeModule/user"; import { useWebSocketStore } from "@/store/module/websocket/websocket"; import { useWeChatStore } from "@/store/module/weChat/weChat"; import { contactUnifiedService } from "@/utils/db"; +import { MessageManager } from "@/utils/dbAction/message"; import { generateAiText } from "@/api/ai"; import TwoColumnSelection from "@/components/TwoColumnSelection/TwoColumnSelection"; import TwoColumnMemberSelection from "@/components/MemberSelection/TwoColumnMemberSelection"; import { FriendSelectionItem } from "@/components/FriendSelection/data"; import DetailValue from "./components/detailValue"; -import { - getFriendInfo, - FriendDetailResponse, - updateLocalDBFriendInfo, -} from "./api"; +import { getFriendInfo, FriendDetailResponse, updateFriendInfo } from "./api"; import styles from "./Person.module.scss"; interface PersonProps { contract: ContractData | weChatGroup; @@ -52,6 +51,11 @@ const Person: React.FC = ({ contract }) => { null, ); + // 会话列表 & 当前用户,用于在备注更新后同步会话列表显示 + const setSessions = useMessageStore(state => state.setSessions); + const { user } = useUserStore(); + const currentUserId = user?.id || 0; + // 判断是否为群聊 const isGroup = "chatroomId" in contract; @@ -212,32 +216,14 @@ const Person: React.FC = ({ contract }) => { // 优化:使用选择器函数直接订阅匹配的客服对象,避免订阅整个 customerList // 添加相等性比较,只有当匹配的客服对象或其 labels 真正变化时才触发重新渲染 - const kfSelectedUser = useCustomerStore( - state => { - if (!contract.wechatAccountId) return null; - return ( - state.customerList.find( - customer => customer.id === contract.wechatAccountId, - ) || null - ); - }, - (prev, next) => { - // 如果都是 null,认为相等 - if (!prev && !next) return true; - // 如果一个是 null 另一个不是,认为不相等 - if (!prev || !next) return false; - // 比较关键字段:id 和 labels(因为 useEffect 中使用了 labels) - if (prev.id !== next.id) return false; - // 比较 labels 数组是否真的变化了 - const prevLabels = prev.labels || []; - const nextLabels = next.labels || []; - if (prevLabels.length !== nextLabels.length) return false; - // 深度比较 labels 数组内容(先复制再排序,避免修改原数组) - const prevLabelsStr = JSON.stringify([...prevLabels].sort()); - const nextLabelsStr = JSON.stringify([...nextLabels].sort()); - return prevLabelsStr === nextLabelsStr; - }, - ); + const kfSelectedUser = useCustomerStore(state => { + if (!contract.wechatAccountId) return null; + return ( + state.customerList.find( + (customer: any) => customer.id === contract.wechatAccountId, + ) || null + ); + }); // 不再需要从useContactStore获取getContactsByCustomer @@ -253,7 +239,7 @@ const Person: React.FC = ({ contract }) => { useEffect(() => { const fetchAvailableTags = async () => { try { - const kfTags = kfSelectedUser?.labels || []; + const kfTags = (kfSelectedUser as any)?.labels || []; const contractTags = contract.labels || []; const allTags = [...new Set([...kfTags, ...contractTags])]; setAllAvailableTags(allTags); @@ -403,14 +389,47 @@ const Person: React.FC = ({ contract }) => { extendFields: extendFieldsStr, }); - // 同时更新会话列表和好友本地数据库中的extendFields字段 - updateLocalDBFriendInfo({ - wechatFriendId: contract.id, - extendFields: extendFieldsStr, - updateConversation: true, // 同时更新会话列表 + // 同步好友信息到后端 + updateFriendInfo({ + id: Number(contract.id) || 0, + conRemark: values.conRemark || "", + phone: values.phone || "", + company: values.company || "", + name: values.name || "", + position: values.position || "", + email: values.email || "", + address: values.address || "", + qq: values.qq || "", + remark: values.remark || "", }).catch(err => { - console.error("更新本地数据库失败:", err); + console.error("更新好友信息失败:", err); }); + + // 备注变更时,同步更新会话列表 UI 和本地会话数据库 + if (changedKeys.includes("conRemark")) { + const newRemark = values.conRemark || ""; + + // 1. 立即更新会话列表 UI(乐观更新) + setSessions(prev => + prev.map(session => + session.type === "friend" && session.id === contract.id + ? { ...session, conRemark: newRemark } + : session, + ), + ); + + // 2. 同步到会话本地数据库 + if (currentUserId) { + MessageManager.updateRemark( + currentUserId, + Number(contract.id) || 0, + "friend", + newRemark, + ).catch(err => { + console.error("更新会话备注失败:", err); + }); + } + } } } @@ -740,7 +759,7 @@ const Person: React.FC = ({ contract }) => { } // 获取当前用户ID - const userId = kfSelectedUser?.userId || 0; + const userId = (kfSelectedUser as any)?.userId || 0; const storeUserId = databaseManager.getCurrentUserId(); const effectiveUserId = storeUserId || userId; @@ -924,7 +943,6 @@ const Person: React.FC = ({ contract }) => { setSelfDisplayNameValue(values.selfDisplayName); } }} - isGroup={true} /> ) : ( // 好友信息 @@ -1010,7 +1028,6 @@ const Person: React.FC = ({ contract }) => { setRemarkValue(values.conRemark); } }} - isGroup={false} /> )}