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

488 lines
12 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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,
};
}
};