458 lines
11 KiB
JavaScript
458 lines
11 KiB
JavaScript
|
|
const utils = require("../utils");
|
||
|
|
const common = require("../../common");
|
||
|
|
let db = null;
|
||
|
|
exports.main = async (event, mongodb) => {
|
||
|
|
db = mongodb;
|
||
|
|
return await getTeamData(event, mongodb);
|
||
|
|
};
|
||
|
|
async function getTeamData(event) {
|
||
|
|
const { 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,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 获取机构信息
|
||
|
|
async function getCorpData(item) {
|
||
|
|
return await db.collection("corp").findOne({ corpId: item.corpId });
|
||
|
|
}
|
||
|
|
|
||
|
|
// 获取团队成员信息
|
||
|
|
async function getMemberList(corpId) {
|
||
|
|
return await db.collection("corp-member").find({ corpId }).toArray();
|
||
|
|
}
|
||
|
|
|
||
|
|
exports.getAllTeamByCorp = async (event) => {
|
||
|
|
let { corpId } = event;
|
||
|
|
try {
|
||
|
|
let res = await db.collection("team").find({ corpId }).toArray();
|
||
|
|
return {
|
||
|
|
success: true,
|
||
|
|
message: "获取成功",
|
||
|
|
data: res,
|
||
|
|
};
|
||
|
|
} catch (error) {
|
||
|
|
return {
|
||
|
|
success: false,
|
||
|
|
message: error,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
exports.getTeamBymember = async (event) => {
|
||
|
|
const { corpUserId, corpId } = event;
|
||
|
|
try {
|
||
|
|
let res = await db
|
||
|
|
.collection("team")
|
||
|
|
.find({ memberList: corpUserId, corpId })
|
||
|
|
.toArray();
|
||
|
|
return {
|
||
|
|
success: true,
|
||
|
|
message: "获取成功",
|
||
|
|
data: res,
|
||
|
|
};
|
||
|
|
} catch (error) {
|
||
|
|
return {
|
||
|
|
success: false,
|
||
|
|
message: error,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
exports.getTeamByMainLeaderUserId = async (context) => {
|
||
|
|
const { userId, corpId } = context;
|
||
|
|
try {
|
||
|
|
let res = await db
|
||
|
|
.collection("team")
|
||
|
|
.find({ corpId, memberLeaderList: userId })
|
||
|
|
.toArray();
|
||
|
|
return {
|
||
|
|
success: true,
|
||
|
|
message: "获取成功",
|
||
|
|
data: res,
|
||
|
|
};
|
||
|
|
} catch (error) {
|
||
|
|
return {
|
||
|
|
success: false,
|
||
|
|
message: error,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
exports.getCorpTeams = async (context) => {
|
||
|
|
const { page, pageSize, corpId, name = "", userId = "" } = 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);
|
||
|
|
const teams = await teamDB
|
||
|
|
.find(query)
|
||
|
|
.skip((page - 1) * pageSize)
|
||
|
|
.limit(pageSize)
|
||
|
|
.toArray();
|
||
|
|
const handler = async (item) => {
|
||
|
|
let count = await db
|
||
|
|
.collection("member")
|
||
|
|
.countDocuments({ corpId, teamId: item.teamId });
|
||
|
|
item.customerCount = count;
|
||
|
|
return item;
|
||
|
|
};
|
||
|
|
let list = await utils.processInBatches(teams, handler, 10);
|
||
|
|
return {
|
||
|
|
success: true,
|
||
|
|
message: "获取成功",
|
||
|
|
list: list.map((i) => ({
|
||
|
|
...i,
|
||
|
|
memberList: Array.isArray(i.memberList) ? i.memberList : [],
|
||
|
|
})),
|
||
|
|
total: total,
|
||
|
|
pages: pages,
|
||
|
|
size: pageSize,
|
||
|
|
};
|
||
|
|
};
|
||
|
|
|
||
|
|
exports.getTeamById = async (context) => {
|
||
|
|
try {
|
||
|
|
const { id: teamId, teamIds = [] } = context;
|
||
|
|
if (!teamId && (!Array.isArray(teamIds) || teamIds.length === 0)) {
|
||
|
|
return { success: false, message: "团队id不能为空" };
|
||
|
|
}
|
||
|
|
const query = {};
|
||
|
|
if (teamId) query.teamId = teamId;
|
||
|
|
else {
|
||
|
|
query.teamId = { $in: teamIds };
|
||
|
|
}
|
||
|
|
const teamDB = db.collection("team");
|
||
|
|
const res = await teamDB.find(query).toArray();
|
||
|
|
const list = res.map((i) => ({
|
||
|
|
...i,
|
||
|
|
memberList: Array.isArray(i.memberList) ? i.memberList : [],
|
||
|
|
}));
|
||
|
|
return {
|
||
|
|
success: true,
|
||
|
|
message: "获取成功",
|
||
|
|
data: list,
|
||
|
|
};
|
||
|
|
} catch (error) {
|
||
|
|
return {
|
||
|
|
success: false,
|
||
|
|
message: error,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
exports.updateTeam = async (context) => {
|
||
|
|
try {
|
||
|
|
const { 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,
|
||
|
|
_id: common.generateRandomString(24),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
const { memberList } = context;
|
||
|
|
await addTeamIdtoMember(memberList, teamId);
|
||
|
|
return {
|
||
|
|
success: true,
|
||
|
|
message: isUpdate ? "团队信息更新成功" : "新增团队成功",
|
||
|
|
};
|
||
|
|
} catch (error) {
|
||
|
|
return {
|
||
|
|
success: false,
|
||
|
|
message: error,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
// 机构分组新建团队
|
||
|
|
async function addGroupToTeam(context) {
|
||
|
|
const { corpId, teamId } = context;
|
||
|
|
const corpGroupList = await db
|
||
|
|
.collection("group")
|
||
|
|
.find({ corpId, groupType: "corp" })
|
||
|
|
.toArray();
|
||
|
|
const groupList = corpGroupList.map((item) => item.groupId);
|
||
|
|
}
|
||
|
|
|
||
|
|
// 判断所加成员是否含有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: memberList } },
|
||
|
|
{ $set: { teamId } }
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
exports.getTeamLeaderNumByUserId = async (context) => {
|
||
|
|
const { 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 { corpId, params, teamId } = context;
|
||
|
|
const { addLeaders, removeLeaders, addTeamMember, removeTeamMember } = params;
|
||
|
|
try {
|
||
|
|
// 1.获取团队负责人角色id 和 团队成员角色id
|
||
|
|
const { memberRoleId, memberLeaderRoleId } = await getRolesId(corpId);
|
||
|
|
if (addLeaders.length > 0) {
|
||
|
|
for (let userid of addLeaders) {
|
||
|
|
await getTeamLeaderRoleIdByUserId(
|
||
|
|
userid,
|
||
|
|
teamId,
|
||
|
|
corpId,
|
||
|
|
"add",
|
||
|
|
memberLeaderRoleId
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (removeLeaders.length > 0) {
|
||
|
|
for (let userid of removeLeaders) {
|
||
|
|
await getTeamLeaderRoleIdByUserId(
|
||
|
|
userid,
|
||
|
|
teamId,
|
||
|
|
corpId,
|
||
|
|
"remove",
|
||
|
|
memberLeaderRoleId
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (addTeamMember.length > 0) {
|
||
|
|
for (let userid of addTeamMember) {
|
||
|
|
await getTeamMemberRoleIdByUserId(
|
||
|
|
userid,
|
||
|
|
teamId,
|
||
|
|
corpId,
|
||
|
|
"add",
|
||
|
|
memberRoleId
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (removeTeamMember.length > 0) {
|
||
|
|
for (let userid of removeTeamMember) {
|
||
|
|
await getTeamMemberRoleIdByUserId(
|
||
|
|
userid,
|
||
|
|
teamId,
|
||
|
|
corpId,
|
||
|
|
"remove",
|
||
|
|
memberRoleId
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return {
|
||
|
|
success: true,
|
||
|
|
message: "更新成功",
|
||
|
|
};
|
||
|
|
} catch (error) {
|
||
|
|
return {
|
||
|
|
success: false,
|
||
|
|
message: error,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
async function getTeamMemberRoleIdByUserId(
|
||
|
|
userId,
|
||
|
|
teamId,
|
||
|
|
corpId,
|
||
|
|
type,
|
||
|
|
memberRoleId
|
||
|
|
) {
|
||
|
|
// 除了 teamId 之外的其他团队 的数量
|
||
|
|
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(
|
||
|
|
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(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 { 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 { 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 project = fields.reduce(
|
||
|
|
(acc, val) => {
|
||
|
|
if (typeof val === "string" && val.trim()) {
|
||
|
|
acc[val] = 1;
|
||
|
|
}
|
||
|
|
return acc;
|
||
|
|
},
|
||
|
|
{ teamId: 1, _id: 0 }
|
||
|
|
);
|
||
|
|
// 获取角色信息
|
||
|
|
const res = await db
|
||
|
|
.collection("team")
|
||
|
|
.find(query)
|
||
|
|
.project(project)
|
||
|
|
.toArray();
|
||
|
|
return {
|
||
|
|
success: true,
|
||
|
|
message: "获取成功",
|
||
|
|
data: res,
|
||
|
|
};
|
||
|
|
} catch (error) {
|
||
|
|
return {
|
||
|
|
success: false,
|
||
|
|
message: error,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
};
|