通过向UpdateDataInfoParams添加conRemark并重构相关组件,增强好友信息更新功能。删除未使用的本地数据库更新逻辑并简化DetailValue组件中的数据处理。

This commit is contained in:
乘风
2025-12-03 18:44:42 +08:00
parent 1ea565fbdf
commit 903ea005e3
3 changed files with 64 additions and 88 deletions

View File

@@ -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<any> {
return request("/v1/kefu/wechatFriend/updateInfo", params, "POST");
}
// 更新本地数据库中的好友信息
export interface UpdateLocalDBParams {
wechatFriendId: number;
extendFields: string;
updateConversation?: boolean; // 是否同时更新会话列表
}
export function updateLocalDBFriendInfo(
params: UpdateLocalDBParams,
): Promise<any> {
return request("/v1/kefu/wechatFriend/updateLocalDB", params, "POST");
}
// 获取好友信息
export interface GetFriendInfoParams {
id: number;

View File

@@ -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<string, string>,
changedKeys: string[],
) => void;
isGroup?: boolean;
}
const DetailValue: React.FC<DetailValueProps> = ({
@@ -44,7 +42,6 @@ const DetailValue: React.FC<DetailValueProps> = ({
renderFooter,
saveHandler,
onSaveSuccess,
isGroup = false,
}) => {
const [messageApi, contextHolder] = message.useMessage();
const [editingFields, setEditingFields] = useState<Record<string, boolean>>(
@@ -158,37 +155,12 @@ const DetailValue: React.FC<DetailValueProps> = ({
}
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<DetailValueProps> = ({
changedKeys,
fields,
messageApi,
isGroup,
value.id,
]);
const isEditing = Object.values(editingFields).some(Boolean);

View File

@@ -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<PersonProps> = ({ 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<PersonProps> = ({ 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<PersonProps> = ({ 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<PersonProps> = ({ 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<PersonProps> = ({ 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<PersonProps> = ({ contract }) => {
setSelfDisplayNameValue(values.selfDisplayName);
}
}}
isGroup={true}
/>
) : (
// 好友信息
@@ -1010,7 +1028,6 @@ const Person: React.FC<PersonProps> = ({ contract }) => {
setRemarkValue(values.conRemark);
}
}}
isGroup={false}
/>
)}
</Card>