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

413 lines
10 KiB
JavaScript

const dayjs = require("dayjs");
const utils = require("../utils");
const common = require("../../common");
const api = require("../../api");
let db = null;
let currentCorpId = null;
exports.main = async (content, DB) => {
db = DB;
currentCorpId = content.corpId;
switch (content.type) {
case "getCustomerType":
return await exports.getCustomerType(content);
case "getPannedEvent":
return await exports.getPannedEvent(content);
case "getPannedEventById":
return await exports.getPannedEventById(content);
case "createPannedEvent":
return await exports.createPannedEvent(content);
case "updatePannedEvent":
return await exports.updatePannedEvent(content);
case "removePannedEvent":
return await exports.removePannedEvent(content);
case "getPannedEventResult":
return await exports.getPannedEventResult(content);
case "planEventCreateTodoEvent":
return await planEventCreateTodoEvent(content);
}
};
let MAX_LIMIT = 100;
// 获取客户类型
exports.getCustomerType = async (content) => {
try {
let res = await db.collection("customer-type").find().toArray();
return {
success: true,
message: "获取成功",
data: res,
};
} catch (error) {
return {
success: false,
message: "获取失败",
};
}
};
// 获取团队列表
async function getTeamList(executorUserId, corpId) {
const result = await api.getCorpApi({
type: "getTeamBymember",
corpUserId: executorUserId,
corpId,
});
if (result && Array.isArray(result.data) && result.data.length > 0)
return result.data.map((item) => item.teamId);
else return [];
}
// 获取计划事件
exports.getPannedEvent = async (content) => {
const { params, teamId } = content;
const { corpId, userId, ...rest } = params;
let query = {
corpId,
...rest,
};
if (!teamId) {
const teamIds = await getTeamList(userId, corpId);
query["teamId"] = { $in: teamIds };
} else {
query["teamId"] = teamId;
}
try {
let data = await db
.collection("panned-event")
.find(query)
.sort({ createTime: -1 })
.toArray();
return {
success: true,
message: "获取成功",
data,
};
} catch (error) {
return {
success: false,
message: "获取失败",
};
}
};
// 根据ID获取计划事件
exports.getPannedEventById = async (content) => {
const { id } = content;
try {
let data = await db.collection("panned-event").findOne({ _id: id });
return {
success: true,
message: "获取成功",
data,
};
} catch (error) {
return {
success: false,
message: "获取失败",
};
}
};
// 创建计划事件
exports.createPannedEvent = async (content) => {
const { params } = content;
const {
corpId,
pannedEventName,
memberIds,
planTime,
pannedSendContent,
pannedCreateMember,
customerType,
executionSatus,
teamId,
teamName,
tagsName,
taskContent,
tagIds,
excludeTagIds,
excludeTagsName,
pannedEventSendFile,
taskPurpose,
} = params;
let item = {
_id: common.generateRandomString(24),
corpId,
pannedEventName,
memberIds,
pannedSendContent,
pannedEventSendFile,
pannedCreateMember,
customerType,
executionSatus,
teamId,
teamName,
tagsName,
planTime,
taskContent,
tagIds,
excludeTagIds,
excludeTagsName,
customersTotal: 0,
taskPurpose,
createTime: new Date().getTime(),
};
try {
let res = await db.collection("panned-event").insertOne(item);
return {
success: true,
message: "添加成功",
data: res,
};
} catch (error) {
return {
success: false,
message: "添加失败",
};
}
};
// 更新计划事件
exports.updatePannedEvent = async (content) => {
const { params, id } = content;
params["updateTime"] = new Date().getTime();
try {
let res = await db
.collection("panned-event")
.updateOne({ _id: id }, { $set: params });
return {
success: true,
message: "更新成功",
data: res,
};
} catch (error) {
return {
success: false,
message: "更新失败",
};
}
};
// 删除计划事件
exports.removePannedEvent = async (content) => {
const { id } = content;
try {
await db.collection("panned-event").deleteOne({ _id: id });
return {
success: true,
message: "删除成功",
};
} catch (error) {
return {
success: false,
message: "删除失败",
};
}
};
// 获取计划事件结果
exports.getPannedEventResult = async (content) => {
try {
const { params, corpId } = content;
const item = await db.collection("panned-event").findOne(params);
const customCount = await getOnInhopsitlAllMember(item);
let toDoEvents = await getTodoEventsByPannedEventId(item._id, corpId);
const distributedTaskCount = toDoEvents.length;
const executedTaskCount = toDoEvents.filter(
(item) => item.eventStatus === "treated"
).length;
const feedbackTaskCount = toDoEvents.filter(
(item) => item["isFeedback"]
).length;
return {
success: true,
message: "获取成功",
data: {
toDoEvents,
customCount,
distributedTaskCount,
executedTaskCount,
feedbackTaskCount,
},
};
} catch (error) {
return {
success: false,
message: "获取失败",
};
}
};
// 获取未到院客户数
async function getOnInhopsitlAllMember(item) {
const { planTime, corpId, tagIds, teamId } = item;
const { startTime, endTime } = getStartAndEndTime(planTime);
const query = {
createTime: { $gte: startTime, $lte: endTime },
tagIds: { $in: tagIds },
corpId,
teamId,
isRecord: { $ne: true },
};
let allData = [];
let skip = 0;
let total = await db.collection("member").countDocuments(query);
do {
const res = await db
.collection("member")
.find(query)
.skip(skip)
.limit(MAX_LIMIT)
.toArray();
allData = allData.concat(res);
skip += MAX_LIMIT;
} while (allData.length < total);
return allData.length;
}
// 获取开始和结束时间
function getStartAndEndTime(day) {
const laterTime = dayjs().subtract(Number(day), "day");
const startTime = laterTime.startOf("day").valueOf();
const endTime = laterTime.endOf("day").valueOf();
return {
startTime,
endTime,
};
}
// 根据计划事件ID获取待办事件
async function getTodoEventsByPannedEventId(id, corpId) {
let allData = [];
let page = 1;
let result = await api.getTodoApi({
type: "getTodoEventsByPannedEventId",
pannedEventId: id,
corpId,
page,
pageSize: MAX_LIMIT,
});
allData = result.data;
do {
page++;
let { result } = await api.getTodoApi({
type: "getTodoEventsByPannedEventId",
pannedEventId: id,
corpId,
page,
pageSize: MAX_LIMIT,
});
allData = allData.concat(result.data);
} while (allData.length < result.total);
return allData;
}
// 计划事项创建待办事项
async function planEventCreateTodoEvent({ corpId }) {
let query = {
executionSatus: true,
};
if (corpId) query["corpId"] = corpId;
const fetchData = async (page, pageSize, db) => {
let data = await db
.collection("panned-event")
.find(query)
.skip((page - 1) * pageSize)
.limit(pageSize)
.toArray();
return data;
};
let list = await utils.getAllData(fetchData, db);
console.log(" 获取到所有计划事项", list);
for (let params of list) {
let customers = await matchCustomer(params);
console.log(" 获取到所有客户", customers);
let arr = customers.map((item) => {
const { _id, name, externalUserId } = item;
params["pannedEventId"] = params._id;
params["customerId"] = _id;
params["customerName"] = name;
params["externalUserId"] = externalUserId;
params["executorUserId"] = "";
if (
item.personResponsibles &&
Array.isArray(item.personResponsibles) &&
item.personResponsibles.length > 0
) {
let obj = item.personResponsibles.find(
(item) => item.teamId === params.teamId
);
if (obj) params["executorUserId"] = obj.corpUserId;
}
return createEvents(params);
});
for (let i = 0; i < arr.length; i += 10) {
const promiseArr = arr.slice(i, i + 10);
await Promise.all(promiseArr);
}
}
return {
success: true,
message: "创建成功",
};
}
// 创建事件
async function createEvents(params) {
console.log("获取到所有客户待办的", params);
let res = await api.getTodoApi({
type: "createEvents",
params,
corpId: currentCorpId,
});
console.log(res);
}
// 匹配客户
async function matchCustomer(item) {
console.log(`开始匹配客户`, item);
const { planTime, corpId, tagIds, teamId, excludeTagIds, customerType } =
item;
const { startTime, endTime } = getStartAndEndTime(planTime);
const params = {
createTime: { $gte: startTime, $lte: endTime },
corpId,
teamId,
customerStage: customerType,
};
let tagIdsArr = [];
if (Array.isArray(tagIds) && tagIds.length > 0) {
tagIdsArr = [{ tagIds: { $all: tagIds } }];
} else if (Array.isArray(excludeTagIds) && excludeTagIds.length > 0) {
tagIdsArr = [{ tagIds: { $nin: excludeTagIds } }];
} else if (tagIds.length > 0 && excludeTagIds.length > 0) {
tagIdsArr = [
{ tagIds: { $all: tagIds } },
{ tagIds: { $nin: excludeTagIds } },
];
}
const fetchData = async (page, pageSize, db) => {
let data = await db
.collection("member")
.find({ $and: [...tagIdsArr, params] })
.skip((page - 1) * pageSize)
.limit(pageSize)
.toArray();
return data;
};
let members = await utils.getAllData(fetchData, db);
if (members.length > 0) await updateCustomersTotal(item, members.length);
return members;
}
// 更新客户总数
async function updateCustomersTotal(item, num) {
let { _id, customersTotal } = item;
customersTotal += num;
await db
.collection("panned-event")
.updateOne({ _id }, { $set: { customersTotal } });
}