2026-07-27 11:28:33 +08:00

284 lines
7.7 KiB
JavaScript

const dayjs = require("dayjs");
const utils = require("../utils");
let db = null;
exports.main = async (event, mongodb) => {
db = mongodb;
switch (event.type) {
case "getCorpMemberChatList":
return await exports.getCorpMemberChatList(event);
case "getCorpMemberChatRecord":
return await exports.getCorpMemberChatRecord(event);
case "getChatCount":
return await getChatCount(event);
case "getToDayAllChatRecord":
return await exports.getToDayAllChatRecord(event);
case "getReplyChatRecord":
return await exports.getReplyChatRecord(event);
}
};
// 会话统计
async function getChatCount(event) {
let { corpId = "" } = event;
const todayStartTime = dayjs().startOf("day").valueOf();
const todayEndTime = dayjs().endOf("day").valueOf();
const chatTotalCount = await db
.collection("session-archive-record")
.countDocuments({ corpId });
// 获取今天聊天记录的总数
const todayChatCount = await db
.collection("session-archive-record")
.countDocuments({
corpId,
createTime: { $gte: todayStartTime, $lt: todayEndTime },
});
return {
success: true,
message: "获取成功",
chatTotalCount: chatTotalCount || 0,
todayChatCount: todayChatCount || 0,
};
}
// 获取机构成员聊天对象列表
exports.getCorpMemberChatList = async (event) => {
const { corpId = "", memberUserId = "", page = 1, pageSize = 10 } = event;
// 分页查询条件
const query = {
corpId,
memberUserId,
};
// 获取总数
const total = await db
.collection("session-archive-user")
.countDocuments(query);
// 获取分页数据
const res = await db
.collection("session-archive-user")
.aggregate([
{ $match: query }, // 匹配条件
{ $sort: { sendTime: -1 } }, // 按发送时间降序排序
{ $skip: pageSize * (page - 1) }, // 跳过前面的数据(分页)
{ $limit: pageSize }, // 限制返回的数据数量
{
$lookup: {
from: "wechat-friends", // 要连接的集合
localField: "customerUserId", // 当前集合的字段
foreignField: "external_userid", // 要连接的集合的字段
as: "wechatFriends",
},
},
{
$project: {
corpId: 1,
customerUserId: 1,
memberUserId: 1,
sendTime: 1,
"memberList._id": 1,
"memberList.name": 1,
externalUserName: { $arrayElemAt: ["$wechatFriends.name", 0] },
},
}, // 选择要返回的字段
])
.toArray(); // 执行并转换为数组
// 计算总页数
const pages = Math.ceil(total / pageSize);
return {
success: true,
message: "获取成功",
data: res,
total: total,
pages: pages,
size: pageSize,
};
};
// 获取机构成员与客户的聊天记录
exports.getCorpMemberChatRecord = async (event) => {
const {
corpId = "",
memberUserId = "",
customerUserId = "",
msgIds = [],
page = 1,
pageSize = 10,
orderBy = "asc",
} = event;
// 分页
const skip = (page - 1) * pageSize;
const limit = pageSize;
// 构建查询条件
const query = { corpId };
if (memberUserId) query.memberUserId = memberUserId;
if (customerUserId) query.customerUserId = customerUserId;
if (msgIds.length > 0) query.msgid = { $in: msgIds };
// 获取总数
const total = await db
.collection("session-archive-record")
.countDocuments(query);
// 获取分页数据
const res = await db
.collection("session-archive-record")
.find(query)
.sort({ sendTime: orderBy === "asc" ? 1 : -1 }) // 根据orderBy字段排序
.skip(skip) // 跳过的文档数
.limit(limit) // 限制返回的文档数
.project({
corpId: 1,
customerUserId: 1,
memberUserId: 1,
sendTime: 1,
msgid: 1,
// 这里可以根据需要选择其他字段
})
.toArray(); // 转换为数组
// 计算总页数
const pages = Math.ceil(total / pageSize);
return {
success: true,
message: "获取成功",
data: res,
total: total,
pages: pages,
size: pageSize,
};
};
exports.getToDayAllChatRecord = async (event) => {
let { corpId = "", memberUserId = "", customerUserId = "" } = event;
const todayStartTime = dayjs().startOf("day").unix();
const todayEndTime = dayjs().endOf("day").unix();
let query = {
corpId,
memberUserId,
customerUserId,
sendTime: { $gte: todayStartTime, $lt: todayEndTime },
};
const fetchData = async (page, pageSize, db) => {
const data = await db
.collection("session-archive-record")
.find(query)
.sort({ sendTime: 1 }) // 按 sendTime 升序排序
.skip((page - 1) * pageSize) // 跳过前面的数据
.limit(pageSize) // 限制返回的数据数量
.project({
msgid: 1,
encryptedSecretKey: 1,
publicKeyVersion: 1,
}) // 选择返回的字段
.toArray(); // 转换为数组
return data;
};
// 获取所有数据
const list = await utils.getAllData(fetchData, db);
return {
success: true,
message: "获取成功",
data: list,
};
};
exports.getReplyChatRecord = async (event) => {
const { corpId = "", memberUserId = "", customerUserId = "" } = event;
// 构建查询条件
const query = {
corpId,
receiverUserId: memberUserId,
senderUserId: customerUserId,
};
// 获取最新回复时间
const latestSendtimeRes = await db
.collection("latest-reply-time")
.find({ memberUserId, customerUserId, corpId })
.toArray();
let latestSendtime = "";
let secondLastTime = "";
if (latestSendtimeRes.length > 0) {
latestSendtime = latestSendtimeRes[0].latestSendtime;
secondLastTime = latestSendtimeRes[0].secondLastTime;
query.sendTime = { $gt: latestSendtime }; // 使用 MongoDB 的 $gt 操作符
}
// 获取总数
let count = await db.collection("session-archive-record").find(query).count();
if (count === 0) {
if (secondLastTime) {
query.sendTime = { $gt: secondLastTime }; // 如果没有数据,用第二次的时间过滤
} else {
delete query.sendTime; // 如果没有第二次时间,删除 sendTime 查询条件
}
latestSendtime = secondLastTime; // 更新 latestSendtime 为 secondLastTime
}
// 获取最新的回复消息
const res = await db
.collection("session-archive-record")
.find(query)
.sort({ sendTime: -1 }) // 按 sendTime 降序排序
.skip(0) // 分页:从第一页开始
.limit(10) // 每页 10 条数据
.project({
msgid: 1,
encryptedSecretKey: 1,
publicKeyVersion: 1,
sendTime: 1,
}) // 选择返回字段
.toArray(); // 执行查询并转换为数组
const latestSendData = res[0] || {};
if (latestSendData.sendTime) {
await updateLatestSendTime({
corpId,
memberUserId,
customerUserId,
latestSendtime: latestSendData.sendTime,
secondLastTime: latestSendtime,
latestSendtimeRes,
});
}
return {
success: true,
message: "获取成功",
data: res,
};
};
async function updateLatestSendTime({
corpId,
memberUserId,
customerUserId,
latestSendtime,
secondLastTime,
latestSendtimeRes,
}) {
console.log("updateLatestSendTime", latestSendtimeRes);
// 检查是否已经存在记录
if (latestSendtimeRes.length > 0) {
// 更新现有记录
await db.collection("latest-reply-time").updateOne(
{ corpId, memberUserId, customerUserId }, // 查询条件
{ $set: { latestSendtime, secondLastTime } } // 更新字段
);
} else {
// 插入新记录
await db.collection("latest-reply-time").insertOne({
corpId,
memberUserId,
customerUserId,
latestSendtime,
secondLastTime,
});
}
}