287 lines
9.5 KiB
TypeScript
287 lines
9.5 KiB
TypeScript
import { api } from "@/lib/api";
|
||
import {
|
||
ServerWechatAccountsResponse,
|
||
QueryWechatAccountParams,
|
||
WechatAccountDetailResponse
|
||
} from "@/types/wechat-account";
|
||
|
||
/**
|
||
* 获取微信账号列表
|
||
* @param params 查询参数
|
||
* @returns 微信账号列表响应
|
||
*/
|
||
export const fetchWechatAccountList = async (params: QueryWechatAccountParams = {}): Promise<ServerWechatAccountsResponse> => {
|
||
const queryParams = new URLSearchParams();
|
||
|
||
// 添加查询参数
|
||
if (params.page) queryParams.append('page', params.page.toString());
|
||
if (params.limit) queryParams.append('limit', params.limit.toString());
|
||
if (params.keyword) queryParams.append('nickname', params.keyword); // 使用nickname作为关键词搜索参数
|
||
if (params.sort) queryParams.append('sort', params.sort);
|
||
if (params.order) queryParams.append('order', params.order);
|
||
|
||
// 发起API请求
|
||
return api.get<ServerWechatAccountsResponse>(`/v1/device/wechats?${queryParams.toString()}`);
|
||
};
|
||
|
||
/**
|
||
* 获取微信账号详情
|
||
* @param id 微信账号ID
|
||
* @returns 微信账号详情响应
|
||
*/
|
||
export const fetchWechatAccountDetail = async (id: string | number): Promise<WechatAccountDetailResponse> => {
|
||
return api.get<WechatAccountDetailResponse>(`/v1/device/wechats/${id}`);
|
||
};
|
||
|
||
/**
|
||
* 刷新微信账号状态
|
||
* @returns 刷新结果
|
||
*/
|
||
export const refreshWechatAccounts = async (): Promise<{ code: number; msg: string; data: any }> => {
|
||
return api.put<{ code: number; msg: string; data: any }>('/v1/device/wechats/refresh', {});
|
||
};
|
||
|
||
/**
|
||
* 执行微信好友转移
|
||
* @param sourceId 源微信账号ID
|
||
* @param targetId 目标微信账号ID
|
||
* @returns 转移结果
|
||
*/
|
||
export const transferWechatFriends = async (sourceId: string | number, targetId: string | number): Promise<{ code: number; msg: string; data: any }> => {
|
||
return api.post<{ code: number; msg: string; data: any }>('/v1/device/wechats/transfer-friends', {
|
||
source_id: sourceId,
|
||
target_id: targetId
|
||
});
|
||
};
|
||
|
||
/**
|
||
* 将服务器返回的微信账号数据转换为前端使用的格式
|
||
* @param serverAccount 服务器返回的微信账号数据
|
||
* @returns 前端使用的微信账号数据
|
||
*/
|
||
export const transformWechatAccount = (serverAccount: any): import("@/types/wechat-account").WechatAccount => {
|
||
// 从deviceInfo中提取设备信息
|
||
let deviceId = '';
|
||
let deviceName = '';
|
||
|
||
if (serverAccount.deviceInfo) {
|
||
// 尝试解析设备信息字符串
|
||
const deviceInfo = serverAccount.deviceInfo.split(' ');
|
||
if (deviceInfo.length > 0) {
|
||
// 提取数字部分作为设备ID,确保是整数
|
||
const possibleId = deviceInfo[0].trim();
|
||
// 验证是否为数字
|
||
deviceId = /^\d+$/.test(possibleId) ? possibleId : '';
|
||
|
||
// 提取设备名称
|
||
if (deviceInfo.length > 1) {
|
||
deviceName = deviceInfo[1] ? deviceInfo[1].replace(/[()]/g, '').trim() : '';
|
||
}
|
||
}
|
||
}
|
||
|
||
// 如果从deviceInfo无法获取有效的设备ID,使用imei作为备选
|
||
if (!deviceId && serverAccount.imei) {
|
||
deviceId = serverAccount.imei;
|
||
}
|
||
|
||
// 如果仍然没有设备ID,使用微信账号的ID作为最后的备选
|
||
if (!deviceId && serverAccount.id) {
|
||
deviceId = serverAccount.id.toString();
|
||
}
|
||
|
||
// 如果没有设备名称,使用备用名称
|
||
if (!deviceName) {
|
||
deviceName = serverAccount.deviceMemo || '未命名设备';
|
||
}
|
||
|
||
// 假设每天最多可添加20个好友
|
||
const maxDailyAdds = 20;
|
||
const todayAdded = serverAccount.todayNewFriendCount || 0;
|
||
|
||
return {
|
||
id: serverAccount.id.toString(),
|
||
avatar: serverAccount.avatar || '',
|
||
nickname: serverAccount.nickname || serverAccount.accountNickname || '未命名',
|
||
wechatId: serverAccount.wechatId || '',
|
||
deviceId,
|
||
deviceName,
|
||
friendCount: serverAccount.totalFriend || 0,
|
||
todayAdded,
|
||
remainingAdds: serverAccount.canAddFriendCount || (maxDailyAdds - todayAdded),
|
||
maxDailyAdds,
|
||
status: serverAccount.wechatAlive === 1 ? "normal" : "abnormal" as "normal" | "abnormal",
|
||
lastActive: new Date().toLocaleString() // 服务端未提供,使用当前时间
|
||
};
|
||
};
|
||
|
||
/**
|
||
* 将服务端的微信账号详情转换为前端详情页面所需的格式
|
||
* @param detailResponse 服务端微信账号详情响应
|
||
* @returns 前端页面所需的微信账号详情格式
|
||
*/
|
||
export const transformWechatAccountDetail = (detailResponse: WechatAccountDetailResponse): any => {
|
||
if (!detailResponse || !detailResponse.data) {
|
||
return null;
|
||
}
|
||
|
||
const { basicInfo, statistics, accountInfo, restrictions, friends } = detailResponse.data;
|
||
|
||
// 设备信息处理 - 改进处理方式
|
||
let deviceId = '';
|
||
let deviceName = '';
|
||
|
||
if (basicInfo.deviceInfo) {
|
||
// 尝试解析设备信息字符串
|
||
const deviceInfoParts = basicInfo.deviceInfo.split(' ');
|
||
if (deviceInfoParts.length > 0) {
|
||
// 提取数字部分作为设备ID,确保是整数
|
||
const possibleId = deviceInfoParts[0].trim();
|
||
// 验证是否为数字
|
||
deviceId = /^\d+$/.test(possibleId) ? possibleId : '';
|
||
|
||
// 提取设备名称
|
||
if (deviceInfoParts.length > 1) {
|
||
deviceName = deviceInfoParts[1].replace(/[()]/g, '').trim();
|
||
}
|
||
}
|
||
}
|
||
|
||
// 如果从deviceInfo无法获取有效的设备ID,直接使用微信账号ID作为备选
|
||
if (!deviceId && basicInfo.id) {
|
||
deviceId = basicInfo.id.toString();
|
||
}
|
||
|
||
// 如果没有设备名称,使用备用名称
|
||
if (!deviceName) {
|
||
deviceName = '未命名设备';
|
||
}
|
||
|
||
// 账号年龄计算
|
||
let accountAgeYears = 0;
|
||
let accountAgeMonths = 0;
|
||
|
||
if (accountInfo.createTime) {
|
||
const createDate = new Date(accountInfo.createTime);
|
||
const currentDate = new Date();
|
||
const diffInMonths = (currentDate.getFullYear() - createDate.getFullYear()) * 12 +
|
||
(currentDate.getMonth() - createDate.getMonth());
|
||
|
||
accountAgeYears = Math.floor(diffInMonths / 12);
|
||
accountAgeMonths = diffInMonths % 12;
|
||
}
|
||
|
||
// 转换限制记录
|
||
const restrictionRecords = restrictions?.map((restriction, index) => ({
|
||
id: `${index}`,
|
||
date: restriction.startTime,
|
||
reason: restriction.reason,
|
||
recoveryTime: restriction.endTime,
|
||
type: mapRestrictionType(restriction.type)
|
||
})) || [];
|
||
|
||
// 转换好友数据
|
||
const transformedFriends = friends?.map(friend => ({
|
||
id: friend.id.toString(),
|
||
avatar: friend.avatar || `/placeholder.svg?height=40&width=40&text=${friend.nickname?.[0] || ''}`,
|
||
nickname: friend.nickname,
|
||
wechatId: friend.wechatId,
|
||
remark: '', // 服务端未提供
|
||
addTime: friend.createTime,
|
||
lastInteraction: '', // 服务端未提供
|
||
tags: [], // 服务端未提供
|
||
region: friend.region || '',
|
||
source: '', // 服务端未提供
|
||
notes: '', // 服务端未提供
|
||
})) || [];
|
||
|
||
// 创建每周统计数据(模拟数据,服务端未提供)
|
||
const weeklyStats = Array.from({ length: 7 }, (_, i) => ({
|
||
date: `Day ${i + 1}`,
|
||
friends: Math.floor(Math.random() * 50) + 50,
|
||
messages: Math.floor(Math.random() * 100) + 100,
|
||
}));
|
||
|
||
return {
|
||
id: basicInfo.id.toString(),
|
||
avatar: basicInfo.avatar || '',
|
||
nickname: basicInfo.nickname || '',
|
||
wechatId: basicInfo.wechatId || '',
|
||
deviceId,
|
||
deviceName,
|
||
friendCount: statistics.totalFriend || 0,
|
||
todayAdded: 0, // 服务端未提供,默认为0
|
||
status: basicInfo.status === '在线' ? 'normal' : 'abnormal',
|
||
lastActive: accountInfo.lastUpdateTime || new Date().toLocaleString(),
|
||
messageCount: statistics.thirtyDayMsgCount || 0,
|
||
activeRate: 0, // 服务端未提供,默认为0
|
||
accountAge: {
|
||
years: accountAgeYears,
|
||
months: accountAgeMonths,
|
||
},
|
||
totalChats: statistics.sevenDayMsgCount + statistics.yesterdayMsgCount || 0,
|
||
chatFrequency: Math.floor((statistics.sevenDayMsgCount || 0) / 7), // 每日平均聊天次数
|
||
restrictionRecords,
|
||
isVerified: true, // 服务端未提供,默认为true
|
||
firstMomentDate: accountInfo.createTime || '',
|
||
accountWeight: accountInfo.weight || 50,
|
||
weightFactors: {
|
||
restrictionFactor: restrictionRecords.length > 0 ? 0.8 : 1.0,
|
||
verificationFactor: 1.0,
|
||
ageFactor: Math.min(1.0, accountAgeYears * 0.1 + 0.5),
|
||
activityFactor: statistics.totalFriend > 0 ? 0.9 : 0.7,
|
||
},
|
||
weeklyStats,
|
||
friends: transformedFriends,
|
||
};
|
||
};
|
||
|
||
/**
|
||
* 将服务端的限制类型映射为前端类型
|
||
* @param type 服务端限制类型
|
||
* @returns 前端限制类型
|
||
*/
|
||
const mapRestrictionType = (type: string): "friend_limit" | "marketing" | "spam" | "other" => {
|
||
const typeMap: Record<string, "friend_limit" | "marketing" | "spam" | "other"> = {
|
||
'friend': 'friend_limit',
|
||
'marketing': 'marketing',
|
||
'spam': 'spam'
|
||
};
|
||
|
||
return typeMap[type] || 'other';
|
||
};
|
||
|
||
/**
|
||
* 获取微信好友列表
|
||
* @param wechatId 微信账号ID
|
||
* @param page 页码
|
||
* @param limit 每页数量
|
||
* @param keyword 搜索关键词
|
||
* @returns 好友列表数据
|
||
*/
|
||
export const fetchWechatFriends = async (
|
||
wechatId: string | number,
|
||
page: number = 1,
|
||
limit: number = 20,
|
||
keyword: string = ""
|
||
): Promise<{ code: number; msg: string; data: any }> => {
|
||
try {
|
||
const params = new URLSearchParams({
|
||
wechatId: String(wechatId),
|
||
page: String(page),
|
||
limit: String(limit)
|
||
});
|
||
|
||
if (keyword) {
|
||
params.append('keyword', keyword);
|
||
}
|
||
|
||
const url = `/v1/device/wechats/friends?${params.toString()}`;
|
||
const response = await api.get<{ code: number; msg: string; data: any }>(url);
|
||
|
||
return response;
|
||
} catch (error) {
|
||
console.error('获取微信好友列表失败:', error);
|
||
throw error;
|
||
}
|
||
}
|