488 lines
12 KiB
JavaScript
Raw Permalink Normal View History

2026-07-27 11:28:33 +08:00
const utils = require("../utils");
const api = require("../../api");
const common = require("../../common");
let db = null;
exports.main = async (event, mongodb) => {
db = mongodb;
switch (event.type) {
case "getTeamData":
return await getTeamData(event);
case "getAllTeamByCorp":
return await exports.getAllTeamByCorp(event);
case "getTeamBymember":
return await exports.getTeamBymember(event);
case "getTeamByMainLeaderUserId":
return await exports.getTeamByMainLeaderUserId(event);
case "getCorpTeams":
return await exports.getCorpTeams(event);
case "getTeamById":
return await exports.getTeamById(event);
case "updateMemberRolesByTeam":
return await exports.updateMemberRolesByTeam(event);
case "getTeamLeaderNumByUserId":
return await exports.getTeamLeaderNumByUserId(event);
case "updateTeam":
return await exports.updateTeam(event);
case "getCustomTeamData":
return await exports.getCustomTeamData(event);
case "deleteCorpTeam":
return await exports.deleteCorpTeam(event);
case "getTeamNamesByTeamIds":
return await getTeamNamesByTeamIds(event);
}
};
async function getTeamNamesByTeamIds({ corpId, teamIds }) {
// 查询团队名称
const { data: teams } = await db
.collection("team")
.find({ corpId, teamId: { $in: teamIds } })
.toArray();
const teamNames = teams.map((item) => item.name);
return {
success: true,
data: teamNames,
message: "获取团队名称成功",
};
}
async function getTeamData(event) {
const { env, teamId } = event;
try {
// 获取团队信息
const team = await db.collection("team").findOne({ teamId });
if (team) {
// 获取团队成员信息
const corpMember = await getMemberList(team.corpId);
let { memberList } = team;
team.memberList = memberList
.map((userid) => {
return corpMember.find((item) => item.userid === userid);
})
.filter((i) => i);
return {
success: true,
message: "获取团队信息成功",
data: team,
};
}
return {
success: false,
message: "未查询到团队信息",
};
} catch (error) {
return {
success: false,
message: error.message,
};
}
}
// 获取团队成员信息
async function getMemberList(corpId) {
return await db.collection("corp-member").find({ corpId }).toArray();
}
exports.getAllTeamByCorp = async (event) => {
const { env, corpId } = event;
try {
const teams = await db.collection("team").find({ corpId }).toArray();
return {
success: true,
message: "获取成功",
data: teams,
};
} catch (error) {
return {
success: false,
message: error.message,
};
}
};
exports.getTeamBymember = async (event) => {
const { corpUserId, corpId } = event;
try {
const teams = await db
.collection("team")
.find({ memberList: corpUserId, corpId })
.toArray();
return {
success: true,
message: "获取成功",
data: teams,
};
} catch (error) {
return {
success: false,
message: error.message,
};
}
};
exports.getTeamByMainLeaderUserId = async (context) => {
const { env, userId, corpId } = context;
try {
const teams = await db
.collection("team")
.find({ corpId, memberLeaderList: userId })
.toArray();
return {
success: true,
message: "获取成功",
data: teams,
};
} catch (error) {
return {
success: false,
message: error.message,
};
}
};
exports.getCorpTeams = async (context) => {
const { env, page, pageSize, corpId, name = "", userId = "", fields, showCustomerCount = true } = context;
const query = { corpId };
if (typeof name === "string" && name.trim()) {
query.name = { $regex: ".*" + name.trim() + ".*", $options: "i" };
}
if (userId) query.memberList = userId;
const teamDB = db.collection("team");
const total = await teamDB.countDocuments(query);
const pages = Math.ceil(total / pageSize);
let list = [];
const teams = await db.collection("team")
.find(query, Object.prototype.toString.call(fields) === "[object Object]" ? fields : {})
.skip((page - 1) * pageSize)
.limit(pageSize)
.toArray();
if (showCustomerCount) {
// 然后,对于每个 team查询成员数量
const teamIds = teams.map(team => team.teamId);
const customerCounts = await api.getMemberApi({
type: "getTeamCustmerCount",
corpId,
teamIds
})
// 将查询结果合并到原来的 team 数据中
list = teams.map(team => {
const customerCount = customerCounts.find(count => count._id === team.teamId);
team.customerCount = customerCount ? customerCount.count : 0;
return team;
});
} else {
list = teams
}
return {
success: true,
message: "获取成功",
list: list.map((i) => ({
...i,
memberList: Array.isArray(i.memberList) ? i.memberList : [],
})),
total,
pages,
size: pageSize,
};
};
exports.getTeamById = async (context) => {
try {
const { env, id: teamId, teamIds = [] } = context;
if (!teamId && (!Array.isArray(teamIds) || teamIds.length === 0)) {
return { success: false, message: "团队id不能为空" };
}
const query = teamId ? { teamId } : { teamId: { $in: teamIds } };
const teams = await db.collection("team").find(query).toArray();
const list = teams.map((i) => ({
...i,
memberList: Array.isArray(i.memberList) ? i.memberList : [],
}));
return {
success: true,
message: "获取成功",
data: list,
};
} catch (error) {
return {
success: false,
message: error.message,
};
}
};
exports.updateTeam = async (context) => {
const { corpId, teamId, _id, type, ...payload } = context;
if (!teamId) {
return {
success: false,
message: "新增团队失败(缺少teamId)",
};
}
const query = { teamId };
const teamDB = db.collection("team");
const team = await teamDB.findOne(query);
const isUpdate = Boolean(team);
if (isUpdate) {
await teamDB.updateOne(query, { $set: payload });
} else {
await teamDB.insertOne({ ...payload, teamId, corpId, _id: common.generateRandomString(24) });
}
const { memberList } = context;
await addTeamIdtoMember(memberList, teamId);
let res = null;
if (isUpdate) {
res = await api.getMemberApi({
teamId,
corpId,
type: "updateSopTaskExecuteUser",
});
}
return {
success: true,
message: isUpdate ? "团队信息更新成功" : "新增团队成功",
res,
};
};
// 判断所加成员是否含有teamId
async function addTeamIdtoMember(memberList, teamId) {
const memberDB = db.collection("corp-member");
const members = await memberDB
.find({ userid: { $in: memberList } })
.toArray();
const noTeamIdMemberList = members
.filter((item) => !item.teamId)
.map((item) => item.userid);
if (noTeamIdMemberList.length > 0) {
await memberDB.updateMany(
{ userid: { $in: noTeamIdMemberList } },
{ $set: { teamId } }
);
}
}
exports.getTeamLeaderNumByUserId = async (context) => {
const { env, userId, corpId } = context;
try {
const count = await db
.collection("team")
.countDocuments({ corpId, memberLeaderList: userId });
return {
success: true,
message: "获取成功",
data: count,
};
} catch (error) {
return {
success: false,
message: "获取失败",
};
}
};
exports.updateMemberRolesByTeam = async (context) => {
const { env, corpId, params, teamId } = context;
const { addLeaders, removeLeaders, addTeamMember, removeTeamMember } = params;
try {
const { memberRoleId, memberLeaderRoleId } = await getRolesId(env, corpId);
if (addLeaders.length > 0) {
for (const userid of addLeaders) {
await getTeamLeaderRoleIdByUserId(
env,
userid,
teamId,
corpId,
"add",
memberLeaderRoleId
);
}
}
if (removeLeaders.length > 0) {
for (const userid of removeLeaders) {
await getTeamLeaderRoleIdByUserId(
env,
userid,
teamId,
corpId,
"remove",
memberLeaderRoleId
);
}
}
if (addTeamMember.length > 0) {
for (const userid of addTeamMember) {
await getTeamMemberRoleIdByUserId(
env,
userid,
teamId,
corpId,
"add",
memberRoleId
);
}
}
if (removeTeamMember.length > 0) {
for (const userid of removeTeamMember) {
await getTeamMemberRoleIdByUserId(
env,
userid,
teamId,
corpId,
"remove",
memberRoleId
);
}
}
return {
success: true,
message: "更新成功",
};
} catch (error) {
return {
success: false,
message: error.message,
};
}
};
async function getTeamMemberRoleIdByUserId(
env,
userId,
teamId,
corpId,
type,
memberRoleId
) {
const count = await db.collection("team").countDocuments({
corpId,
memberList: userId,
teamId: { $ne: teamId },
});
if (count === 0 && type === "add") {
await db
.collection("corp-member")
.updateOne(
{ corpId, userid: userId },
{ $addToSet: { roleIds: memberRoleId } }
);
}
if (count === 0 && type === "remove") {
await db
.collection("corp-member")
.updateOne(
{ corpId, userid: userId },
{ $pull: { roleIds: memberRoleId } }
);
}
}
async function getTeamLeaderRoleIdByUserId(
env,
userId,
teamId,
corpId,
type,
memberLeaderRoleId
) {
const count = await db.collection("team").countDocuments({
corpId,
memberLeaderList: userId,
teamId: { $ne: teamId },
});
if (count === 0 && type === "add") {
await db
.collection("corp-member")
.updateOne(
{ corpId, userid: userId },
{ $addToSet: { roleIds: memberLeaderRoleId } }
);
}
if (count === 0 && type === "remove") {
await db
.collection("corp-member")
.updateOne(
{ corpId, userid: userId },
{ $pull: { roleIds: memberLeaderRoleId } }
);
}
}
async function getRolesId(env, corpId) {
const roles = await db.collection("sys-role").find({ corpId }).toArray();
const memberRoleId = roles.find((item) => item.roleId === "member")._id;
const memberLeaderRoleId = roles.find(
(item) => item.roleId === "memberLeader"
)._id;
return {
memberRoleId,
memberLeaderRoleId,
};
}
exports.deleteCorpTeam = async function (context) {
const { env, corpId, teamId, _id } = context;
if (teamId && corpId && _id) {
try {
const team = await db.collection("team").findOne({ corpId, teamId, _id });
if (team) {
const total = await db
.collection("member")
.countDocuments({ corpId, teamId });
if (total === 0) {
await db.collection("team").deleteOne({ _id });
return { success: true, message: "删除成功" };
}
return { success: false, message: "该团队下存在客户,无法删除" };
}
return { success: false, message: "团队不存在" };
} catch (e) {
return { success: false, message: e.message };
}
}
return { success: false, message: "参数错误" };
};
exports.getCustomTeamData = async function (context) {
const { env, corpUserId, corpId, fields, teamIds } = context;
if (!corpId || !Array.isArray(fields) || fields.length === 0) {
return { success: false, message: "参数错误" };
}
try {
const query = { corpId };
if (teamIds && teamIds.length) {
query.teamId = { $in: teamIds };
}
if (corpUserId) {
query.memberList = { $in: [corpUserId] };
}
const projection = fields.reduce(
(acc, val) => {
if (typeof val === "string" && val.trim()) {
acc[val] = 1;
}
return acc;
},
{ teamId: 1, _id: 0 }
);
const teams = await db
.collection("team")
.find(query, { projection })
.toArray();
return {
success: true,
message: "获取成功",
data: teams,
};
} catch (error) {
return {
success: false,
message: error.message,
};
}
};